【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__"'
);
形式が一定であれば、本文を手作りしてもさほど辛くはないですが、汎用的な添付ファイル付きメール送信処理にしたい場合は、やっぱり出来合いのライブラリを使うと楽だと思います。