Rails: 宛先不明で戻ってくるメールを処理する

ActionMailer でユーザーにメールを送って、「宛先不明」等で戻ってきた時には、ユーザーのアカウントを無効にする処理をする方法のメモ。

まず、こんな風に書きます。


class MyMailer < ActionMailer::Base
default :from => 'info@example.com',
:return_path => 'error@example.com'

def notification(user)
headers['X-ORIGINAL-TO'] = user.email
mail :to => user.email, :subject => 'お知らせ'
end

def receive(email)
email.body.to_s.split(/\n/).each do |line|
if line.match(/^X-ORIGINAL-TO: /)
email = Regexp.last_match.post_match

u = User.find_by_email(email)
u.active = false
u.save!
break
end
end
end
end

X-ORIGINAL-TO という独自ヘッダを付けてメールを送っています。独自ヘッダの名前は何でもいいです。

/etc/aliaes に次のような記述を追加。


error: | "/var/rails/foo/current/script/rails runner -e production 'MyMailer.receive(STDIN.read)'"

ただし、/usr/local/bin 等に ruby がある場合は、/usr/bin/env: ruby: No such file or directory というエラーが出ます。

その場合は、/etc/aliaes をこのように書き換えてください。


error: | "PATH=/usr/local/bin:$PATH /var/rails/foo/current/script/rails runner -e production 'MyMailer.receive(STDIN.read)'"