Rails 设计自定义邮件程序
Rails Devise custom mailers
我想向 Devise 添加新的邮件程序方法,主要复制内置方法的工作流程,但添加了一些参数和不同的视图。
例如reset_password_instructions有两种情况:
- 当现有用户只想重设密码时。
- 当一个用户邀请另一个用户时,该用户将使用随机密码保存在数据库中。他收到了一封包含 reset_password_token 的电子邮件,应该将他重定向到编辑密码页面,以便他稍后可以登录。
相同的功能,但我希望第二封电子邮件具有不同的视图,并且我还需要能够传入发送邀请的人的姓名。
这非常令人困惑,因为 Devise 邮件程序调用了一堆其他方法和助手,所以我不知道要重写哪些方法才能实现这一点。
要使用自定义邮件程序,请创建一个扩展 Devise::Mailer
的 class,如下所示:
class MyMailer < 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
end
然后,在您的 config/initializers/devise.rb
中,将 config.mailer
设置为 "MyMailer"
。
您现在可以像使用任何其他邮件程序一样使用您的 MyMailer
。如果您想覆盖特定邮件以添加额外的 headers,您可以通过简单地覆盖该方法并在自定义方法末尾调用 super
来触发 Devise 的默认行为。
例如,我们可以为confirmation_instructions
e-mail添加一个新的header,如下所示:
def confirmation_instructions(record, token, opts={})
headers["Custom-header"] = "Bar"
super
end
您还可以通过手动设置选项散列来覆盖任何基本 headers(来自,reply_to,等等):
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
为了获得预览(如果 User
是您的设备型号名称):
# test/mailers/previews/my_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/my_mailer
class MyMailerPreview < ActionMailer::Preview
def confirmation_instructions
MyMailer.confirmation_instructions(User.first, "faketoken", {})
end
def reset_password_instructions
MyMailer.reset_password_instructions(User.first, "faketoken", {})
end
def unlock_instructions
MyMailer.unlock_instructions(User.first, "faketoken", {})
end
end
为了控制哪个 queue 命名邮件程序 queue 发送新电子邮件,将以下方法添加到您的 class(MyMailer
,上面):
def deliver_later
Devise::Mailer.delay(queue: 'my_queue').send(...)
end
我想向 Devise 添加新的邮件程序方法,主要复制内置方法的工作流程,但添加了一些参数和不同的视图。
例如reset_password_instructions有两种情况:
- 当现有用户只想重设密码时。
- 当一个用户邀请另一个用户时,该用户将使用随机密码保存在数据库中。他收到了一封包含 reset_password_token 的电子邮件,应该将他重定向到编辑密码页面,以便他稍后可以登录。
相同的功能,但我希望第二封电子邮件具有不同的视图,并且我还需要能够传入发送邀请的人的姓名。
这非常令人困惑,因为 Devise 邮件程序调用了一堆其他方法和助手,所以我不知道要重写哪些方法才能实现这一点。
要使用自定义邮件程序,请创建一个扩展 Devise::Mailer
的 class,如下所示:
class MyMailer < 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
end
然后,在您的 config/initializers/devise.rb
中,将 config.mailer
设置为 "MyMailer"
。
您现在可以像使用任何其他邮件程序一样使用您的 MyMailer
。如果您想覆盖特定邮件以添加额外的 headers,您可以通过简单地覆盖该方法并在自定义方法末尾调用 super
来触发 Devise 的默认行为。
例如,我们可以为confirmation_instructions
e-mail添加一个新的header,如下所示:
def confirmation_instructions(record, token, opts={})
headers["Custom-header"] = "Bar"
super
end
您还可以通过手动设置选项散列来覆盖任何基本 headers(来自,reply_to,等等):
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
为了获得预览(如果 User
是您的设备型号名称):
# test/mailers/previews/my_mailer_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/my_mailer
class MyMailerPreview < ActionMailer::Preview
def confirmation_instructions
MyMailer.confirmation_instructions(User.first, "faketoken", {})
end
def reset_password_instructions
MyMailer.reset_password_instructions(User.first, "faketoken", {})
end
def unlock_instructions
MyMailer.unlock_instructions(User.first, "faketoken", {})
end
end
为了控制哪个 queue 命名邮件程序 queue 发送新电子邮件,将以下方法添加到您的 class(MyMailer
,上面):
def deliver_later
Devise::Mailer.delay(queue: 'my_queue').send(...)
end