【问题标题】:Rails Mailer using SendGrid TemplateRails Mailer 使用 SendGrid 模板
【发布时间】:2015-09-25 21:32:41
【问题描述】:

如何使用 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

ma​​ilers/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

views/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 活动日志中没有看到任何内容,因此它甚至没有被发送到那里,至少这是我的猜测。

我做错了什么?

【问题讨论】:

    标签: ruby-on-rails actionmailer sendgrid


    【解决方案1】:

    我认为您混淆了变量。你调用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 文档

    【讨论】:

      【解决方案2】:

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

      class UserNotifier < ApplicationMailer
        default from: "test@test.com"
      
        def welcome(hdr)
          headers['X-SMTPAPI'] =  hdr.asJSON()
          mail(subject: "Welcome to the site!")
        end
      end
      

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

      【讨论】:

      • 好的,这是有道理的,但现在我得到了undefined local variable or method header' #<0x007fc3d3581dc8>
      • &lt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多