蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

PHPでメールを送信しようとすると文字化け

$headers['From']= "foo@example.com";
$headers['To']= "bar@example.com";
$headers['Content-Type']= "text/plain; charset=\"ISO-2022-JP\"";
$subject="○○○○の××データベースへのデータ登録";
$headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS"));

$mail_object =& Mail::factory('smtp');
$mail_object->send($recipients, $headers, $body);

phpからこんな感じでメールを送信していたのだが,文字化けするという報告があった.実はうちに送られてきたときも Subject が読めなかったのだが,「まー世の中の一般的なMUAだと読めるんだろーなー」ぐらいに考えて放置していた.
調べてみると,まずSubjectはUTF-8エンコードされていた.mb_encode_mimeheaderのデフォルトがUTF-8らしい.これをISO-2022-JPエンコードするように変更した.

$headers['Subject'] = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS"),"ISO-2022-JP");

ところがこれだとMewで受信したときに,最後の一文字が文字化けしてしまった.mnewsだと大丈夫.MIMEエンコードするときに長すぎたら2行に分割されるのだが,phpでのエンコードがバグっているのかMUAでのデコードがバグっているのか,改行の所で文字化けしてしまう.それどころか,テストのためにphpエンコード(mb_encode_mimeheader)して,その出力結果をそのままデコード(mb_decode_mimeheader)しても化けてしまう.報告例:[PHP-users 26633][PHP-users 6080]など.1行にしてしまうという解決策もあるようだが,今回はMIMEエンコードphpにやらせずに,Mewエンコードした文字列を入れてやることにした.

本文が文字化けするのは,MIME-versionがないからかも知れないと思い,以下を追加.

$headers['MIME-Version']= "1.0";