PHP: 2016年3月アーカイブ

ちょっと他人の書いた 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-JP
Content-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-8
Content-Transfer-Encoding: BASE64

という Content-Type がセットされて、本文との整合性が取れる。

いや、俺の世代だと、そもそも UTF-8 のメールというのがすでに気持ち悪いのだけど、これも時代の流れ(^^;

・・・あ、うまくいったと思ったけど、これだと From アドレスは MIME B エンコードされないままだな。
そこは自前でエンコードしてからセットしてやる必要があるのか。ふむふむ。

$w_from = "From: " . mb_encode_mimeheader("ほげほげ星人", "UTF-8", "B") . " <no-reply@exsample.jp>";

だな。

このアーカイブについて

このページには、2016年3月以降に書かれたブログ記事のうちPHPカテゴリに属しているものが含まれています。

前のアーカイブはPHP: 2015年9月です。

次のアーカイブはPHP: 2020年7月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら