PHPプログラミング

最終更新日:
公開日:

レシピ

メール送信

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

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

この記事のポイント

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

目次

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

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

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

コードの解説

実は仕組みは非常に単純で、添付したいファイルの数だけ「–__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 <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";

	// ファイル添付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;
}

実行結果

3つの添付ファイルが付いたメールを受信すると、次のような形で届きます(Gメールでの表示例)。

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

3つ以上のファイルを添付したい場合についても、上記の処理を4つ、5つと増やしていくだけで実装可能ですが、サーバー上の送信できるファイルサイズ(容量)の設定に注意してください。