繁体   English   中英

带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行

[英]Nodemailer with Gmail service not working on heroku

我已经完成了基本的电子邮件设置,用于使用带有 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);
        }
    });        
});

我相信这是谷歌账户安全的问题。

  • 由于未知设备(位置),Google 阻止了您登录以使用邮件功能。

验证这一点的几个步骤:

  • 在本地启动您的服务器并发送电子邮件。

  • 检查您的帐户警报以了解未知登录。

这可以通过以下方式暂时解决: https ://accounts.google.com/DisplayUnlockCaptcha

更永久的解决方案是将您的密码更改为更高级别:

大写字母 + 小写字母 + 特殊符号 + 数字

而不是像这样使用直接的 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 文章

5 年后,我仍然在为这个问题苦苦挣扎(在我的案例中,在 SO 上找到的所有答案都失败了)。 这是我所做的,现在一切正常:

  • SendGrid 插件安装到您的 Heroku 应用程序(免费计划每月为您提供 12k 条消息)
  • 转到SendGrid 面板
  • 转到Marketing -> Senders添加您的发件人机器人,配置如下:
  • 来自 = any_address@heroku.com
  • 回复 = your_gmail@gmail.com

在此处输入图像描述

在此处输入图像描述

  • 像这样配置 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 !` });

我想就是这样,如果我忘记了什么,请在下面添加评论

尝试更新 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);
        }
    });        
});

我知道我为时已晚,但希望有人会发现它有帮助。

在撰写本文时,谷歌不再支持不太安全的应用程序 而且您不能使用您的谷歌帐户密码。

您将不得不生成一个新的应用密码。

  1. 按照这个链接
  2. 在“选择应用程序”下拉列表中,选择其他并为应用程序命名(可以是任何名称)
  3. 复制密码并将其替换为您的原始密码

它适用于本地机器和 Heroku。

const client = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "username@gmail.com",
        pass: "Google-App-Password-Without-Spaces"
    }
});

client.sendMail(
    {
        from: "sender",
        to: "recipient",
        subject: "Sending it from Heroku",
        text: "Hey, I'm being sent from the cloud"
    }
)

应用密码仅在开启两步验证的情况下才有效。 你可以在这里这样做

此外,如果您的应用程序密码在您的.env文件中,您必须将其添加到 heroku 应用程序设置选项卡中的配置vars中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM