php でのmailの文字化け問題

phpのmail関数でメールを出すと、件名(subject)が化ける問題

昔っからある問題で、文字化けする原因をちゃんと解説しているページが見当たらなかったのでコメント

原因は、phpのメール関数が件名を処理する場合、余分な改行を入れてしまうため

mb_encode_mimeheader

がおかしいをか書いてあるページがおおいがmb_encode_mimeheaderは無実、正しい処理をしている

つまり、

mb_encode_mimeheaderは

Subject: =?ISO-2022-JP?B?GyRdsshdfioegocbhwzhauUGFEuig?=
 =?ISO-2022-JP?B?JdejiHDhweifhezhfheohzvrAVVHAERHVRkp?=

このようにMIME的に正しい処理をしているのに

mailで実際に送信すると

Subject: =?ISO-2022-JP?B?GyRdsshdfioegocbhwzhauUGFEuig?=

 =?ISO-2022-JP?B?JdejiHDhweifhezhfheohzvrAVVHAERHVRkp?=

こんな感じで余分な改行が入っちゃう

メールヘッダは改行で制御されているため、これは致命的

メールの世界では改行は rn (CR,LF)でないとダメなため、Unix系の改行LFだけでも mail 関数の中でCRLFにコンバートされているんだけど、どうも意味がわからない

昔っからそうなんで、お間抜けでそうなっているとは思えず

全く解せんです

なんか理由があるんでしょうね?

ちなみにネットでは、

$subject = mb_convert_encoding($subject, "JIS", 'utf-8');
$subject = base64_encode($subject);
$subject = '=?ISO-2022-JP?B?' . $subject . '?=';

な感じでやればいいよ!と言っている人が多いですが正確にはよろしくない

メールプロトコルの世界では慣例的に、一行のサイズを最大1000文字程度にしなくてはならないというのがあって、大昔のメモリがなかった時の名残なんだけど

で、件名などは、一行が長くなったら次の行に分割するのが慣例、これを守れなくなるから

mb_encode_mimeheaderはこれに忠実に従っているわけ

通常のメールソフトでは70文字前後に分割していると思います

まあ、実害は殆ど無いと思うけど、ね

 

 

 

« スクリプトにおけるファイルサイズと実効速…楽天、三木谷社長がヤキがまわった件 »
2012/07/22