PHPプログラミング

ベストプラクティス

メール送信

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

  • このエントリーをはてなブックマークに追加

メールに2つ以上のファイルを添付して送信する方法をmb_send_mail関数を使って解説します。

目次

  1. #  複数のファイルを添付する
  2. #  コードの解説

複数のファイルを添付する

システムからメールを送信するときに、案内や請求書などの複数のファイルを添付して送信するケースがあります。
今回は次のような方を対象に解説をしていきます。

  • ファイルを添付してメールを送信したい。
  • 2つ以上のファイルを添付したい。

添付ファイルの基本的な方法については、別記事「メールにファイルを添付して送信する」で解説している方法をそのまま使います。

コードの解説

実は仕組みは非常に単純で、添付したいファイルの数だけ「–__BOUNDARY__」で区切ってファイルを指定していくだけ。

例えば、添付ファイルが3つの場合は次のようなコードになります。

コード例

<?php

//
// 次のような値が入っていることを想定
// $to = 'メールを受け取る人のメールアドレス';
// $subject = 'メールへのファイル添付テスト';
// $text = '本メールはファイル添付のテスト用メールです。';
// $file = 'テスト.pdf';
// $file = 'テスト2.jpg';
// $file = 'テスト3.xlsx';
//
function sendMail( $to=null, $subject=null, $text=null, $file=null, $file2=null, $file3=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 ';

	// ヘッダー設定
	$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";

	// ファイル添付1
	if( !empty($file) ) {
		$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__\n";
	}

	// ファイル添付2
	if( !empty($file2) ) {
		$body .= "Content-Type: application/octet-stream; name=\"{$file2}\"\n";
		$body .= "Content-Disposition: attachment; filename=\"{$file2}\"\n";
		$body .= "Content-Transfer-Encoding: base64\n";
		$body .= "\n";
		$body .= chunk_split(base64_encode(file_get_contents("temp/".$file2)));
		$body .= "--__BOUNDARY__\n";
	}

	// ファイル添付3
	if( !empty($file3) ) {
		$body .= "Content-Type: application/octet-stream; name=\"{$file3}\"\n";
		$body .= "Content-Disposition: attachment; filename=\"{$file3}\"\n";
		$body .= "Content-Transfer-Encoding: base64\n";
		$body .= "\n";
		$body .= chunk_split(base64_encode(file_get_contents("temp/".$file3)));
		$body .= "--__BOUNDARY__\n";
	}

	//メール送信
	$res = mb_send_mail( $to, $subject, $body, $header);

	return $res;
}

実行結果

送信されたメールを受信すると、次のように添付ファイル付きで届きました。

受信したメールの表示例

上記のsendMail関数ではファイル名が渡されたらfile_get_contents関数でファイルを取得し、添付する処理を実行しています。(最大3ファイルまで)

3つ以上のファイルを添付したい場合も単純に上記の処理を増やしていくだけで理論上は可能ですが、その際は送信できるファイルサイズ(容量)の設定に注意してください。

  • このエントリーをはてなブックマークに追加