前回に引き続いて第2回目。今回も調べていて、驚いた点をメモしておきます。
電子メールのアドレスの表記法の自由度
アドレス表現の自由度が高すぎて、自分でメールデータの解析器をJavaで書いていたらたまにマッチできないケースがありました。
FromやToに記述されるアドレス表現を調べてみると、次のような形式があることがわかりました。
- “フレーズ” <ユーザー名@サーバー名>
- ユーザー名@サーバー名(コメント)
で、実際にいくつかのメールを覗いてみるとこれだけではなく以下の形式もあることがわかりました。
- フレーズ <ユーザー名@サーバー名>
- <ユーザー名@サーバー名>
- ユーザー名@サーバー名
ダブルクォートで囲まれずに送受信者の名前が記入されているケース、”<“や”>” でメールアドレスを囲んでいないケース、があります。
これだけ種類があるので、正規表現1つでなんとか~というのを諦めました。
もっとも、厳密な電子メールアドレスの正規表現はかなり複雑になります。今回電子メールアドレスとしては正しいということを想定し、単に抜き出すことをメインとするので、それなりに処理することにしました。
もう1点厄介なことがあります。
上記の記述が、複数宛先になった場合でも同様という点です。アドレスは、カンマ区切りで列挙されるという原則はそのまま適用できますが、カンマ区切りされている中で上記のケースに対応できないと駄目そうです。
またフレーズ中にカンマが出現することも考えられるので、単純なsplitという訳にもいきません。
複数宛先の時にさらに大変そうなのが、グループという概念です。コロン(:)で区切られる表示名と、セミコロン”;”までのアドレス群を処理できないとまずそうな点です。 さらに、カンマ区切りでなくセミコロン区切りで複数アドレスを列挙してくるケースもあるそうです。
上記のフレーズの部分では、アドレスの所有者の名前が記入されますが、これがエンコードされているケースもあります。これまでの処理分岐を考えると、シンプルにかけないもんだなぁと感じます。