我通过覆盖设计邮件来使用自定义邮件程序。它工作正常。但我需要将一些数据传递给邮件程序模板,以便在确认电子邮件发送给用户时它包含一些动态内容。我已经尝试使用session,@ resource和current_user方法,但两者都无法正常工作。有没有办法做到这一点? 自定义邮件
class CustomMailer < Devise::Mailer
helper :application # gives access to all helpers defined within `application_helper`.
include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
default template_path: 'devise/mailer' # to make sure that you mailer uses the devise views
def confirmation_instructions(record, token, opts={})
opts[:subject] = "Email Confirmation"
opts[:from] = 'no-reply@abc.com'
@data = opts[:custom_field]
super
end
end
控制器中的
CustomMailer.confirmation_instructions(token, {custom_field: "abc"})
这是模板中的代码
We are happy to invite you as user of the <b> <%= @data %> </b>
感谢。
答案 0 :(得分:2)
首先,请阅读Devise custom mailer以熟悉此过程。
简单地说,这就是你要做的事情:
config / initializers / devise.rb 中的:
config.mailer = "DeviseMailer"
现在,您只需像项目中的任何其他邮件一样使用DeviseMailer
:
class DeviseMailer < Devise::Mailer
helper :application # gives access to all helpers defined within `application_helper`.
include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`
default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views
...
def invite(sender, recipient)
@sender = sender
@recipient = recipient
mail( :to => recipient.email,
:subject => "Invite by #{sender.name}"
)
end
...
end
您现在可以调用项目中的invite
并传递您希望能够在模板中访问的任何变量。
即:
调用invite
方法:
DeviseMailer.invite(current_user, newContact).deliver
因此,在您的视图中,您可以调用变量:
invite.html.erb
<p>Hello <%= @recipient.email %></p>
<% if @sender.email? %>
<p> some additional welcome text here from <%= @sender.email %> </p>
<% end %>
修改强>
在这里回答您的具体问题是您要覆盖的内容:
def confirmation_instructions(record, token, opts={})
headers["Custom-header"] = "Bar"
opts[:from] = 'my_custom_from@domain.com'
opts[:reply_to] = 'my_custom_from@domain.com'
super
end
然后在任何地方调用它:
DeviseMailer.confirmation_instructions(User.first, "faketoken", {})