设计自定义邮件程序SMTPAPI标题& Sendgrid

时间:2016-04-06 14:20:07

标签: ruby-on-rails ruby devise

我正在使用设计自定义邮件程序并使用我的新方法进行注册过程,但是当它在注册后尝试发送电子邮件时,我收到错误undefined local variable or method 'headers' for DeviseMailer:Class。我需要能够指定SMTPAPI标头才能使用我的Sendgrid模板。我有一些其他邮件工作(没有设计相关),所以我采用相同的代码并将其添加到我的新设计邮件。

模型/ devise_mailer.rb

class DeviseMailer < Devise::Mailer
  helper :application
  include Devise::Controllers::UrlHelpers
  default template_path: 'devise/mailer'

  def self.confirmation_instructions(record, token, opts={})
    new(:confirmation_instructions, record, token, opts)

    headers "X-SMTPAPI" => {
     "sub": {
      "-user-" => [user.name]
     },
     "filters": {
      "templates": {
        "settings": {
          "enable": 1,
          "template_id": "f67a241a-b5af-46b3-9e9a-xxxxxxxxx"
        }
      }
     }
    }.to_json

    mail(
      to: user.email,
      subject: "Confirm your account",
      template_path: '../views/devise/mailer',
      template_name: 'confirmation_instructions'
    )


    opts[:from] = 'support@mydomain.com'
    opts[:reply_to] = 'support@mydomain.com'
    opts[:to] = "myemail@mydomain.com" # just hardcoded right now, remove after testing
    super

  end
end

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

我相信headers被定义为实例方法,而不是类方法。由于您试图在类的上下文中调用它(即self.confirmation_instructions),因此未定义。

如果您在Devise wiki post中注意到使用自定义邮件程序,则说明会在实例上引用headers,而不是类。

如果您只想添加一些自定义标头/选项,建议的方法是覆盖实例方法,然后调用super。例如

class DeviseMailer < Devise::Mailer
  helper :application
  include Devise::Controllers::UrlHelpers
  default template_path: 'devise/mailer'

  def confirmation_instructions(record, token, opts={})
    # custom header(s)
    headers["X-SMTPAPI"]= {
     "sub": {
      "-user-" => [user.name]
     },
     "filters": {
      "templates": {
        "settings": {
          "enable": 1,
          "template_id": "f67a241a-b5af-46b3-9e9a-xxxxxxxxx"
        }
      }
     }
    }.to_json

    # custom option(s)
    opts[:from] = 'support@mydomain.com'
    opts[:reply_to] = 'support@mydomain.com'
    opts[:to] = "myemail@mydomain.com"

    super
  end
end

我建议阅读链接的博客文章,因为它讨论了更详细地覆盖邮件程序的默认行为。