Rails Mailer Using SendGrid Template

How do I bind a rails mailbox to Sendgrid using smtpapi-ruby stone? I watched their limited documentation , but my emails didn’t go through, I checked that my SendGrid implementation works fine when it just sends a simple email so that it doesn't exist. This is what I have:

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 

mailers / 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 

view / 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> 

I don't see anything in the SendGrid activity log, so it doesn't even go there, at least that's my guess.

What am I doing wrong?

+5
source share
2 answers

I think you mixed up your variables. You call hdr.to_json , and the parameter name is header , which is also already converted to json.

You must include the header metadata directly in the 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" ) 

You can also transfer content if UserNotifier.welcome used in other parts of your application:

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

In your template, you can include your replacement tags by specifying a tag name:

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

Additional Information About Substitution Tags

Browse Sendgrid docs with your template system

+6
source

You should change the code in your mail program to something like:

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

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

+3
source

Source: https://habr.com/ru/post/1232316/


All Articles