Rails3でメール受信(postfix + rvm + bundler + rails runner)

空メール登録機能を実装するために,Rails3でメール受信をやってみました.
rvmとbundlerを使ってるので,面倒になるだろうなーと思ってたらやっぱり面倒だった.

大雑把なRailsでのメール受信の流れは以下の通りです.

  1. postfixがメールを受信
  2. postfixがrails appに標準入力でメールの内容を食わせてやる
  3. rails appがmailオブジェクトに変換し,receiveメソッド内で任意の処理を行う
前提条件
  • postfixで普通にメールが受信できる
  • rvmとbundlerを使用してrails appを開発している
  • mailerとreceiveメソッドは実装済み(rails g mailer HogeMailer receive)
  • rails appの位置: /path/to/app
  • mailerのクラス名: HogehogeMailer
  • rvmの位置(トップ): /path/to/rvm
  • rvmのrubyバージョン: ruby-1.9.3-p0
  • rvmのgemset名: bundler
それでは,本題に入ります.

まずはじめに,postfixからrails appに渡す部分を作成します.

パスの読み込みなどが多いので,1つスクリプトを作りました.(作成にあたっては http://d.hatena.ne.jp/kusakari/20110525/1306315643 を参考にさせていただきました.)
これをRailsアプリのscriptディレクトリ下に置きます.
ここではmail_receiveというファイル名にします.
次に,postfixがrails appにメールの内容を転送するように設定します.
/etc/aliasesファイルを編集します.例えば受信するユーザ名がuser1だとしたら,以下の行を追加します.
user1: "| /path/to/app/script/mail_receive"

(Debian系では)新しいエイリアスを有効にするためにsudo newaliasesを実行します.

最後に,多くの場合postfixユーザがrailsを呼び出すため,logファイルへのアクセス権が無いとrailsにメールを渡すことができません.

chmod 666 /path/to/app/log/*.log

として,アクセス権を解放するのが楽かと思います.

これでおそらくRailsでメールが受信できるはずです.
うまくいかないときは,Railsのログとpostfixのログの両方を見たほうがいいです.
大抵はpostfix→railsの部分でうまくいっていないことが多いので,rails側のログは流れません.
あと,権限的な問題を見るときはsudo -u postfixで実行して調べてみるとか.

とりあえずこんな感じでできました.


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください