PHP

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

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

テキストのメールにPDFファイルや画像ファイルを添付して送信する方法について、mb_send_mail関数を使って解説します。

この記事のポイント

  • mb_send_mail関数に適切なContent-Typeを指定する
  • メールのコンテンツを「--__BOUNDARY__」で区切って添付ファイルを送信する

便利なメールへのファイル添付

システムからメールを送信するときに、テキストのメッセージのみでなくPDFや画像などのファイルを添付したいことがあります。
そこで今回はメールにファイルを添付する方法を解説していきます。

mb_send_mail関数の基本的な使い方は「日本語のメールを文字化けしないように送信する:mb_send_mail関数」をご覧ください。

コードの解説

次のようなコードになります。
他の場所でも使いやすいように関数の形式にしています。

PHP コード例

<?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行でメール送信できるようにテキスト形式へ変換を行なっています。

PHP コード例

$body .= chunk_split(base64_encode(file_get_contents("temp/".$file)));

まずはfile_get_contents関数で添付するファイルを参照し、続いてbase64_encode関数でエンコードをします。
最後に、chunk_split関数で適度なサイズへ分割して準備完了です。
一気に送ると膨大なテキストデータになってしまいますが、この関数で分割することでメール送信できるテキストサイズに区切ることができます。

ここまで出来たら、最後にmb_send_mail関数で送信して完了です。

記事一覧