Tech Racho エンジニアの「?」を「!」に。
  • 開発

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

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。