Loading ...

PHPでの日本語メールの作り方,送り方


mbstring

mb_send_mail()

基本的な手順

  • mbstring.languageの設定
  • mbstring.internal_encodingの設定
  • 必要なヘッダーをmb_encode_mimeheader()でMIMEエンコード
  • メール本文の文字エンコード変換
  • mb_send_mail()でメール送信

mbstring.languageの設定

多くの書籍でphp.iniで設定してますが,ほとんどの場合スクリプトで書いた方が問題がないでしょう.

mb_language( "ja");

理由は下記の通り

  • デフォルトでは設定されていないため,サーバーの移動をした場合などで設定漏れをしてしまう
  • 「とある設定があたりまえ」と思ってしまい,意図しない挙動に対処できない(php.iniでjaに設定されていたが別の言語を扱いたかった)
    • 特に下記mbstring.languageやmbstring.http_inputなどは文字化け発生で苦しむ人をとても多く見かけます

これらはスクリプト上で設定することでほぼ解決します.

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>";

本当は1行は76文字以内に収めなければならないので上記は文字列の長さを計測し,適切に改行コードを入れるなどする必要があります.

mb_encode_mimeheader()はあるバージョンから文字列の先頭から続くASCII文字列*1はMIMEエンコードしなくなったようです. これを利用して上記をスマートに書くこともできます.

$headers .= mb_encode_mimeheader( "From: <from@example.com> 差出人");

スマートといってもメールアドレス→コメントという順番はあまり見かけませんが…*2

しかしこのままだと不十分で「"」や「\」などの特殊文字を含む場合,クォートをしたり,何らかの対処をする必要があります.

なお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にそれなりのボリュームでメール関連の解説とライブラリの作成・紹介をしているので,読んでください.

関連情報



*1 一部記号を除く
*2 ただしRFC非準拠というわけではない
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
最終修正日時: Thu, 07 Sep 2006 17:59:50 JST (2084d)
文字数(HTML): 3004
文字数(Wiki): 2826
人気ブログランキング - よくきた wiki