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