質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

Q&A

解決済

1回答

4826閲覧

mailコマンドで添付ファイル破損。原因不明です。

pochi0701

総合スコア210

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Postfix

Postfixは、電子メールサーバソフトウェアで、 メールを配送するシステムMTAの一種です。

0グッド

0クリップ

投稿2016/02/24 07:00

編集2016/02/24 07:19

phpのmailコマンドを使って添付ファイル(700kbくらいのPDF)を送付しています。
先日送付したPDFが破損したと連絡を受けて、その添付ファイルを見てみたのですが、ファイルサイズはそのままで中身がゼロパディングされていました。結果としてメールに添付したファイルが破損している状態となっています。

  1. 送信は3箇所に3回に分けて同一ファイルをmailコマンドで添付ファイルとして送出してます。送受信自体は3箇所とも成功しています。
  2. うち一箇所では添付ファイルが正しく受信できています。
  3. 残り2箇所では添付ファイルが破損しています。そこも以前は正しく受信できていました。
  4. データやプログラムの変更はありません。
  5. ファイルが破損した2箇所は同じメールサーバを使っておりますが、サーバ運営会社に問い合わせましたところ問題ないと言われています。
  6. 添付ファイルが破損した2箇所にhttpで同一ファイルを受信してもらったところ正しく表示されました。
  7. 添付ファイルは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'); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogaaaan

2016/02/24 07:07

おそらく皆さんは送信する部分のソースコード見たいと思います。
pochi0701

2016/02/24 07:12

そうですね。ソースを添付します。 ``` //$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'); } ```
ogaaaan

2016/02/24 07:18

わはは!!ここじゃなくて本文にマークダウン方式で書こうZE!! マークダウン方式ってのはね、ソースコードを```と```でくくれば良いよ。改行挟んでね。えっと、このソースコードはphpだから、『```php』+『改行』+『ソースコード』+『改行』+ 『```』で囲ってみてくださんす。
ogaaaan

2016/02/24 07:21

やった!見やすくなった!ありがとう!!
pochi0701

2016/02/24 07:26

すみません。常識なかったです。よろしくお願いします。
ogaaaan

2016/02/24 07:54

誰もが通る道なので大丈夫ですwww
guest

回答1

0

ベストアンサー

なんだか問題なさそうですね。
とりあえずmail()ではなくmb_send_mail()のほうがよいかな。

そのほかは、
もしかしたら失敗するサーバ側で容量制限とかしてるんじゃないかなぁ。
zip化して送るとか検討してみてもよいかもしれないですね。

投稿2016/02/24 07:25

ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pochi0701

2016/02/24 07:32

サーバ側の何かの制限は可能性ありそうですね。問い合わせてみます。 mb_send_mailやzip化も検討してみます。 ありがとうございます。
ogaaaan

2016/02/24 07:57

了解です! 結果がわかったら是非、コメントお願いしますねー!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問