これはラッパーなのか?

何気に今頃初めて触った ActionMailer。同梱されている TMail が古い (nkf 使ってる) とか、全然 (とは言い過ぎかなとおもた) TMail の構造を理解していないとか、そういうところは突っ込むべきなのだろうか?

そういえば、dot-atom の扱いがおかしいヘッダを持つメールがけっこうある。TMail はそういうのをちゃんと弾く (パースしない) という話を耳にした。やってみよう。

require 'tmail'

[
    "From: .-@d0c0m0.example.com",
    "From: -.@d0c0m0.example.com",
    "From: -.-@d0c0m0.example.com",
    "From: -..@d0c0m0.example.com",
    "From: -..-@d0c0m0.example.com"
].each do |txt|
    m = TMail::Mail::parse(txt)
    p m.from_addrs[0].local rescue p "x"
end

利用した TMail のバージョンは ChangeLog によれば Wed Mar 28 01:26:16 2007 版だ。

結果

"x"
"-."
"-.-"
"-.."
"-..-"

ということは、

  • 末尾に dot がある場合
  • dot が2つ以上続く場合

にはパースできてしまっているということになる。

よく「こんなアドレスを設定しやがって」とか「こんなアドレスを設定できるようなサービスを提供しやがって」という声を聞くが、そもそも問題なのは dot-atom の仕様に合致していないことなのであって、local-part として "." で始まるものを使うことは RFC2822 的には問題ないところに留意したい。

かといって「. で始まるメールアドレスを使いたい方は『"』で括ってください。」という文言を付け加えるのもおかしい。そもそも自己矛盾している。

携帯電話の場合なら、そもそも割り切って

  • メール機能の提供するインターフェイス上で入力あるいは表示される「メールアドレス」は、上記 RFC 文章で説明されるところの addr-spec に合致する形式ではなく、単純に local-part と domain を "@" でつなげただけの文字列である。
  • 同メール機能がインターネットメールとしてメールを送信するため RFC 形式にメールをエンコードするとき、localpart のエンコード時には、できるかぎり dot-atom を使うようにする (これは RFC にも SHOULD として書いてある)。
  • dot-atom で表現できない形式のときは、quoted-string を使ってエンコードする。

とすればよさそうだ。

追記: ソースコードが冗長すぎたので訂正。
追記2: よくよく見ないとこの文章は「携帯の場合はこう送れば大丈夫!」と述べているように見えるけど、そういうわけではないところは注意。携帯サービスを提供している側がどうすればいいかってことを考えているだけに過ぎないので。