Variables and email headers always get nothing in Rails3 ActionMailer

中文版刊登於RailsFun論壇:解決Rails3 ActionMailer抓不到傳進去的變數的問題

Recently, I am working on sending email in my rails project. I use AWS SES (Amazon Web Services - Simple Email Service). But except some specific settings, others usage should be the same.

And I follow the official user guide:
...
UserMailer.welcome_email(@user).deliver
...

I don't know what's going on. But it just doesn't work.

The work one:
UserMailer.welcome_email(@user.name, @user.email)
Passing all parameters you're going to use, in Primitive type. (eg. String, Integer, Boolean)

If you use Objects (including Models). It cannot get your attributes. And Email headers (From, to, Subject) may stay blank. Than encounter this error:

Completed 500 Internal Server Error in 1392ms
AWS::SES::ResponseError (InvalidParameterValue - Missing required header 'To'.):

The reason is that ActionMailer is Observer. It creates a new process to run on. But objects can't be accessed in difference process. So you should only pass Strings, Integers.

So you may found that in rails console, the line UserMailer.welcome_email(@user).deliver works. but not in web.

Here's a workaround: Encapsulate Mailer in to a Model:

MailModel.welcome_email(@user)

class MailModel
  def self.welcome_email(user)
    UserMailer.welcome_email(user.name, user.email)
  end
end

class UserMailer < ActionMailer::Base
  def welcome_email(name, email)
    @name = name
    mail(:to => email, :from => "system@yourdomain.com", :subject => "Welcome!")
  end
end

留言

這個網誌中的熱門文章

神之雫 的 雫 (雨下) 怎麼唸、意思是什麼

[已解決] 入肉 (肏) 的注音/怎麼唸?意思是什麼?(兒童不宜)

哆啦A夢放上任何東西都無違和感、彷彿有音效的滑鼠墊 這裡買得到