末尾「.」アドレスとActionMailer

Jpmobileを試していたときのこと(Jpmobileが1.0.0.pre.2くらい、Railsが3.0.5くらい)。

ローカルパートの末尾が「.」であるアドレスからのメールを受け取ろうとした際に例外が起きることに気付いた。ローカルパートにおいてquoteなしで末尾に「.」がくることはないはずなのだが、現実にはまだ使われいるため状況によっては対象しなくてはならない。

たとえばこんなmailerを書いたとする(ほぼrails generateしただけの内容)。

class Foo < ActionMailer::Base
  default :from => "from@example.com"

  def receive(mail)
    pp mail.from
  end
end
これに対する入力として次のようなテキストを用意する。
From:bar@example.jp,foo.@example.jp

そしてこれらをもとに実行すると次のようになる。

$ ./script/rails runner 'Foo.receive($stdin.read)' < test.txt
#<ActiveSupport::Multibyte::Chars:0x7f91f5123b88
 @wrapped_string="bar@example.jp,foo.@example.jp">

通常の動作をしていればfromではメールアドレスのリストが文字列の配列として参照できるはずのところである。ところが以上のような状況となる。このままでも処理が進めば問題ないこともあるかもしれない。が、リストされたメールアドレスを個別に扱いたいとしてmail.from[0]などとすると途端にまずいことが起きる。

これをどう処理すべきかは状況によってかなり異なる。不正なメールアドレスとしてしまうのも一つのやり方だろうし、なんとかして扱えるようにするしかないということもある。また、後者の場合、送信時には正しいアドレスに直しておきたくもなる。

なんとかして扱うという場合に救済できるところはどこにあるのかなとざっと見渡してみた(つもりだ)が、これという場所を見付けられなかった。アプリケーション側での対処になる。入力前に対処する(" ... "でくくる)か、あるいはreceiveメソッドの中で対処するかのどちらかで、Jpmobilel::Mailer::Baseを受信に使うなら前者になる。(今のところ、たぶん。)

このこととは直接は関係ないけども、Mailをもう少し読み込んだほうがよいもなとちょっと思った。Jpmobileに何かコミットできるかもしれない。(が、できないかもしれない。)