
PHPでの日本語メールの作り方,送り方 †mbstring †mb_send_mail() †基本的な手順 †
mbstring.languageの設定 †多くの書籍でphp.iniで設定してますが,ほとんどの場合スクリプトで書いた方が問題がないでしょう. mb_language( "ja"); 理由は下記の通り
これらはスクリプト上で設定することでほぼ解決します. mbstring.internal_encodingの設定 †同様に多くの書籍でphp.iniで設定してますが,ほとんどの場合スクリプトで書いた方が問題がないでしょう. mb_internal_encoding( "UTF-8"); ここでの文字エンコードはスクリプトの文字エンコードにしておくとほぼ問題がありません. また,覚えておくべきことは,ここの値が多くのmbstring関数群の引数に存在する文字エンコードの指定を省略した場合の値になります. 必要なヘッダーをmb_encode_mimeheader()でMIMEエンコード †mb_send_mail()を使う場合,件名(第2引数)のみMIMEエンコードしてくれます. それら以外は自前でエンコードをしなければなりません. 通常は単にフィールド値をエンコードするだけです. $headers .= "X-Foo: ".mb_encode_mimeheader( "ふー"); しかしメールアドレスが絡むようなフィールドはコメントのみをMIMEエンコードするようにしなければなりません. $headers .= "From: ".mb_encode_mimeheader( "差出人")." <from@example.com>";
mb_encode_mimeheader()はあるバージョンから文字列の先頭から続くASCII文字列*1はMIMEエンコードしなくなったようです. これを利用して上記をスマートに書くこともできます. $headers .= mb_encode_mimeheader( "From: <from@example.com> 差出人");
しかしこのままだと不十分で「"」や「\」などの特殊文字を含む場合,クォートをしたり,何らかの対処をする必要があります. なおToなど,複数のメールアドレスとコメントが連続する場合,PEAR::MailのMail_RFC822クラスを使うといいでしょう. メール本文の文字エンコード変換 †単純にmb_convert_encoding()を使用します. $body = mb_convert_encoding( "本文", "ISO-2022-JP"); 第3引数は第1引数の文字エンコードがinternal_encodingと同じなら指定する必要はありません. もし違う場合は適切に指定してください. mb_send_mail()でメール送信 †マニュアルなどにあるままです. $subject = mb_encode_mimeheader( "件名"); $headers = "From: ".mb_encode_mimeheader( "件名")." <from@example.com>\n"; // 個人的には明示的に第5引数を指定することをお勧めします mb_send_mail( "to@example.com", $subject, $body, $headers); このままだとWindows以外ではenvelope fromが正しくならない場合が多いので第5引数で明示的に指定します. ただしsafe_modeが有効の場合は第5引数が指定できません. その場合代わりの手段としてはPHP 5のとあるバージョンからは「mail.force_extra_parameters」というシステム変数があるので,それを指定します. この変数はini_set()で設定できないので,httpd.confや.htaccessなどで指定する必要があります. この変数にエラーメールを返して欲しいメールアドレスを指定します. php_value mail.force_extra_parameters "from@example.com" iconv(PHP 5以上) †これから書いていきます PEAR::Mail †メール送信の基本 †これから書いていきます ドライバーsendmailを使う †ドライバーmailを使う †ドライバーsmtpを使う †ドライバーnullを使う †PEAR::Mail + mbstring †PEAR::Mail + iconv †よりきっちりメールを作成&送信したいなら †超・極める! PHPにそれなりのボリュームでメール関連の解説とライブラリの作成・紹介をしているので,読んでください. 関連情報 † |