【问题标题】:Nodemailer with Gmail service not working on heroku带有 Gmail 服务的 Nodemailer 无法在 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 等应用程序切换到专为事务性电子邮件设计的真实服务。

标签: node.js angularjs email heroku nodemailer


【解决方案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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2020-03-03
    • 2013-11-21
    • 2017-12-10
    • 2019-02-04
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多