【问题标题】:rails 3 + devise: how to modify the mailer method for confirmation emails to add user's second email addressrails 3 + devise:如何修改确认电子邮件的邮件方法以添加用户的第二个电子邮件地址
【发布时间】:2011-09-10 09:29:42
【问题描述】:

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

问题:有没有办法告诉 devise 将初始确认电子邮件(仅初始确认电子邮件)密件抄送(或抄送)到(可选)“backup_email " 新用户注册表中也提供了电子邮件地址?

或者,有没有办法“禁用”确认电子邮件过程,但只有在注册字段中输入特定代码时?

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


感谢约翰尼·格拉斯!

我做了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 个邮件模板从 views/devise/mailer 移动到 views/customer_user_mailer(否则电子邮件为空)

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

【问题讨论】:

    标签: ruby-on-rails devise registration


    【解决方案1】:

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

    【讨论】:

    • 一个问题......我将把那个新文件保存在哪里?这是非常有用的信息。备份电子邮件来自每个用户注册表单上的数据,希望我们可以使用类似 :bcc => resource.backup_email。
    • 您实际上必须制作一个邮件程序,关注this guide,但将其设为Devise::Mailer 的子类。
    • 非常感谢。我已经在原始问题的末尾记录了更改,因为我还需要将邮件程序 erb 模板移动到新视图
    • 在 Devise 的最新版本中,这个答案不起作用。我会提交一个新的。
    • 如何在加载资源的同时做到这一点;即我想将“来自”字段设置为 resource.invited_by.full_name。
    【解决方案2】:

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

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

    【讨论】:

    • 当我这样做时,我会收到没有正文的电子邮件。所有的标题都很好用。我没有看到“模板路径”是如何定义的 - 是否有可能因为我使用的是生成的视图它们不起作用?
    • 没关系 - 事实证明,如果我将 :template_path 更改为::template_path =&gt; "devise/mailer" 我可以使用我已经创建的模板。
    【解决方案3】:

    您可以使用更简洁的代码

    # 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
    ...
    

    通过将哈希传递给merge! 方法,您可以添加或修改任何您想要的电子邮件标题。

    【讨论】:

      【解决方案4】:

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

      我有一个场景,我需要定制设计: 1)根据环境将BCC中的注册确认电子邮件发送到不同的电子邮件。 2) 电子邮件应添加到密件抄送,仅用于注册确认邮件。

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2011-05-10
        • 2017-07-23
        • 2014-09-13
        • 2011-07-13
        • 2016-06-08
        相关资源
        最近更新 更多