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)'"