Где разместить помощники ruby Sendgrid V3 Send API
Я пытаюсь интегрировать 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
когда я пытаюсь развернуться в Героку.
ОБНОВЛЕНИЕ: ОШИБКА ПОЛУЧЕНА С ИСПОЛЬЗОВАНИЕМ ОТВЕТА НИЖЕ
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 ответ
Вам нужно использовать 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
Или из граблей задача:
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
Обновить:
Потому что Mail
модуль в Rails, вам нужно указать правильный модуль SendGrid Mail, изменив:
mail = Mail.new(from, subject, to, content)
в
mail = SendGrid::Mail.new(from, subject, to, content)