Rails Mailer使用SendGrid模板

时间:2015-09-25 21:32:42

标签: ruby-on-rails actionmailer sendgrid

如何使用smtpapi-ruby gem将我的rails邮件绑定到Sendgrid?我已经关注他们的limited documentation,但我的电子邮件没有通过,我已经确认我的SendGrid实现只是发送一个简单的电子邮件,所以不是这样。这就是我所拥有的:

user_controller.rb

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }


        header = Smtpapi::Header.new
        header.add_to(@user.email)
        header.add_substitution('user', [@user.name])
        header.add_substitution('body', "You've registered! This is from the controller.")
        header.add_filter('templates', 'enable', 1)
        header.add_filter('templates', 'template_id', 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx')
        header.to_json

        UserNotifier.welcome(header).deliver
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

寄件人/ user_notifier.rb

class UserNotifier < ApplicationMailer
  default from: "test@test.com"

  def welcome(header)
    headers['X-SMTPAPI'] = hdr.to_json
    mail(subject: "Welcome to the site!")
  end
end

视图/ user_notifier / welcome.html.erb

<html>
 <body>
   Hi -user-<br />
   Thanks so much for joining us!

   <p>-body-</p>

   Thanks,<br />
   The Microblog Team
 </body>
</html>

我在SendGrid活动日志中没有看到任何内容,所以它甚至没有被发送到那里,至少这是我的猜测。

我做错了什么?

2 个答案:

答案 0 :(得分:6)

我认为你已经混淆了你的变量。您调用hdr.to_json并且参数名称为header,该名称也已转换为json。

您应该将标头元数据直接包含在UserNotifier中:

headers "X-SMTPAPI" => {
    "sub": {
      "%name%" => [user.name]
    },
    "filters": {
      "templates": {
        "settings": {
          "enable": 1,
          "template_id": 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
        }
      }
    }
  }.to_json

# the 'to' email can be overridden per action
mail(
  from: 'test@test.com',
  to: 'recipient@test.com',
  subject: "Hello World"
)

如果您的应用的其他部分使用UserNotifier.welcome,您也可以传递内容:

UserNotifier.welcome(user: @user, subject: "Welcome!").deliver_now

# user_notifier.rb

class UserNotifier < ApplicationMailer
  default from: "test@test.com"

  def welcome(user: , subject: , template: "default" )

    # template's default view is "default"
    headers "X-SMTPAPI" => {
     "sub": {
       "%name%" => [user.name]
     },
     "filters": {
       "templates": {
         "settings": {
           "enable": 1,
           "template_id": 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx'
         }
       }
     }
    }.to_json

    mail(
      from: 'test@test.com',
      to: user.email,
      subject: subject,
      template_path: 'path/to/view',
      template_name: template
    )
    # this would try to render the view: `path/to/view/default.erb`
  end
end

在模板中,您可以通过添加标记名称来包含替换标记:

<h1>Hello %name%!</h1>

More information about substitution tags

查看using their template system

上的Sendgrid文档

答案 1 :(得分:3)

您必须将邮件中的代码更改为:

[]

示例:https://sendgrid.com/docs/Integrate/Code_Examples/SMTP_API_Header_Examples/ruby.html