14

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

4 回答 4

24

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

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

验证这一点的几个步骤:

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

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

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

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

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

于 2017-07-20T18:22:18.437 回答
10

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

于 2019-07-30T13:17:52.950 回答
4

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 !`
      });
    

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

于 2019-10-10T13:47:37.740 回答
0

尝试更新 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);
        }
    });        
});
于 2017-06-21T19:22:09.710 回答