トピックス記事     カテゴリ :ネットとサーバー

phpで送信するmailが突然文字化け

php scriptで送信していたメールが突然文字化けした。
最初に動かしたのは 6年ほど前で、以後メール送信部分に変更はなかった。scriptが動いているsystemは、昔は debian woody、debian sarge、debian etch、そして今は debian lennyだ。
メールが化けたクライアントの環境は、Windows XP、Outlook express 2006である。

文字化けは1台だけ?

文字化けとなるメールを開いた時のクライアントのメーラーのエンコードは「西ヨーロッパ言語(Windows)」になっていた。 「日本語自動選択」にエンコードを指定すると文字化けは解消される。
[ツール] -> [オプション] -> [読み取り] -> [フォント] のエンコードは「日本語自動選択」が指定されていた。

文字化けしているクライアントと同じ環境を用意し、文字化けメールを受信して開くと日本語で正常に表示された。エンコードは「日本語自動選択」となっている。
他のメーラーで同じメールを開けてみたが、すべて文字化けせずに表示された。

いろいろ試したが、以下をヘッダに記述することで解決した。
Content-Type: text/plain; charset="iso-2022-jp"
ダブルクォーテーションでくくるのがキモ。
さまざまな文字コードのページが動いているサーバーのため、phpなどの初期設定はセキュリティ関係を除いて defaultのまま。文字コードの指定は個別のページ側で行っている。

EUC-JPで記述している scriptのとき
mb_language('Japanese');
mb_internal_encoding("EUC-JP");

$subject = Mb_convert_encoding($subject,"JIS","EUC-JP,UTF-8,auto");
$subject = mb_encode_mimeheader($subject);

$body = Mb_convert_encoding($body,"JIS","EUC-JP,UTF-8,auto");

SEND_mail("user@examole.jp",$subject,"X-mailer: PHP Scrip001 ¥nContent-Type: text/plain; charset=¥"iso-2022-jp¥"¥n",$body);

UTF-8で記述している scriptのとき
mb_language('Japanese');
mb_internal_encoding("UTF-8");

$subject = Mb_convert_encoding($subject,"JIS","UTF-8,EUC-JP,auto");

$body = Mb_convert_encoding($body,"JIS","UTF-8,EUC-JP,auto");

SEND_mail("user@examole.jp",$subject ,"X-mailer: PHP Script002".chr(0x0A)."Content-Type: text/plain; charset=".chr(0x22)."iso-2022-jp".chr(0x22).chr(0x0A),$body);
関数SEND_mail()は自作のメール送信script。
    function SEND_mail($to,$subject,$headers,$message)
SMTPを載せていないサーバーでメールを送信するための fsockopenを使ったもの。


Comments

Add Comment

このアイテムは閲覧専用です。コメントの投稿、投票はできません。
 
Copyright | 8 Peaks Inc. | Saku City NAGANO | 0267-82-7082 | Back to top