kaeruspoon

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

76de73a1dae79a86bb99a813bd8e8e0a?s=30&d=http%3a%2f%2fkaeruspoon%.net2f2014%2fimages%2fno imageTsukasa OISHI

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に渡されているかどうかを確認できます。