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