PHP

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

  1. 最終更新日:
  2. 公開日:

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

この記事のポイント

  • メールのコンテンツを添付したいファイルの数だけ「--__BOUNDARY__」で区切って指定する
  • メールに複数のファイルを添付する

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

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

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

コードの解説

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

例えば、添付ファイルが3つの場合は次のようなコードで送ることができます。

PHP コード例

<?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つと増やしていくだけで実装可能ですが、サーバー上の送信できるファイルサイズ(容量)以上のファイルは送信できないため設定に注意してください。

記事一覧