Fatal Error: Unexpected BLOG

主に自分用の備忘録として

【PHP】mb_send_mailで添付ファイル付きメールを送信する

普通は添付ファイル付ける場合はmail()関数で実装するようですが、私のように「エンコーディングが面倒だ!」という場合は、mb_send_mail()でも添付ファイル付きのメールを作成・送信できます。
で、私自身忘れるのでメモ。

以下のサイトを参考にさせて頂きました。

基本的にはmail()の時と同様、ヘッダに"multipart/mixed"とboundaryを設定して、本分に各パート(メッセージ部分と添付ファイル部分)を流し込むという流れです。

突貫で、とあるクラスにメソッドとして実装しました。
複数ファイルの添付には対応していないゴミメソッドです。

    /**
     * send a mail as utf-8 encoding and attach a specified file.
     * using mb_send_mail().
     * @param  string $to               destination address
     * @param  string $subject          mail subject
     * @param  string $plain_message    plain text
     * @param  string $attachment       full path to attaching file
     * @param  string $attach_mime_type MIME type string (like 'text/xml')
     * @param  string $from             from address
     * @return boolean
     */
    public static function send_attached_mail($to, $subject, $plain_message, $from, $attachment = null, $attach_mime_type = null) {
        if ($attachment === null) {
            //添付が無ければ添付なしで送信
            //ここでは書いてませんが、send_mail()という、ただ単にメールを送信するだけのメソッドを実装しています。
            Self::send_mail($to, $subject, $plain_message, $from);
        } else {
            if (!file_exists($attachment)) return false;

            //必要に応じて適宜文字コードを設定してください。
            mb_language('Ja');
            mb_internal_encoding('UTF-8');

            $boundary = '__BOUNDARY__'.md5(rand());
                        
            $headers = "Content-Type: multipart/mixed;boundary=\"{$boundary}\"\n";
            $headers .= "From: {$from}";

            $body = "--{$boundary}\n";
            $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
            $body .= "\n{$plain_message}\n";

            $filebase = basename($attachment);
            $body .= "--{$boundary}\n";
            $body .= "Content-Type: {$attach_mime_type}; name=\"{$filebase}\"\n";
            $body .= "Content-Disposition: attachment; filename=\"{$filebase}\"\n";
            $body .= "Content-Transfer-Encoding: base64\n";
            $body .= "\n";
            $body .= chunk_split(base64_encode(file_get_contents($attachment)))."\n";

            $body .= "--{$boundary}--";

            $ret = mb_send_mail($to, $subject, $body, $headers);

            return $ret;
        }
    }

上記のように、mb_encode_mimeheader()などは必要ありません。
ただし、添付するファイルの内容はbase64エンコードする必要があります。

あー、ラクチン。