我使用Action Mailer和Sendgrid在Heroku上运行Rails 3.2应用程序以发送单个交易电子邮件.目前,当应用程序发送电子邮件时,Sendgrid不会收到请求,要求发送11分钟.在收件箱中查看收到的电子邮件时,时间将显示收到的时间,但如果您打开电子邮件,则会有时间(提前11分钟)生成电子邮件请求.这就是我在production.rb中所拥有的:
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
Run Code Online (Sandbox Code Playgroud)
我从来没有遇到过Rails 4.0应用程序的这个问题,所以这是Rails 3.2的一个已知问题吗?
我似乎无法找到关于如何将Sendgrid Web API集成到Ruby on Rails应用程序的分步教程.我对此很陌生,所以也许我错过了一些明显的东西.
我想使用Sendgrid Web API而不是smtp传递方法(mailgun在这里讨论了Web API对SMTP方法的好处:https://documentation.mailgun.com/quickstart-sending.html ,我是认为Sendgrid会有相同的好处,或者我可能会在以后切换到mailgun).
安装sendgrid gem(https://github.com/sendgrid/sendgrid-ruby)后,文档告诉我"使用SendGrid API Key创建一个新客户端",我可以通过两种方式完成:
require 'sendgrid-ruby'
# As a hash
client = SendGrid::Client.new(api_key: 'YOUR_SENDGRID_APIKEY')
# Or as a block
client = SendGrid::Client.new do |c|
c.api_key = 'YOUR_SENDGRID_APIKEY'
end
Run Code Online (Sandbox Code Playgroud)
具体在我的应用程序中,我应该把这段代码?我应该把它放在我的邮件程序,我的应用程序邮件程序或config/environments/production.rb文件中吗?
我看了一下本教程,介绍了如何设置Mailgun API:https://launchschool.com/blog/handling-emails-in-rails
根据本教程,看起来该行client = SendGrid::Client.new(api_key: 'YOUR_SENDGRID_APIKEY')实际上应该进入邮件程序方法本身.请参阅下面的launchschool.com示例(可能会使用sendgrid信息替换mailgun特定信息):
class ExampleMailer < ActionMailer::Base
def sample_email(user)
@user = user
mg_client = Mailgun::Client.new ENV['api_key']
message_params = {:from => ENV['gmail_username'],
:to => @user.email,
:subject => 'Sample Mail using Mailgun …Run Code Online (Sandbox Code Playgroud) 我正在 sendgrid api v3 的帮助下发送电子邮件,但收到警告/错误:
包含字符 '、" 或 & 的内容可能需要使用三个括号 {{{ content }}} 进行转义
在我的 api json 中,我添加了一个包含该&字符的链接:
{"dynamic_template_data": {"link":"...&..."}}
在我的模板中,我使用三个括号{{{ link }}}
一切都按预期进行 - 电子邮件,包括。链接已发送 - 但我总是收到警告/错误。
我错过了 json 中的某些内容吗?
我们有一个站点,我们的代理输入一些数据,然后该数据通过 SendGrid 动态模板发送到客户端。
电子邮件内容包含大量基于输入数据的计算,因此我们希望我们的代理能够在将其发送给客户之前先预览电子邮件并验证内容。
有没有办法使用 SendGrid API 使用 json 对象发送请求,而不是将电子邮件发送给客户端,而是接收生成的电子邮件正文,以便我们可以将其显示给代理并让他们先查看?
我正在尝试将 Twilio 电子邮件验证集成到我的应用程序中。这是代码:
public EmailVerificationDto sendVerificationEmail(String recipient) {
Verification verification = Verification.creator(
PATH_SERVICE_SID,
recipient,
"email")
.setChannelConfiguration(
new HashMap<>() {{
put("template_id", TEMPLATE_ID);
put("from", SENDER_EMAIL);
put("from_name", "Puggle");
}})
.create();
return new EmailVerificationDto(
verification.getTo(),
verification.getSid(),
verification.getStatus(),
verification.getDateCreated().toLocalDate()
);
}
Run Code Online (Sandbox Code Playgroud)
我可以在仪表板上看到电子邮件,但它卡在处理过程中:
有没有办法使用SendGrid的SMTP集成API发送批量邮件?
以下是我的想法:我需要向订阅者发送大量电子邮件.由于SendGrid文档建议尽可能使用SMTP集成,我希望能够创建一个单一的SendGrid并让它根据电子邮件列表发送整个批量.我知道REST API可以实现这一点.
这甚至可以用SMTP吗?
我目前正在使用SendGrid的Inbound Parse Webhook将电子邮件提供给我的应用程序.我已经能够通过将URL指向我的应用程序已公开的端点来使其工作.SendGrid只是以JSON格式HTTP POST请求的形式将电子邮件发送到此端点,我只是在内部处理每个请求.
我的问题是,现在我有它工作,我如何确保只有SendGrid才能使用这个端点?目前,任何人都可以使用此HTTP POST端点并假装已将电子邮件发送到应用程序.
我可以让SendGrid发送某种独特的密钥来识别自己吗?有没有办法可以通过IP地址限制?
我正在按照他们网站上的说明使用以下代码在我的 node.js 项目中集成 sendgrid
const sgMail = require('@sendgrid/mail')
const sendGridAPIKey = "API key"
sgMail.setApiKey(sendGridAPIKey)
const msg = {
to: 'agrawalanuj751997@gmail.com',
from: 'agrawalanuj751997@gmail.com',
subject:'My first mail from node',
text:"I'm sending myself an email"
}
sgMail.send(msg)
Run Code Online (Sandbox Code Playgroud)
我的日志中出现以下错误。我已经尝试了多个帐户的多个 API 密钥,但仍然遇到相同的错误。
(node:16043) UnhandledPromiseRejectionWarning: Error: Forbidden
at Request._callback (node_modules/@sendgrid/client/src/classes/client.js:124:25)
at Request.self.callback (node_modules/request/request.js:185:22)
at Request.emit (events.js:200:13)
at Request.<anonymous> (node_modules/request/request.js:1154:10)
at Request.emit (events.js:200:13)
at IncomingMessage.<anonymous> (node_modules/request/request.js:1076:12)
at Object.onceWrapper (events.js:288:20)
at IncomingMessage.emit (events.js:205:15)
at endReadableNT (_stream_readable.js:1154:12)
at processTicksAndRejections (internal/process/task_queues.js:84:9)
(node:16043) UnhandledPromiseRejectionWarning: Unhandled promise
rejection. This error originated either …Run Code Online (Sandbox Code Playgroud) 我试图在我的电子邮件模板中有一个链接,看起来像这样:
<a href={{url}}>click here</>
Run Code Online (Sandbox Code Playgroud)
上面的链接已通过添加“自定义”链接添加到“设计器”中。这个值就像我输入的 {{url}}。
我在 dynamic_template_data 中传递一个 url 值,如下所示:
const msg = {
to: savedAdmin.email,
from: process.env.EMAIL_ADDRESS,
templateId: process.env.SENDGRID_NEW_ADMIN_TEMPLATE_ID,
personalizations: [
{
to: [{email: savedAdmin.email}],
dynamic_template_data: {
name: savedAdmin.first_name,
url: process.env.CMS_URL,
email: savedAdmin.email,
password: randomPassword,
},
},
],
};
Run Code Online (Sandbox Code Playgroud)
但是,当我在收件箱中收到邮件时,网址会呈现如下:
http://url9905.myweb.shop/ls/click?upn=BMmHdsRoNrbb0-2FMI-2BBVvCjpDiCceHLG5U2u5OCf29QV6iCtfuvZYId1FE95cTz9uyMY31z9fQ7iR-2BPgq-2FkquvxdAPC0oMKiLa3DRglYUSVP-2FRmYbDQ-2BdFGnczXk75K3Ym8rSodsrAy-2BfNDJwqA7RDeemPFjepjRsUdci9CA6Y0-....
Run Code Online (Sandbox Code Playgroud)
我如何让这个工作?
从 SendGrid 添加 CNAME 后,无法使用 GoDaddy 验证域