phpのmailコマンドを使って添付ファイル(700kbくらいのPDF)を送付しています。
先日送付したPDFが破損したと連絡を受けて、その添付ファイルを見てみたのですが、ファイルサイズはそのままで中身がゼロパディングされていました。結果としてメールに添付したファイルが破損している状態となっています。
- 送信は3箇所に3回に分けて同一ファイルをmailコマンドで添付ファイルとして送出してます。送受信自体は3箇所とも成功しています。
- うち一箇所では添付ファイルが正しく受信できています。
- 残り2箇所では添付ファイルが破損しています。そこも以前は正しく受信できていました。
- データやプログラムの変更はありません。
- ファイルが破損した2箇所は同じメールサーバを使っておりますが、サーバ運営会社に問い合わせましたところ問題ないと言われています。
- 添付ファイルが破損した2箇所にhttpで同一ファイルを受信してもらったところ正しく表示されました。
- 添付ファイルはbase64でエンコードしています。
以上の事からファイル自体は正しく、メール送出時からメーラーで受信した間に破損したと思われます。
しかしながら何が原因なのか推定が手詰まりになっています。添付データが破損する状況というのは、どのような原因が考えられますでしょうか。また推定するための方法などありますでしょうか。知見のある方がおりましたら、お教え願います。
よろしくお願い申し上げます。
すみません。返信に書いてしまいました。
送信部分のソースです。
//$subject:件名 //$message:メール本文 //$files:array(添付ファイル) function sendmailFile($to,$from,$subject,$message,$files) { //マイムタイプ定義 $mime_content_types = array( 'pdf' => 'application/pdf', ); //件名・本文をエンコード $subject = mb_convert_encoding($subject, 'JIS', 'UTF-8'); $message = mb_convert_encoding($message, 'JIS', 'UTF-8'); $subject = '=?iso-2022-jp?B?' . base64_encode($subject) . '?='; //バウンダリ文字列を定義 if (empty($files)) { $boundary = null; }else{ $boundary = md5(uniqid(rand(), true)); } //メールボディを定義 if (empty($files)) { $body = $message; }else{ $body = "--$boundary\n"; $body .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; $body .= "Content-Transfer-Encoding: 7bit\n"; $body .= "\n"; $body .= "$message\n"; foreach($files as $file) { if (!file_exists($file)) { continue; } $info = pathinfo($file); $content = $mime_content_types[$info['extension']]; $filename = basename($file); $body .= "\n"; $body .= "--$boundary\n"; $body .= "Content-Type: $content; name=\"$filename\"\n"; $body .= "Content-Disposition: attachment; filename=\"$filename\"\n"; $body .= "Content-Transfer-Encoding: base64\n"; $body .= "\n"; $body .= chunk_split(base64_encode(file_get_contents($file))) . "\n"; } $body .= '--' . $boundary . '--'; } //メールヘッダを定義 $header = "X-Mailer: PHP5\n"; $header .= "From: $from\n"; $header .= "MIME-Version: 1.0\n"; if (empty($files)) { $header .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; }else{ $header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n"; } $header .= "Content-Transfer-Encoding: 7bit"; //メール送信 $flg = mail($to, $subject, $body, $header); error_log("sendmailFile TO:{$to} SUB:{$subject} RES:{$flg} DATE=".DATE("Y/m/d H:i:s")."\n", 3, '/var/www/html/egogram/maillog'); }

回答1件
あなたの回答
tips
プレビュー