Я хочу отправить транзакционную почту через Sendgrid, когда пользователь регистрируется (я использую devise для аутентификации).У меня это нормально работало в my_mailer.rb с использованием SMTP следующим образом:
def confirmation_instructions(record, token, opts={})
# SMTP header for Sendgrid - v2
# headers["X-SMTPAPI"]= {
# "sub": {
# "-CONFIRM_TOKEN-": [
# token
# ]
# },
# "filters": {
# "templates": {
# "settings": {
# "enable": 1,
# "template_id": "1111111-1111-1111-1111-111111111111"
# }
# }
# }
# }.to_json
Однако, когда Sendgrid предложил использовать синтаксис v3 для поддержки новых почтовых шаблонов, я изменил код на следующий (из справочной документации sendgrid)., в отличие от реального понимания):
def confirmation_instructions(record, token, opts={})
require 'sendgrid-ruby'
include SendGrid
sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
data = JSON.parse('{
"substitutions": {
"-CONFIRM_TOKEN-": [
token
],
"template_id": "1111111-1111-1111-1111-111111111111"
}')
response = sg.client.mail._("send").post(request_body: data)
puts response.status_code
puts response.body
puts response.parsed_body
puts response.headers
Теперь я получаю сообщение об ошибке:
'NoMethodError (undefined method `include' for #<MyMailer:0x0000000003cfa398>):'
Если я закомментирую строку 'include', я получу:
'TypeError (no implicit conversion of nil into String):' on the line: "sg = SendGrid..."
Я использую Gem: sendgrid-ruby (5.3.0)
Любые идеи приветствуются - я пытаюсь найти правильный синтаксис пробными на какое-то время ошибка и, наконец, я признаю, что застрял.
ОБНОВЛЕНИЕ № 1:
Первая проблема заключалась в том, что я использовал неправильный API_KEY env.переменная (скопирована из 2 разных справочных документов): "SENDGRID_API_KEY" (в коде) и SENDGRID_APIKEY_GENERAL (установлено в Heroku).Исправлено.
ОБНОВЛЕНИЕ № 2:
С закомментированной строкой «include» я теперь, похоже, получаю ошибку анализа JSON:
JSON::ParserError (416: unexpected token at 'token
Итак, мои 2 текущие проблемы:
(1) Я бы хотел, чтобы 'токен' был переменной токена подтверждения, но он не передается
(2) Отправка ниже простого(1 строка) содержимое 'data' не выдает ошибку, но соответствующий шаблон в Sendgrid не выбран:
data = JSON.parse('{
"template_id": "1111111-1111-1111-1111-111111111111"
}')
UPDATE # 3:
Вотобновите информацию о состоянии моей проблемы и о том, где именно я сейчас застрял:
Этот код работает нормально (с использованием Sendgrid v2, с которого я пытаюсь обновить):
def confirmation_instructions(record, token, opts={})
#
# SMTP header for Sendgrid - v2
# This works fine
#
headers["X-SMTPAPI"]= {
"sub": {
"-CONFIRM_TOKEN-": [
token
]
},
"filters": {
"templates": {
"settings": {
"enable": 1,
"template_id": "1111111-1111-1111-1111-111111111111"
}
}
}
}.to_json
Этот Sendgrid v3код не работает (электронная почта отправляется через Sendgrid, но он не выбирает шаблон в Sendgrid - он просто использует любой код в app / views / my_mailer / translation_instructions.html.erb):
#
# Sendgrid API v3
# This sends an email alright but it takes content from app/views/my_mailer/confirmation_instructions.html.erb
# It DOES NOT select the template within Sendgrid
#
data = JSON.parse('{
"template_id": "1111111-1111-1111-1111-111111111111",
"personalizations": [
{
"substitutions": {
"-CONFIRM_TOKEN-": "'+token+'"
}
}
]
}')
sg = SendGrid::API.new(api_key: ENV['SENDGRID_APIKEY_GENERAL2'])
response = sg.client.mail._("send").post(request_body: data)
puts response.status_code
puts response.body
puts response.parsed_body
puts response.headers
Как всегда, любое понимание приветствуется.