当ブログのおすすめ記事はこちら!
  • 【学生でもできる】エンジニアとして海外ノマドワークをする方法と実際に感じたこと

【PHP】mb_send_mail関数で添付ファイル付きのメールを送る

SHARE

【PHP】mb_send_mail関数で添付ファイル付きのメールを送る



こんにちはTakumi(@ynwa_ynwa_0826)です。
サーバに保存してあるファイルを添付した状態でメール送信しないといけない状況になったときのメモです。
ネット上にすでに情報は落ちているんですが、いろいろとコードの解説がすっ飛ばされていたりいしたのでそこらへんを重要視して書いていきます。

  1. mb_send_mail関数について
  2. 方針とコード

mb_send_mail関数について

mail関数でよくね?って思うかもですが、mail関数はencodeされないので日本語が文字化けしてしまいます。日本語を入れるのであれば避けましょう。

mb_language("Japanese");
mb_internal_encoding("UTF-8");

これでUTF-8に対応、日本語問題なしです。

公式ドキュメントはこちら

参考

mb_send_mailPHPマニュアル

第一引数にto
第二引数に件名
第三引数に本文
第四引数にヘッダー(fromとかCCの設定)
をセットできるようです。
これだと添付ファイルの設定ができない。。。
ではどうするのか

方針とコード

結論からいうとbodyにつけます。
しかし、本文とは区別する必要があるので区別を行います($boundaryの部分ですね)
画像はbase64エンコーディングを行ってください
データをメールで送信する際にはbase64が必要です。画像データを64進数で表現することができます。これのための規格をMIMEといいますね。mime typeの指定も必要になってきます。
またcontentstypeとして送信するファイルの規格を宣言しておく必要があります。pngならpngって。

 

最後にchunk_split関数を使用して文字列を一定の長さで改行するようにしなければいけません。

chunk_split(base64_encode($data))

これで76文字ごとに改行をしてくれるようになるそうです。

以下がコードになります。活用してみてください〜〜


        mb_language("japanese");
        mb_internal_encoding("UTF-8");
        $dir = "/ファイルが存在している階層までの絶対パス/";
        $filename    = $dir.$imagename;

        $header  = "From: 送信元メールアドレス\r\n";
        $header .= "MIME-Version: 1.0\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=\"__PHPRECIPE__\"\r\n";
        $header .= "\r\n";
    //本文をbodyに書く
        $body  = "--__PHPRECIPE__\r\n";
        $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\r\n";
        $body .= "\r\n";
        $body .= "メール本文";
        $body .= "--__PHPRECIPE__\r\n";

        // 添付ファイルの処理 (注意:content typeで拡張子を指定する!!)
        $handle = fopen($filename, 'r');
        $attachFile = fread($handle, filesize($filename));
        fclose($handle);
        $attachEncode = base64_encode($attachFile);
    //添付ファイルをbodyに追記
        $body .= "Content-Type: image/png; name=\"$imagename\"\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n";
        $body .= "Content-Disposition: attachment; filename=\"$imagename\"\r\n";
        $body .= "\r\n";
        $body .= chunk_split($attachEncode) . "\r\n";
        $body .= "--__PHPRECIPE__--\r\n";

        $sendSubJect = "メールタイトル";
        $to ="送信先メールアドレス";
        //メール送信
        mb_send_mail($to,$sendSubJect,$body,$header);
    }


スポンサードリンク


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です