javax.mail.internet.InternetAddressから色々情報を得るこのエントリーをはてなブックマークに追加

|

JavaMailを使うとFrom:とかTo:とかのアドレスはInternetAddressクラスを使うことになるのだけど、名前の部分とかエンコードとかどうなるのかjavadocにはあまり明確に書かれていない感じだったのでテストした結果を記録しておく。

結果はこんな感じ。

コンストラクタに渡す文字列 toString() toUnicodeString() getPersonal() getAddress()
test@example.com test@example.com test@example.com null test@example.com
=?ISO-2022-JP?B?GyRCRnxLXDhsTD4bKEI=?= <test@example.com> (同左) "日本語名" <test@example.com> 日本語名 test@example.com
"日本語名" <test@example.com> (同左) (同左) 日本語名 test@example.com
test@example.com ("日本語名") "日本語名" <test@example.com> (同左) 日本語名 test@example.com

つまり:

  • 一番始めに"アドレス (名前)"形式は"名前 <アドレス>"形式に正規化される。
  • toString()はこの状態の文字列を返す。MIMEデコードはしない。
  • toUnicodeString()は名前のMIMEデコードをして、""でくくった形を返す。
  • getPersonal()はMIMEデコードをして、""でくくらない形を返す。
  • 名前がなければgetPersonal()はnullを返す。

ということが分かった。まあ特に驚きはないか。