WEB/システム/IT技術ブログ

PHPの関数「mail()」で添付ファイルありのメールを送信する

PHPの関数「mail()」で添付ファイル付きのメールを送信する方法です。

今回、日本語対応を前提に、ラッパー関数である「mb_send_mail」を使います。

添付なしメールを送る場合

通常、添付なしでメッセージのみのメールを送る場合は、以下のように記述します。

$to = "【送信先メールアドレス】";
$subject = "【メールタイトル】";
$message = "【メール本文】";
$additional_headers = "【オプションでメールヘッダに文字列追加】";
mb_send_mail($to, $subject, $message, $additional_headers);

$additional_headersには、送信元メールアドレスなどをセットします。

$header = "From:【送信元メールアドレス】\n";

これにプログラム上で任意のファイルを添付するためには、$message部分と$additional_headers部分に以下のようなフォーマットで追記します。

添付ありメールを送る場合

添付ありでメッセージを送る場合は、ヘッダ情報$additional_headersに以下を追加します。
boundaryには任意で区切り文字列を指定します。ここでは、例えば「__BOUNDARY__」をセットします。

Content-Type: multipart/mixed;boundary="__BOUNDARY__"
From: 【送信元メールアドレス】

$message部分には、boundaryを区切りにメッセージと添付ファイル情報を記述します。

--__BOUNDARY__
Content-Type: text/plain; charset="ISO-2022-JP"
【メール本文】
--__BOUNDARY__
Content-Type: 【ファイルタイプ】; name="【ファイル名】"
Content-Disposition: attachment; filename="【ファイル名】"
Content-Transfer-Encoding: base64

【ファイルをMIME base64方式でエンコードした文字列】

--__BOUNDARY__--

以下のようにファイル部分を繰り返すことで、複数ファイルを添付できます。

--__BOUNDARY__
Content-Type: text/plain; charset="ISO-2022-JP"
【メール本文】
--__BOUNDARY__
Content-Type: 【ファイル1タイプ】; name="【ファイル1名】"
Content-Disposition: attachment; filename="【ファイル1名】"
Content-Transfer-Encoding: base64

【ファイル1をMIME base64方式でエンコードした文字列】

--__BOUNDARY__
Content-Type: 【ファイル2タイプ】; name="【ファイル2名】"
Content-Disposition: attachment; filename="【ファイル2名】"
Content-Transfer-Encoding: base64

【ファイル2をMIME base64方式でエンコードした文字列】

--__BOUNDARY__
Content-Type: 【ファイル3タイプ】; name="【ファイル3名】"
Content-Disposition: attachment; filename="【ファイル3名】"
Content-Transfer-Encoding: base64

【ファイル3をMIME base64方式でエンコードした文字列】

--__BOUNDARY__--

添付ファイルありメールのPHPコード

実際に、ファイルを添付してメールを送信するPHPコードをまとめると、以下のようになります。

$filepath = "【添付するファイルのパス】";
$boundary = "__BOUNDARY__";

$additional_headers = "Content-Type: multipart/mixed;boundary=\"" . $boundary . "\"\n";
$additional_headers .= "From: 【送信元メールアドレス】";

$message = "--" . $boundary . "\n";

$message .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
$message .= "【メール本文】\n";

$message .= "--" . $boundary . "\n";

$message .= "Content-Type: " . mime_content_type($filetype) . "; name=\"" . basename($filepath) . "\"\n";
$message .= "Content-Disposition: attachment; filename=\"" . basename($filepath) . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "\n";
$message .= chunk_split(base64_encode(file_get_contents($filepath)))."\n";

$message .= "--" . $boundary . "--";

mb_send_mail($to, $subject, $message, $additional_headers);
B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives