2008年1月8日火曜日

RailsのMailer(TMail)のメールアドレスドット問題

TMail(0.10.7で確認)だと3つ以上連続するピリオドを持つアドレスは不正と判断して、弾いてしまいます。
なので、Railsでメールを受信する機能を使うときに、送信アドレスのフォーマットが規約RFCに反している場合でも処理を続けるようにする対応をしてみた
とくに、携帯のドコモ、auは規約に準じていない(2007年12月時点)ので注意。
反したメールアドレスとは、3つ以上連続するピリオドを持つアドレスなど。
hello...yes.i.do.@your.ne.jp

参考ページ
urekatのスカンク日記3 2007-11-1の記事
ずっと君のターン 2007-11-26の記事

■まず、parser.yを手に入れる
Rails1.2.3のパケージに含まれるTMailにはparser.yが存在しない。
バージョンを確認(info.rbの中身のコメント上部)してTMailを単体でDLすればparser.yが手に入ります。

そいつを編集する。以下のをみてなんとなく修正する

lib/tmail/parser.y

tkrmb:~% svn log -r 3329 http://i.loveruby.net/svn/public/tmail/trunk/
------------------------------------------------------------------------
r3329 | aamine | 2006-10-29 13:05:44 +0900 (日, 29 10 2006) | 3 lines

* lib/tmail/parser.y (dots): allow many dots for mobile phone addresses.
* test/testaddress.rb: test it.

------------------------------------------------------------------------
tkrmb:~% svn diff -r 3328:3329 http://i.loveruby.net/svn/public/tmail/trunk/lib/tmail/parser.y
Index: parser.y
===================================================================
--- parser.y (リビジョン 3328)
+++ parser.y (リビジョン 3329)
@@ -201,7 +201,7 @@
| local { Address.new( val[0], nil ) }

local: local_head
- | local_head '.' { val[0].push ''; val[0] }
+ | local_head dots { (val[1] + 1).times { val[0].push '' }; val[0] }

local_head: word
{ val }
@@ -225,9 +225,11 @@
val[0]
}

- dots : '.' { 0 }
- | '.' '.' { 1 }
+ dot_repeat : '.'
+ | dot_repeat '.' { val[0] + val[1] }

+ dots : dot_repeat { val[0].size - 1 }
+
word : atom
| QUOTED
| DIGIT


■編集したparser.yからparser.rbを生成する
raccを使ってparser.rbを生成する
raccが入ってなければここからDLできる

raccをインストール
[root@mycentos ~]# wget http://i.loveruby.net/archive/racc/racc-1.4.5-all.tar.gz



[root@mycentos ~]# tar zxvf racc-1.4.5-all.tar.gz



[root@mycentos ~]# cd racc-1.4.5-all


とりあえずREADMEを読んでインストールした。
[root@mycentos racc-1.4.5-all]# cat README.ja
Racc README
===========

Racc は LALR(1) パーサジェネレータです。
yacc の Ruby 版に相当します。

NOTE:
Ruby 1.8.0 からは Racc のランタイムが標準添付されているので、
Racc で生成したパーサを安心して配布できます。また Ruby 1.6 系に
対応させたい場合は racc -E で生成してください。


必要環境
--------

* ruby 1.6 以降
(*) C コンパイラと make


インストール
------------

パッケージのトップディレクトリで次のように入力してください。
($ は通常ユーザ、# はルートのプロンプトです)

$ ruby setup.rb config
$ ruby setup.rb setup
($ su)
# ruby setup.rb install

これで通常のパスに Racc がインストールされます。自分の好き
なディレクトリにインストールしたいときは、setup.rb config に
各種オプションをつけて実行してください。オプションのリストは

$ ruby setup.rb --help

で見られます。


コンパイラがない場合
--------------------

config を以下のようにすれば、拡張モジュールなしで
インストールできます。

$ ruby setup.rb config --without-ext


テスト
------

sample/ 以下にいくつか Racc の文法ファイルのサンプルが用意
してあります。動くのも動かないのもありますが、少なくとも
calc-ja.y は動くのでこれを処理してみましょう。Racc をインス
トールしたあと

$ racc -ocalc.rb calc-ja.y

として下さい。処理は一瞬から数秒で終わるので、

$ ruby calc.rb

を実行してください。ちゃんと動いてますか?

Racc の文法など詳しいことは doc.ja/ ディレクトリ以下の HTML を
見てください。


ライセンス
----------

このパッケージに付属するファイルの著作権は青木峰郎が保持します。
ライセンスは GNU Lesser General Public License (LGPL) version 2
です。ただしユーザが書いた規則ファイルや、Racc がそこから生成し
た Ruby スクリプトはその対象外です。好きなライセンスで配布して
ください。


バグなど
--------

Racc を使っていてバグらしき現象に遭遇したら、下記のアドレスまで
メールをください。作者にはバグを修正する義務はありませんがその
意思はあります。また、そのときはできるだけバグを再現できる文法
ファイルを付けてください。


青木峰郎(あおきみねろう)
aamine@loveruby.net
http://i.loveruby.net


parser.yからparser.rbを生成
[root@mycentos ~]racc parser.y -E -o parser.rb


■出来上がったparser.rbを既存のものと置き換えることで対応終了
/usr/local/lib/ruby/gems/1.8/gems/actionmailer-1.3.5/lib/action_mailer/vendor/tmail
あたりにあるはずなので上書きは早まってもせず、バックアップをとってから。
[root@mycentos tmail]mv parser.rb parser.rb.org
[root@mycentos tmail]cp /create_parser/path/parser.rb parser.rb


あとは動作確認。Railsが落ちずに動けば今回はOKとした。
TMailのバージョンが異なるparser.yを使うと絶対にRailsが落ちると思うので注意して。いまさらですが。