Где разместить помощники ruby ​​Sendgrid V3 Send API - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь интегрировать Sendgrid, используя их документацию Github .

В своих примерах они предлагают вам создать класс Mail Helper, но дают очень мало советов о том, как на самом деле это сделать.

У меня запланированное задание Rake, запущенное с использованием планировщика Heroku, которое мне бы хотелосьотправить электронное письмо, когда задача будет выполнена, и надеялся использовать для этого Sendgrid.

В настоящее время у меня есть следующий код в /lib/tasks/scheduler.rake

require 'sendgrid-ruby'
include SendGrid

desc "Testing Email Rake"
task :test_sendgrid => :environment do
  puts 'Starting Sendgrid Email Test'
  send_task_complete_email()
  puts 'Sendgrid Email Test Complete'
end 

def send_task_complete_email
  from = Email.new(email: 'test@example.com')
  to = Email.new(email: 'test@example.com')
  subject = 'Sending with SendGrid is Fun'
  content = Content.new(type: 'text/plain', value: 'and easy to do anywhere, even with Ruby')
  mail = Mail.new(from, subject, to, content)

  sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
  response = sg.client.mail._('send').post(request_body: mail.to_json)
  puts response.status_code
  puts response.body
  puts response.headers
end

У меня нет вспомогательных классов, добавленных где-либо, так как я не уверен, какие биты добавить или куда их поместить.В тот момент, когда я запускаю эту задачу, я получаю ошибку 400 Bad request от Sendgrid, и я считаю, что это потому, что у меня нет этих помощников на месте.

Любой совет, чтобы исправить это, был бы очень признателен, так как, когда я пытаюсь интегрироваться без использования помощников и вместо выписывания JSON, я могу успешно отправить электронное письмо, но получить TypeError: Mail is not a module, когда я пытаюсь выполнить развертывание в Heroku..

ОБНОВЛЕНИЕ: ОШИБКА, ПОЛУЧЕННАЯ С ИСПОЛЬЗОВАНИЕМ ОТВЕТА НИЖЕ

400
{"errors":[{"message":"Invalid type. Expected: object, given: string.","field":"(root)","help":"http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#-Request-Body-Parameters"}]}
{"server"=>["nginx"], "date"=>["Thu, 07 Jun 2018 09:02:42 GMT"], "content-type"=>["application/json"], "content-length"=>["191"], "connection"=>["close"], "access-control-allow-origin"=>["https://sendgrid.api-docs.io"], "access-control-allow-methods"=>["POST"], "access-control-allow-headers"=>["Authorization, Content-Type, On-behalf-of, x-sg-elas-acl"], "access-control-max-age"=>["600"], "x-no-cors-reason"=>["https://sendgrid.com/docs/Classroom/Basics/API/cors.html"]}

1 Ответ

0 голосов
/ 07 июня 2018

Вам необходимо использовать Action Mailer :

Сначала создайте класс почтовой программы для добавления ваших почтовых данных (т. Е. UserMailer):

$ bin/rails generate mailer UserMailer

это создастследующие файлы:

create  app/mailers/user_mailer.rb
create  app/mailers/application_mailer.rb
invoke  erb
create    app/views/user_mailer
create    app/views/layouts/mailer.text.erb
create    app/views/layouts/mailer.html.erb
invoke  test_unit
create    test/mailers/user_mailer_test.rb
create    test/mailers/previews/user_mailer_preview.rb

Теперь отредактируйте файл app/mailers/user_mailer.rb:

require 'sendgrid-ruby'
include SendGrid

class UserMailer < ApplicationMailer
  def send_task_complete_email
    from = Email.new(email: 'test@example.com')
    to = Email.new(email: 'test@example.com')
    subject = 'Sending with SendGrid is Fun'
    content = Content.new(type: 'text/plain', value: 'and easy to do anywhere, even with Ruby')
    mail = Mail.new(from, subject, to, content)

    sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
    response = sg.client.mail._('send').post(request_body: mail.to_json)
    puts response.status_code
    puts response.body
    puts response.headers
  end
end

Затем вы можете просто отправлять электронные письма, используя этот код:

UserMailer.send_task_complete_email.deliver_now

Или отзадача rake:

desc "Testing Email Rake"
task :test_sendgrid => :environment do
  puts 'Starting Sendgrid Email Test'
  UserMailer.send_task_complete_email.deliver_now
  puts 'Sendgrid Email Test Complete'
end 

Обновление:

Поскольку в Rails есть модуль Mail, необходимо указать правильный модуль SendGrid Mail, изменив:

 mail = Mail.new(from, subject, to, content)

до

mail = SendGrid::Mail.new(from, subject, to, content)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...