夜の Discovery このページをアンテナに追加 RSSフィード Twitter

セイバーメトリクス対応!野球の成績・チーム・試合管理の決定版!『ガチャスポ ベースボール』

2009-04-20

Postfix + Rails で空メール対応

ここで言う空メールとは携帯からメールを送ると、会員登録用の URL を書いたメールが自動返信されてくるアレのことです。


仕様としては reg@example.com へ空メールを送ると会員登録 URL を書いたメールが自動返信されてくるものとします。

Postfix の設定

既に Postfix を使ってメールを送信できているとします。

まず、外部からのメールを受けられない設定の場合は、inet_interfaces = all に変更します。

/etc/postfix/main.cf

-inet_interfaces = localhost
+inet_interfaces = all

次に reg@example.com へメールが来たら、ActionMailer を起動する設定をします。(reg ユーザーは必要ありません)

/etc/aliases

reg: "| /usr/local/bin/ruby /home/rails_projects/test_app/script/runner 'RegisterMailer.receive STDIN.read'"

aliases の更新。

# newaliases

ここで Postfix を再起動します。


Rails の設定

RegisterMailer の作成。

# ruby script/generate mailer RegisterMailer

通常は、会員登録用の URL へ直接アクセスできないようにすると思いますが、ここでは URL を書いたメールを送るだけにします。

app/models/register_mailer.rb

class RegisterMailer < ActionMailer::Base
  def receive(email)
    email_addr = email.from[0]
    RegisterMailer.deliver_send_url(email_addr)
  end

  def send_url(email)
    @recipients  = "#{email}"
    @from        = "reg@example.com"
    @subject     = "Subject "
    @sent_on     = Time.now

    @body[:url]  = "application_url"
  end
end

app/views/register_mailer/send_url.erb

Visit this url to create your account:
<%= @url %>

これで完成。

Postfix の設定はいろいろ面倒くさいことが多いですが、

空メール対応のアプリケーションの実装自体は簡単ですね。



動作原理

reg@example.com へメールが届くと、Postfix が script/runner 経由で ActionMailer を起動します。

その際、RegisterMailer のクラスメソッド receive にメールの内容(標準出力)を渡しています。

RegisterMailer のクラスメソッド receive の実装は以下の通りです。

module ActionMailer
  class Base
    class << self
(省略)
      def receive(raw_email)
        logger.info "Received mail:\n #{raw_email}" unless logger.nil?
        mail = TMail::Mail.parse(raw_email)
        mail.base64_decode
        new.receive(mail)
      end
(省略)

やっていることは非常にシンプルで、TMail を使ってメールをパースして、

その結果を RegisterMailer のインスタンスメソッド receive へ渡しています。

後は、receive 内で好きな処理を書けばいいだけです。(もちろん ActiveRecord も使えます)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kusakari/20090420/1240229003