带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行
Posted
技术标签:
【中文标题】带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行【英文标题】:Nodemailer with Gmail service not working on heroku 【发布时间】:2014-10-30 20:15:36 【问题描述】:我已经完成了使用带有 AngularJS 和 NodeJS 的 Nodemailer 发送电子邮件的基本电子邮件设置,并且我已经将项目部署在 heroku 上。
当我在 heroku 上运行应用程序时,电子邮件似乎工作得很好,但是当我将它部署到 Heroku 时,没有发送电子邮件。
对于身份验证,我使用的是 Gmail 地址,并且我还有一个 bcc
到另一个 Gmail 地址。所以from
和bcc
地址是两个不同的Gmail 地址。 from
地址与认证地址相同。
有人可以帮我解决这个问题吗?
编辑:添加代码
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport(
service: 'Gmail',
auth:
user: 'foobar@gmail.com',
pass: 'foobar'
);
router.post('/send',function(req,res)
var mailOptions =
from: 'Foo Bar ✔ <foobar@gmail.com>',
to: req.body.email,
subject: "Hello " + req.body.email,
text: 'Hello ' + req.body.email + '✔',
html: "<p>Hello " + req.body.email + " </p>",
bcc: "fred@gmail.com"
;
transporter.sendMail(mailOptions, function(error, info)
if(error)
console.log(error);
else
console.log('Message sent: ' + info.response);
res.send(200);
);
);
【问题讨论】:
请附上错误信息。 @PeterLyons:错误:登录无效,响应代码:534,代码:'EAUTH'。 嗯,有什么理论吗?对我来说似乎很明显是错误的凭据。 @PeterLyons:是的,看起来我必须去accounts.google.com/DisplayUnlockCaptcha 并从我的 gmail 帐户中关闭此安全预防措施,以允许通过 heroku 部署我的应用程序的机器成为能够使用nodemailer通过我的gmail帐户发送电子邮件。 gmail 的好东西。 酷。请参阅nodemailer warning about trying to send bulk mail with services not explicitly intended for that。考虑从 mailgun、postmarkapp、sendgrid、amazon SES 等应用程序切换到专为事务性电子邮件设计的真实服务。 【参考方案1】:尝试更新 nodemailer 包(使用“npm update nodemailer”命令)
var transporter = nodemailer.createTransport(
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth:
user: 'youremai@gmail.com', // Your email id
pass: 'pwd123' // Your password
,
tls:
// do not fail on invalid certs
rejectUnauthorized: false
);
router.post('/send',function(req,res)
var mailOptions =
from: 'Foo Bar ✔ <foobar@gmail.com>',
to: req.body.email,
subject: "Hello " + req.body.email,
text: 'Hello ' + req.body.email + '✔',
html: "<p>Hello " + req.body.email + " </p>",
bcc: "fred@gmail.com"
;
transporter.sendMail(mailOptions, function(error, info)
if(error)
console.log(error);
else
console.log('Message sent: ' + info.response);
res.send(200);
);
);
【讨论】:
【参考方案2】:我认为这是 google 帐户安全问题。
由于设备(位置)未知,Google 阻止您登录以使用邮件功能。验证这一点的几个步骤:
在本地启动您的服务器并发送电子邮件。
检查您的帐户警报是否有未知登录。
这可以通过以下方式暂时解决: https://accounts.google.com/DisplayUnlockCaptcha
更永久的解决方案是将您的密码更改为更高级别:
大写字母+小写字母+特殊符号+数字
【讨论】:
更改密码对我有用。谢谢【参考方案3】:而不是像这样使用直接的 gmail 凭据
auth:
user: 'foobar@gmail.com',
pass: 'foobar'
使用OAuth2
auth:
type: 'OAuth2',
user: 'user@example.com',
accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'
如果我们使用您上面提到的直接凭据,Google 会阻止 heroku IP(不安全)。可以参考这篇 Medium 文章here
【讨论】:
Google Playground 发生了一些变化,但本文仍然包含您启动和运行所需的一切。谢谢【参考方案4】:5 年后,我仍然在为这个问题苦苦挣扎(在我的案例中,在 SO 上找到的所有答案都失败了)。这是我所做的,目前一切正常:
将SendGrid addon 安装到您的 Heroku 应用(免费计划每月为您提供 12k 条消息) 转到SendGrid panel 转到Marketing -> Senders 添加您的发件人机器人,配置如下: 发件人 = any_address@heroku.com 回复 = your_gmail@gmail.com 生成API KEY here像这样配置 NodeMailer:
const nodemailer = require('nodemailer'),
sgTransport = require('nodemailer-sendgrid-transport');
const mailTransporter = nodemailer.createTransport(sgTransport(
auth:
api_key: process.env.ADMIN_EMAIL_API_KEY // your api key here, better hide it in env vars
))
要立即发送电子邮件,您必须在“回复”字段中添加您的 gmail,如下所示:
mailTransporter.sendMail(
from: `"Admin" <any_address@heroku.com>`,
to: 'receiver@hotmail.com',
replyTo: 'your_gmail@gmail.com',
subject: 'Something',
html: `Boom !`
);
我想就这些了,如果我忘记了什么,请在下面添加评论
【讨论】:
这对我有用。似乎heroku有时会被gmail屏蔽。 help.heroku.com/CFG547YP/… 一个建议:在“发件人”中使用“发件人”电子邮件地址。 app.sendgrid.com/settings/sender_auth/senders以上是关于带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行的主要内容,如果未能解决你的问题,请参考以下文章
Gmail、nodemailer、OATH2 刷新令牌不起作用
让 nodemailer 使用不同的 gmail 帐户发送电子邮件
无法通过 nodemailer 发送电子邮件 |发件人“电子邮件 id@gmail.com>”无效
将带有表单的文件从 nuxt 发送到节点服务器(nodemailer)