RSS

メールアドレスをパース 再挑戦

今度こそRFC 5322 に沿っているはず

Haskell の Parsec の実習として RFC 5322 (旧 RFC822) のメールアドレスのパースをしようと挑戦したものの前回はバグがあり,デバッグがさっぱりわからず力尽きた。だが,今回は runParserT を使ってliftIO モナド変換子でデバッグプリントしまくりでついにバグを発見。許される文字を列挙するところでシングルクォートとダブルクォートを打ち間違えてた。気付けば簡単な話であった。

単純に構文チェックするところから local-part などを出力するところまで改良。まあいい感じかなと。本当は文字列ではなく型を使ってみたいなーと思ったのではあるが,コメントが入れ子できるため,ちゃんとやろうとするとコメントの木構造を作らなきゃならんのでやめました。なんでメールアドレスで木構造やねん。若干デバッグの意味があって正確な処理をしてないところもあります。

ちなみに次のようなアドレスは妥当です。実際に扱えるMUAとかMTAがあるのかはわかりませんが…。

  1. "000" A(B"C(hh)C"BB)AA <(pre)"abcdef"(po"<123@example.org>"st)@(hoge)example.com (abc"nest" def)> (a "de" bc)
  2. "!@#..$%^%^&=%"@example.com

1はabcdef@example.comになります。なんでこんなアホなメールアドレスを許すような規格になっちゃったのかなーと思います。そして2はピリオドが二つ並んでいます。全国のメールサーバ管理者を泣かせた昔のDocomoとAUの糞仕様も適切にクォートしていれば良かった…という話なんかなー??なおRFC5322で廃止されているRFC822形式のobsoleteなアドレスはさらに複雑怪奇なことができますが眩暈がするのでやめます(経路指定とか…ああおそろしい。でも昔はsendmailで…いやどうでもいいです)。