ActionMailerは、内部でヘッダーを割と厳密にパースしているため、RFC2822違反のアドレスを渡すと送信できません。
Takao Baba baba@example.com
のような形式のTOアドレスを適切に処理できるようになっているので、大変便利なのですが、
example...@docomo.ne.jp
のような不正なアドレスは、TOと解釈されず(内部的にToFieldではなくCommendFieldと解釈される)、送信時にエラーが発生します。
真面目に対処しようとすると、YACCを書いてパーサーを差し替えるということになるのですが、正直面倒です(先人たちが色々やってくれていますが、バージョン依存性が以外と強いので、ActionMailer3系に綺麗に対応しているものが少なかったりします)。
ActionMailer3では、TOのアドレスをダブルコーテーションで囲ってしまえば、とりあえず動作はするので、簡単なパッチを当ててみましょう。
# -*- coding: utf-8 -*-
# RFC2822違反の不正なメールアドレス(携帯)を許可するため、
# Toに設定するアドレスをすべてダブルコーテーションで囲む
require 'mail'
require 'mail/header'
module Mail
class Header
alias original_set_bracket []=
def []=(name, val)
if name.to_s =~ /to/i
if val.kind_of?(Array)
val = val.map{|v| %{"#{v}"}}
else
val = %{"#{val}"}
end
end
original_set_bracket(name, val)
end
end
end
ただし、この仕組みには以下の欠点があります。
- メールアドレス以外を含む「Takao Baba baba@example.com」のような文字列を処理できない
- 同様に、複数のアドレスを含む文字列を処理できない
- メールアドレスにダブルコーテーションを含む文字列を処理できない
- postfixの設定をしないと、「host部のないアドレス」と解釈され、ローカル配送されたり、TOにhost部が付与されたりする
ただ、キャリアのためにあまり労力を使うのも気にくわないので入力時にある程度のバリデーションをして、このパッチでも最低限は運用できたりします。