ちょっと他人の書いた PHP の修正案件があったので、メモ。
UTF-8 で書かれた PHP ソースの中で、以下のような記述でメールの送信を行っている。
$w_from = "From: ほげほげ星人 <no-reply@exsample.jp>";$w_to = "hogehoge@exsample.com"$w_subject = "[返信]ありがとうございます";$w_body = "あれやこれや...";mb_language("Japanese");mb_internal_encoding("UTF-8");mb_send_mail($w_to, $w_subject, $w_body, $w_from);
が、これ、実際にはむちゃくちゃな内容のメールが届く。
Content-Type: text/plain; charset=ISO-2022-JPContent-Transfer-Encoding: 7bit
とか言いながら本文は UTF-8 だし、FROM アドレスは MIME B エンコードされず、Subject だけは ISO-2022-JP で MIME B エンコードされているという状況である。
まあ、最近のメールソフト(Web メール含む)は charset の記述を無視して、実際に本文の文字コードをチェックして表示を行うものが多いから、こんな状況でも一見、ちゃんと表示されてたりするので大丈夫・・・というか、質が悪いな、これ(^^;
なんのための、charset 指定だっつうの(^^;
どうも、UTF-8 のメールを送りたいようなので、
$w_from = "From: ほげほげ星人 <no-reply@exsample.jp>";$w_to = "hogehoge@exsample.com"$w_subject = "[返信]ありがとうございます";$w_body = "あれやこれや...";header('Content-Type: text/html; charset=UTF-8');header('Content_Language: ja');mb_language("uni");mb_internal_encoding("UTF-8");mb_send_mail($w_to, $w_subject, $w_body, $w_from);
という具合に、Content-Type ヘッダーを明示的に指定し、mb_language は Japanese ではなく uni を指定してやれば、Subject は UTF-8 で MIME B エンコードされるし、
Content-Type: text/plain; charset=UTF-8Content-Transfer-Encoding: BASE64
という Content-Type がセットされて、本文との整合性が取れる。
いや、俺の世代だと、そもそも UTF-8 のメールというのがすでに気持ち悪いのだけど、これも時代の流れ(^^;
・・・あ、うまくいったと思ったけど、これだと From アドレスは MIME B エンコードされないままだな。
そこは自前でエンコードしてからセットしてやる必要があるのか。ふむふむ。
$w_from = "From: " . mb_encode_mimeheader("ほげほげ星人", "UTF-8", "B") . " <no-reply@exsample.jp>";
だな。