rails 3 + devise:如何修改邮件方法以确认电子邮件添加用户的第二个电子邮件地址

背景:在我们的应用程序中,我们经常有销售代表使用销售人员的计算机为我们的客户进行设置(通常客户在我们设置它们时无法访问他们的电子邮件)。 因此,我们正在考虑在销售代表的电子邮件地址的设计注册表中添加一个字段,并将确认链接也转到该电子邮件地址。

问题:有没有办法告诉设计bcc(或cc)初始确认电子邮件( 只有初始确认电子邮件 )到新用户注册表上也提供的(可选)“backup_email”电子邮件地址?

或者,有没有办法’禁用’确认电子邮件过程,但只有当某个代码输入注册字段时?

我知道如何在设计注册表单中添加另一个字段,但是我没有看到如何/在哪里修改设计邮件代码,所以当确认电子邮件发送到“电子邮件”地址时它也会转到“backup_email”地址(如果有的话,有时它是空白的)。


感谢Johnny Grass!

我做了rails generate mailer CustomerUserMailer并添加了

 #config/initializers/devise.rb config.mailer = "CustomUserMailer" 

我的自定义邮件看起来像:

 # app/mailers/customer_user_mailer.rb class CustomUserMailer  translate(devise_mapping, action), :from => mailer_sender(devise_mapping), :to => resource.email, :cc => resource.backup_user_email(action), :template_path => template_paths } end end 

然后我将3个邮件模板FROM views/devise/mailerviews/customer_user_mailer (否则电子邮件为空)

然后我在我的User模型中添加了一个名为backup_user_email()的方法,该方法根据用户记录和操作中的数据返回“备份”电子邮件地址(如果有)。 唯一的“技巧”是,当测试action它不是action == "confirmation_instructions"它是action == :confirmation_instructions

一种方法是覆盖Devise :: Mailer中的headers_for动作

 class MyMailer < Devise::Mailer backup_email = "..." def headers_for(action) headers = { :subject => translate(devise_mapping, action), :from => mailer_sender(devise_mapping), :to => resource.email, :bcc => backup_email :template_path => template_paths } end 

并告诉设计使用您的邮件:

 #config/initializers/devise.rb config.mailer = "MyMailer" 

万一有人通过谷歌来到这里 – 在最新版本的Devise中, header_for有两个参数。 所以你的代码需要是:

 class MyMailer < Devise::Mailer backup_email = "..." def headers_for(action, opts) headers = { :subject => subject_for(action), :to => resource.email, :from => mailer_sender(devise_mapping), :bcc => backup_email, :reply_to => mailer_reply_to(devise_mapping), :template_path => template_paths, :template_name => action }.merge(opts) end end 

这可能不是最好的方法,但至少可以避免错误。

您可以使用更清洁,更简单的代码

 # app/mailers/my_mailer.rb class MyMailer < Devise::Mailer def headers_for(action, opts) backup_email = "..." super.merge!({bcc: backup_email}) end end # config/initializers/devise.rb ... config.mailer = MyMailer ... 

随着Hash传递merge! 您可以添加或修改任何您喜欢的电子邮件标题的方法。

你的回答对我有用。 非常感谢。

我有一个场景,其中,我需要自定义设计:1)根据环境将BCC中的注册确认电子邮件发送到不同的电子邮件。 2)只有注册确认邮件才能将电子邮件添加到BCC。

为实现这一点,我比较了action参数的值,如下面的代码片段所示:

 def headers_for(action) if action == :confirmation_instructions if Rails.env.production? recipient_email = "user1@example.com" else recipient_email = "user2@example.com" end headers = { :subject => translate(devise_mapping, action), :from => mailer_sender(devise_mapping), :to => resource.email, :bcc => recipient_email, :template_path => template_paths } else super end end