首页 文章

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

提问于
浏览
15

Background: 在我们的应用程序中,我们经常有销售代表为我们的客户使用销售人员进行设置's computer (often customers don'在我们设置时可以访问他们的电子邮件 . 所以我们're thinking to add a field to the devise registration form for the sales rep'的电子邮件地址,并确认链接也转到该电子邮件地址 .

Question: 有没有办法告诉设计bcc(或cc)初始确认电子邮件( only the initial confirmation email )到新用户注册表上也提供的(可选)"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 < Devise::Mailer
  def headers_for(action)
    headers = {
      :subject       => 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/mailer 移动到 views/customer_user_mailer (否则电子邮件为空)

然后我在我的 User 模型中添加了一个名为 backup_user_email() 的方法,该方法根据用户记录和操作中的数据返回'backup'电子邮件地址(如果有) . 唯一"trick"就是在测试 action 时它不是 action == "confirmation_instructions" 它是 action == :confirmation_instructions .

4 回答

  • 13

    一种方法是覆盖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"
    
  • 0

    万一有人通过谷歌来到这里 - 在最新版本的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
    

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

  • 11

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

    # 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! 方法,您可以添加或修改您想要的任何电子邮件 Headers .

  • 9

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

    我有一个场景,其中,我需要自定义设计: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
    

相关问题