PHPプログラミング

最終更新日:
公開日:

レシピ

メール送信

メールにファイルを添付して送信する

テキストのメールに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関数で送信して完了です。