ランプの中身(Ruby on Railsのシステム開発)
ランプの中身(Ruby on Railsのシステム開発)では、株式会社ケイビーエムジェイのRuby on Railsエンジニアが蓄積したノウハウを公開しています。Ruby on Railに関する技術解説や実践的なノウハウなど、開発現場の技術に則したコンテンツを随時追加していきます。 初心者の方でもわかりやすい技術解説を心がけています。リクエスト、ご質問も受け付けいますので、ご気軽にコメントを記述して下さい。

< aptanaのインストールと使い方につい... | メイン | aptanaでrailsをデバッグ実行す... >

nakahira@rails
2008.02.15

RailsのActionMailer(Tmail)でドットの連続などのRFC違反している携帯メールアドレスに対応する


こんにちは、KBMJの中平@railsエンジニアです。
今回は、docomoやauなどのメールドレスでドットの連続とか@の前にドットをつけたRFC違反メールアドレスだと、ruby on rails のActionMailer(Tmail)でメール送受信が失敗していたので、その対策方法を書きます。

 

RFC違反メールアドレスだとActionMailer(Tmail)でどのような問題が起こるのか

ruby...rails.@kbmj.com などのメールアドレスだとActionMailer(Tmail)を使ってメールの送受信をした時に、メールアドレスの
from、toがnilになってしまいメールアドレスが送受信できません。
(スパムが心配なのでドメインは弊社のものにしています。)

確認してみる

ruby script/console
>> TMail::Version
=> "0.10.7"
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = 'ruby...rails.@kbmj.com'
=> nil

とnilになってしまい、メールアドレスがきちんと取得できません。

■対策方法
こちらのサイトを参考にさせていただきました。

最新のTMailだと対策されているみたいですが、リリース済みのプロジェクトでしたので、parse.yからparse.rbを作り直します。

1.parse.yファイルを取得します。
Tmailを単体で取得し、その中にparse.yがありますのでそれを使います。
http://rubyforge.org/frs/?group_id=4512
ここからダウンロード、使用しているTMailと同じバージョンのものを使います。

リビジョン 3329で対応しているみたいですので、
変更内容
svn log -r 3329 http://i.loveruby.net/svn/public/tmail/trunk/

svn diff -r 3328:3329 http://i.loveruby.net/svn/public/tmail/trunk/lib/tmail/parser.y
で変更点を同じようにダウンロードしたpaser.yに編集します。


2.parse.yからparse.rbを作成しなおします。

raccを使いparse.yからparse.rbを作成いたします。
raccがない場合は取得して使ってください。

windows環境だとサンプルのように
racc -ocalc.rb calc-ja.y
としても、実行されないので
c:\ruby\bin\racc  -ocalc.rb calc-ja.yという感じで実行する必要があります。

praser.rbを作成する。

c:\ruby\bin\racc  parser.y -E -o tmail_parser.rb


参考にさせていただいたサイトですと、直接既存のparser.rbを置き換えていますが、
私は直接置き換えずtmail_parser.rbとファイル名をつけ、
project\libの中にtmail_parser.rbを入れておき
起動時に
TMail.instance_eval{remove_const 'Parser'}
require 'tmail_parser'

として、parser.rbを新しいtmail_parserを使うようにしております。

これで、RFC違反メールアドレス対策が出来ました。
確認してみる。

ruby script/console
>> mail = TMail::Mail.new
=> #<TMail::Mail port=#<TMail::StringPort:id=0x27c5f68> bodyport=nil>
>> mail.from = 'ruby...rails.@kbmj.com'
=> "ruby...rails.@kbmj.com"


問題ないことが確認できました。

第2の問題
実際にメール送受信を試したところ、送信は出来ているのですが受信に失敗していました。
ログを調べてみると・・・・
postfixがRFC違反メールアドレスだと、

ruby...rails.@kbmj.comを"ruby...rails."@kbmj.com という感じで変更していました。


そのため、再びparseが上手くいかずメールアドレスがnilになっていました。
ログを見るとヘッダー情報にはメールアドレスがそのままきていましたので、


require 'action_mailer'

module TMail
  class Mail
    # 指定された名前の最初のヘッダを取得する
    def first_header(key)
      if port.to_s =~ /^#{key}:\s*(.*)/i
        $1
      else
        nil
      end
    end
  end
 end

このようなmoduleを作成し、
メールの受信処理に

def receive(email)
email.first_header('return-path').sub(/^</, '').sub(/>$/, '').sub(/^\"/,'').sub(/\"@/,'@')
end


とすることで、無事メールアドレスが取得できました。

古いバージョンActionMailer(Tmail)でRFC違反メールアドレスの対応する場合は参考にしていただければと思います。

コメント (0)

ブックマークに追加する Subscribe with livedoor Reader あとで読む

この記事にコメントする

ニックネーム:
メールアドレス:
URL:


KBMJのWebソリューション
Ruby on Rails Summer Festival 2008開催決定!!

TOPICS

2008/06/25
ZD Net Builder」の連載記事です。第四回は「Rubyでどう書く?:重複したRSSをまとめる」が掲載されました。

2008/05/30
ZD Net Builder」の連載記事です。第三回は「Rubyでどう書く?:Rubyで特定URLの画像パス一覧を表示する」が掲載されました。

2008/05/07
ZD Net Builder」に連載を始めました。第二回は「Rubyでどう書く?:RubyでPDF履歴書を作成する」が掲載されました。

2008/04/24
アットマーク・アイティ」に『 Rubyを使ってPaSoRi経由でSuicaの乗車履歴を取得し、GoogleMapsやGoogleEarthで表示する』が掲載されました。

全体のRoR最新ブログ一覧

プロフィール

  • nakahira
  • kbmjでrailsエンジニアをしている。中平です。

    ruby on railsのこと:
    ruby on rails でのシステム開発は2006年12月ぐらいからおこなっております。
    ruby on rails を知ってからは他の言語をやりたくないぐらい、ハマってます。
    まだまだ経験は浅いのですが、日々精進しておりますので、よろしくお願いします。

    開発環境:
    Windows vistaで開発をしています。
    aptanaというIDEを使っています。自分の周りではvimを使う人が多いですが・・・・
    vimが軽くて使いやすいのは知ってますけど、自分が好きな物を使えばいいんですよ。

    私のこと:
    攻殻機動隊が大好きです。タチコマ大好き!!
    人工無能に興味あり、社内ircやsnsに人工無能ロボを仕込んで遊んでいます。
    無能のコアは、rubyで作られたシシャモを利用しているので、いつかは自分の無能エンジンを創ってみたいですね。

ブログの購読

RSS

timelog
株式会社ケイビーエムジェイロゴ