PHP でメールを送る関数です。
日本語対応で、添付ファイルも送信できます。
準備
マルチバイト文字列関数の mb_language関数を使用します。
Redgat系(CentOS/RockyLinux/AlmaLinux) では、yum install php-mbstring でパッケージをインストールしておきます。
メール送信関数
SendAttachedMail()
メールを送信します。
添付ファイルも送信できます。
題名、本文、添付ファイル名とも日本語対応です。
メール送信が受け入れられた場合に TRUE 、それ以外の場合に FALSE を返します。
書式:
bool SendAttachedMail( 差出人 , 宛先 , 題名 , 本文 , 添付ファイル名の配列 );
send_attached_mail.inc
<?php function SendAttachedMail( $from , $to , $subject , $body , &$file ){ mb_language( 'ja' ); mb_internal_encoding( 'ISO-2022-JP' ); $boundary = "__Boundary__" . uniqid( rand() , true ) . "__"; $mime = "application/octet-stream"; $header = ""; $header .= "From: $from\n"; $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: Multipart/Mixed; boundary=\"$boundary\"\n"; $header .= "Content-Transfer-Encoding: 7bit"; $mbody = "--$boundary\n"; $mbody .= "Content-Type: text/plain; charset=ISO-2022-JP\n"; $mbody .= "Content-Transfer-Encoding: 7bit\n"; $mbody .= "\n"; $mbody .= mb_convert_encoding( $body , 'ISO-2022-JP' , 'auto' ); $mbody .= "\n"; for( $i = 0 ; $i < count( $file ) ; $i++ ){ $filename = mb_encode_mimeheader( mb_convert_encoding( basename( $file[ $i ] ) , "ISO-2022-JP" , 'auto' ) ); $mbody .= "--$boundary\n"; $mbody .= "Content-Type: $mime; name=\"$filename\"\n"; $mbody .= "Content-Transfer-Encoding: base64\n"; $mbody .= "Content-Disposition: attachment; filename=\"$filename\"\n"; $mbody .= "\n"; $mbody .= chunk_split( base64_encode(file_get_contents( $file[ $i ] ) ) , 76 ,"\n" ); $mbody .= "\n"; } $mbody .= "--$boundary--\n"; return mail( $to , mb_encode_mimeheader( mb_convert_encoding( $subject , "ISO-2022-JP" , 'auto' )) , $mbody , $header ); } ?>
mb_internal_encodingでの文字コード指定と、mb_convert_encodingでの文字コード指定は同じにします。
ここが一致しないと、長い文字列で一部文字化けが発生します。
サンプル
<?php require "send_attached_mail.inc"; $file[0] = "/tmp/テスト.txt"; $file[1] = "/tmp/test.doc"; SendAttachedMail( "from@sample.com" , "hoge@sample.com" , "題名はテスト" , "本文1行目\n本文2行目" , $file ); ?>
$file[0] , $file[1] で指定された箇所にあるファイルをメールに添付します。
参考
日曜プログラミング講座/PHP言語 – WEB要素編 – Water-Sunlight
PHP: mail – Manual
コメント
参考になりました。ありがとうございます!
どうしてもsubjectが文字化けしてしまったので
mb_encode_mimeheader( mb_convert_encoding( $subject , “ISO-2022-JP” , ‘auto’ ))
で送信したらうまくいきました。
ご指摘ありがとうございます。
記事を書いた時と別の環境で試してみると、確かにSubjectが文字化けしていました。
記事の修正をしました。
添付ファイル名が日本語名の場合も文字化けしていましたので、こちらも修正しました。