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

Tagged , , ,

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

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

759 views

2012年01月12日
written by baba

About baba

プログラム書きが趣味でそのままプログラマーに。最近は主にWeb開発とAndroid開発を行っています。 お気に入りの言語はRuby,C#。Ruby Association Certified Ruby Programmer Gold認定他。 開発用という名目のもと、おもちゃにするAndroid端末が増殖中。 好きなゲーム:FINAL FANTASY 好きな音楽:FFのサントラ、ジブリ音楽 好きなスポーツ:テニス、水泳

RELATON

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

Spam Protection by WP-SpamFree