【php】mail関数で添付ファイル付きメールを送信する
問題
phpで添付ファイル付きのメールを送りたいです。
答え
様々なメール送信用のライブラリが存在しますが、mail関数でも送信可能です。
一度添付ファイル付きのメールのソースを見てみるとよいのですが、それとほぼ同じものを作って、mail関数に渡す感じです。
メールの仕様に少し慣れれば、特に違和感などないと思います。
<?php mail( 'example@example.jp', 'test mail subject', '--__BOUNDARYBOUNDARYBOUNDARY__ Content-Type: text/plain testtest testtest testtest --__BOUNDARYBOUNDARYBOUNDARY__ Content-Type: application/octet-stream; name="fax.pdf" Content-Disposition: attachment; filename="fax.pdf" Content-Transfer-Encoding: base64 ' . chunk_split(base64_encode(file_get_contents('fax.pdf'))) . ' --__BOUNDARYBOUNDARYBOUNDARY__--', 'Content-Type: multipart/mixed;boundary="__BOUNDARYBOUNDARYBOUNDARY__"' );
添付ファイルをつけるということは、本文と添付ファイル(複数)という複数のものを1つのメールに含めるということで、やり方としては、区切り文字で区切って(上では「__BOUNDARYBOUNDARYBOUNDARY__」)複数の部分を並べていく形になります。
第4引数で、「複数パートのあるメールで、区切り文字は__BOUNDARYBOUNDARYBOUNDARY__ですよ」というヘッダを付与していて、本文がそのようになっているということです。
添付ファイルは、内容をBase64エンコードして含めればOKです。
上の例では、本文をべたっと書いているので、ファイルを保存するときの改行コードに注意です。LFで保存してください。
日本語を使うと、以下のような感じになります。
<?php $to = 'example@example.jp'; $subject = '件名'; $filename = 'fax.pdf'; $filepath = 'fax.pdf'; $message = '本文本文本文本文本文本文本文本文本文本文 本文本文本文本文本文本文本文本文本文本文 本文本文本文本文本文本文本文本文本文本文 本文本文本文本文本文本文本文本文本文本文'; //ソースがUTF-8ならば mb_internal_encoding('UTF-8'); mail( $to, mb_encode_mimeheader($subject, 'iso-2022-jp'), '--__BOUNDARY__ Content-Type: text/plain; charset="iso-2022-jp" ' . mb_convert_encoding($message, 'iso-2022-jp', 'UTF-8') . ' --__BOUNDARY__ Content-Type: application/octet-stream; name="' . $filename . '" Content-Disposition: attachment; filename="' . $filename . '" Content-Transfer-Encoding: base64 ' . chunk_split(base64_encode(file_get_contents($filepath))) . ' --__BOUNDARY__--', 'Content-Type: multipart/mixed; boundary="__BOUNDARY__"' );
形式が一定であれば、本文を手作りしてもさほど辛くはないですが、汎用的な添付ファイル付きメール送信処理にしたい場合は、やっぱり出来合いのライブラリを使うと楽だと思います。
コメント