mb_encode_mimeheaderでアンダーラインを含むメールアドレスが文字化けする
問題によく挙げられる、メールアドレスに日本語を含んでいなくても、ってことで。
mb_encode_mimeheader関数はいろいろと問題が多いことで有名になった関数ですが、新しい問題に直面したので書いておきたいと思います。
正確には「文字化け」というよりも「誤変換」に近い現象のようです。
具体的な現象
mb_encode_mimeheader(“メールアドレス”, “iso-2022-jp”)でアンダーラインを含めると、後のアルファベットや@(アットマーク)も含め、全て変換されてしまいます。
ちなみに、mb_internal_encodingが「EUC-JP」であれ「UTF-8」であれ、「ISO-8859-1」であれ、起こってしまいます。
以下に例をあげてみます。
変換されてしまう例
mb_encode_mimeheader("hoge_foo@example.com", "ISO-2022-JP"); 実行結果:「=?ISO-2022-JP?B?aG9nZV9mb29AZXhhbXBsZS5jb20=?=」
このMIMEエンコードされた文字列は当然メールアドレスとはみなされません。
うまくいっている例
例えばハイフン等の記号では誤変換は起こりません。
mb_encode_mimeheader("hoge-foo@example.com", "ISO-2022-JP"); 実行結果:「hoge-foo@example.com」
ここからメールサーバーの反応はどうなる?
このままFrom(差出人)としてSMTPサーバーのキューに入れられると、サーバーによっては自動的にローカルアドレスとみなされて「@localhost」が付加されます(例:qmailなど)。
例
=?ISO-2022-JP?B?aG9nZV9mb29AZXhhbXBsZS5jb20=?=@localhost
ローカルアドレスとみなされたFromは、ローカルホストと同ドメインのアドレスには送信可能になります。
しかし、他ドメインのメールアドレスがTo(送信先)に指定されていた場合は、送信先のメールサーバーがFrom欄を確認する段階で拒否することがあります。
その場合の送信先メールサーバーの応答は次のようなものがあります。
delivery [配送番号]: failure: Connected_to_(ホストIPアドレス)_but_sender_was_rejected./Remote_host_said:_504_5.5.2_<=?ISO-2022-JP?B?aG9nZV9mb29AZXhhbXBsZS5jb20=?=@localhost>:_Sender_address_rejected:_need_fully-qualified_address/
で、対策。
メールアドレスと認識できる文字列に対してはmb_encode_mimeheaderを実行しないこと。 今のところそれぐらいかと。
2010-03-08