おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

RailsとPostfixで受信メールを処理する方法

Railsで受信メールを処理する方法はけっこう簡単です。 HowToReceiveEmailsWithActionMailerに書かれていることがすべてといってもいいでしょう。
ここではPostfixを使った方法を書いておきます。

1.Postfixのインストール

aptitude install postfix  

2.受信メールを処理するコードをapp/modelsの下に置く。

  class KaeruMailman < ActionMailer::Base  
    def receive(email)  

    ...ユーザ認証したりメールの内容をDBにインサートしたりといった処理...  

    end  
  end  

3./etc/postfix/master.cfの最後に、下記を追加する。

kaeruspoon-mailman  unix  -       n       n       -       -       pipe  
  flags= user=tsukasa argv=/usr/bin/ruby /var/www/rails/kaeruspoon/script/runner -e production KaeruMailman.receive(STDIN.read)  

userはRailsを実行しているユーザにします。KaeruMailmanのrecieveはインスタンスメソッドとして定義しますが、ここではクラスメソッドとして書きます。内部でインスタンスが勝手に作成されて、recieveメソッドが呼ばれるのです。

4./etc/postfix/main.cfの最後に、下記を追加する。

transport_maps = hash:/etc/postfix/transport  
virtual_mailbox_domains = kaeruspoon.net  

受け付ける受信メールのアドレスでユーザ認証を行う場合などは、local_recipient_mapsを無効にしておく必要があります(UNIXユーザ以外のメールアドレスは拒否されるから)。

local_recipient_maps =  

5./etc/postfix/transportに(ファイルがなければ作成して)、下記を追加する。

kaeruspoon.net    kaeruspoon-mailman:  

これでkaeruspoon.netドメインのメールを受信したときは、master.cfで設定したkaeruspoon-mailmanのコマンドを実行するようになります。
上記設定を有効にするために下記コマンドを実行します。

postmap /etc/postfix/transport  

これで設定完了です。/var/log/mail.infoをチェックして、受信したメールが正しくRailsに渡されているかどうかを確認できます。