最終更新日:
公開日:
レシピ
メール送信
メールにファイルを添付して送信する
テキストのメールにPDFファイルや画像ファイルを添付して送信する方法について、mb_send_mail関数を使って解説します。
この記事のポイント
- PHPでファイルを添付してメールを送信する
- 様々な形式のファイルを添付する
- 日本語のファイル名がついたファイルを添付する
目次
便利なメールへのファイル添付
システムからメールを送信するときに、テキストのメッセージのみでなくPDFや画像などのファイルを添付したいことがあります。
そこで今回はメールにファイルを添付する方法を解説していきます。
mb_send_mail関数の基本的な使い方は「日本語のメールを文字化けしないように送信する:mb_send_mail関数」をご覧ください。
コードの解説
次のようなコードになります。
他の場所でも使いやすいように関数の形式にしています。
コード例
<?php
//
// 次のような値が入っていることを想定
// $to = 'メールを受け取る人のメールアドレス';
// $subject = 'メールへのファイル添付テスト';
// $text = '本メールはファイル添付のテスト用メールです。';
// $file = 'テスト.pdf';
//
function sendMail( $to=null, $subject=null, $text=null, $file=null){
//初期化
$res = false;
//日本語の使用宣言
mb_language("ja");
mb_internal_encoding("UTF-8");
if( $to === null || $subject === null || $text === null ) {
return false;
}
// 送信元の設定
$sender_email = 'noreply@gray-code.com';
$org = 'GRAYCODE';
$from = 'GRAYCODE <noreply@gray-code.com>';
// ヘッダー設定
$header = '';
$header .= "Content-Type: multipart/mixed;boundary=\"__BOUNDARY__\"\n";
$header .= "Return-Path: " . $sender_email . " \n";
$header .= "From: " . $from ." \n";
$header .= "Sender: " . $from ." \n";
$header .= "Reply-To: " . $sender_email . " \n";
$header .= "Organization: " . $org . " \n";
$header .= "X-Sender: " . $org . " \n";
$header .= "X-Priority: 3 \n";
// テキストメッセージを記述
$body = "--__BOUNDARY__\n";
$body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
$body .= $text . "\n";
$body .= "--__BOUNDARY__\n";
// ファイルを添付
$body .= "Content-Type: application/octet-stream; name=\"{$file}\"\n";
$body .= "Content-Disposition: attachment; filename=\"{$file}\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "\n";
$body .= chunk_split(base64_encode(file_get_contents("temp/".$file)));
$body .= "--__BOUNDARY__--";
//メール送信
$res = mb_send_mail( $to, $subject, $body, $header);
return $res;
}
実行結果
上記のsendMail関数を実行すると、実際に次のような添付ファイル付きのメールが届きます。
ヘッダーの設定部分については、別記事「送ったメールがスパム判定(迷惑メール)されないためのヘッダー設定」と同じ形で設定を行なっています。
送信元に関する情報を詳しく記載し、スパムメールとして判定されないようにしています。
今回、肝心な部分は「// テキストメッセージを記述」と「// ファイルを添付」の部分です。
メール本文となるテキストメッセージと添付ファイルは、実は1つの$body変数にいれます。
そのため、添付ファイルも本文の一部として送信することになります。
しかし中身を見てみると、「–__BOUNDARY__」で区切っていることが分かります。
区切り、「本文」と「添付ファイル」にそれぞれ異なる「Content-Type」を指定することで、この2つを同時に送ることができるという仕組みです。
本文は通常のテキストが入るため「Content-Type: text/plain;」を指定しています。
添付ファイルはこれよりも少し複雑になり、「Content-Type: application/octet-stream;」という指定に加え、添付ファイルであることを示す「Content-Disposition」と、エンコード方式を指定する「Content-Transfer-Encoding」を記述しています。
添付ファイル自体は、次の1行でメール送信できるようにテキスト形式へ変換を行なっています。
コード例
$body .= chunk_split(base64_encode(file_get_contents("temp/".$file)));
まずはfile_get_contents関数で添付するファイルを参照し、続いてbase64_encode関数でエンコードをします。
最後に、chunk_split関数で適度なサイズへ分割して準備完了です。
一気に送ると膨大なテキストデータになってしまいますが、この関数で分割することでメール送信できるテキストサイズに区切ることができます。
ここまで出来たら、最後にmb_send_mail関数で送信して完了です。