SOFTELメモ

</> 技術者募集

【php】mail関数で添付ファイル付きメールを送信する

問題

phpで添付ファイル付きのメールを送りたいです。

php-logo

答え

様々なメール送信用のライブラリが存在しますが、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__"'
);

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

関連するメモ

コメント