【发布时间】:2019-11-19 21:48:36
【问题描述】:
我想在用户注册时通过 Sendgrid 发送交易邮件(我使用设计进行身份验证)。我使用 SMTP 在 my_mailer.rb 中正常工作,如下所示:
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>):'
如果我注释掉“包含”行,我会得到:'TypeError (no implicit conversion of nil into String):' on the line: "sg = SendGrid..."
我使用 Gem:sendgrid-ruby (5.3.0)
任何想法都将不胜感激 - 我一直在尝试通过反复试验来找到正确的语法,但最终承认我被卡住了。
更新#1:
第一个问题是我使用了错误的 API_KEY 环境。变量(从 2 个不同的帮助文档中复制):“SENDGRID_API_KEY”(在代码中)与 SENDGRID_APIKEY_GENERAL(在 Heroku 中设置)。固定。
更新 #2:
注释掉“include”行后,我现在似乎遇到了 JSON 解析错误:
JSON::ParserError (416: unexpected token at 'token
所以我现在的 2 个问题是:
(1) 我希望 'token' 成为确认令牌变量,但它没有被传递
(2) 发送以下简单(1 行)的 'data' 内容不会引发错误,但未选择 Sendgrid 中的相应模板:
data = JSON.parse('{
"template_id": "1111111-1111-1111-1111-111111111111"
}')
更新 #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/confirmation_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
一如既往,任何见解都值得赞赏。
【问题讨论】:
-
您应该提出一个新问题,而不是更新已回答的问题。此外,如果您觉得自己得到了帮助,您应该接受并投票赞成答案:-)
-
我试图支持你的答案,因为它是一个帮助(解决特定的“包含”问题),但我没有足够的声誉这样做。此外,我最初的问题仍未解决,即获取一个与 SendGrid v3 一起使用的事务动态模板。与此同时,我已经取得了一些进展,我现在将记录下来,作为帮助其他人做同样事情的答案。
-
我更新了我的答案,我认为您在使用
JSON.parse时犯了一个错误,并且您实际上并没有从您的控制器调用正确的邮件方法。
标签: ruby-on-rails ruby devise sendgrid sendgrid-api-v3