RailsのActionMailerで、RFC違反の携帯アドレスにメールを送る

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部が付与されたりする

ただ、キャリアのためにあまり労力を使うのも気にくわないので入力時にある程度のバリデーションをして、このパッチでも最低限は運用できたりします。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ