なので、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が落ちると思うので注意して。いまさらですが。