带有 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 地址。所以frombcc 地址是两个不同的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)

Nodemailer getaddrinfo ENOTFOUND 错误

如何使用 gmail api 使用 nodemailer smtp oauth2?收到错误 535:不接受用户和通行证