带有 Gmail 和 NodeJS 的 Nodemailer

IT技术 javascript node.js nodemailer
2021-01-26 17:01:51

我尝试使用 nodemailer 来实现使用 NodeJS 的联系表单,但它仅适用于本地,不适用于远程服务器...

我的错误信息:

[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787
[website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp]
[website.fr-11 (out) 2013-11-09T15:40:26]   name: 'AuthError',
[website.fr-11 (out) 2013-11-09T15:40:26]   data: '534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX\r\n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC\r\n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX\r\n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r\r\n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.\r\n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787\r\n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp',
[website.fr-11 (out) 2013-11-09T15:40:26]   stage: 'auth' }

我的控制器:

exports.contact = function(req, res){
    var name = req.body.name;
    var from = req.body.from;
    var message = req.body.message;
    var to = '*******@gmail.com';
    var smtpTransport = nodemailer.createTransport("SMTP",{
        service: "Gmail",
        auth: {
            user: "******@gmail.com",
            pass: "*****"
        }
    });
    var mailOptions = {
        from: from,
        to: to, 
        subject: name+' | new message !',
        text: message
    }
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error){
            console.log(error);
        }else{
            res.redirect('/');
        }
    });
}
6个回答

我通过访问以下网址解决了这个问题(使用我想从中发送邮件的帐户连接到 google):

https://www.google.com/settings/security/lesssecureapps

在那里我启用了不太安全的应用程序。

完毕

这不是生产的正确解决方案
2021-03-28 17:01:51
做得好!它正在工作,虽然我认为这不是最好的主意......我收到了我的第一封电子邮件......Thx
2021-03-29 17:01:51
如果不启用它,它甚至无法在本地环境中工作。他清楚地提到它在本地环境中工作,而不是在远程服务器上工作。那的解决方案是什么?
2021-03-31 17:01:51
如果您的 Gmail 帐户中有 2FA 身份验证,这将无济于事
2021-04-03 17:01:51

参见nodemailer的官方Gmail连接指南:

https://community.nodemailer.com/using-gmail/

——

这样做后它对我有用:

  1. 启用安全性较低的应用程序 - https://www.google.com/settings/security/lesssecureapps
  2. 暂时禁用验证码,以便您可以连接新设备/服务器 - https://accounts.google.com/b/0/displayunlockcaptcha
同样在这里。我以前做过 #1 并且在本地主机上收到电子邮件,然后转移到生产中,但没有任何效果。#2 修复了我的生产问题。谢谢
2021-03-18 17:01:51
2号解决了我的困境。我在谷歌帐户设置中的任何地方都找不到该链接。谢谢!
2021-04-06 17:01:51

简单的解决方案:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: 'somerealemail@gmail.com',
  to: 'friendsgmailacc@gmail.com',
  subject: 'Sending Email using Node.js[nodemailer]',
  text: 'That was easy!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});  

步骤1:

转到此处https://myaccount.google.com/lesssecureapps并启用安全性较低的应用程序。如果这不起作用,那么

第2步

转到这里https://accounts.google.com/DisplayUnlockCaptcha并启用/继续然后尝试。

对我来说,单独的第 1 步不起作用,所以我不得不转到第 2 步。

我还尝试删除 nodemailer-smtp-transport 包,令我惊讶的是它有效。但是当我重新启动系统时,它给了我同样的错误,所以我不得不打开安全性较低的应用程序(我在工作后禁用了它)。

然后为了好玩,我只是在关闭(安全性较低的应用程序)的情况下尝试了它,然后再次运行!

第 1 步和第 2 步非常有帮助。谢谢!在看到您的解决方案之前,我尝试了第 1 步,但没有奏效,但第 2 步是一种魔力!
2021-03-13 17:01:51
“smptTransport 不是一个函数”
2021-03-14 17:01:51
必须先从我的默认 Gmail 注销。由于某种原因,Gmail 不允许您更改默认帐户,也不允许您使用所选帐户执行第二步。
2021-03-19 17:01:51
2020 更新:Nodemailer 不再需要 nodemailer-smtp-transport 包;它是内置的。您现在可以使用上面的代码将对象作为参数createTransport而不是smtpTransport({})作为 arg
2021-03-30 17:01:51
我尝试了您与我们共享的两种方式,但我一次又一次地收到相同的错误 { 错误:在 TCPConnectWrap.afterConnect 连接 ETIMEDOUT 74.125.68.108:465 [as oncomplete] (net.js:1097:14) errno: ' ETIMEDOUT',代码:'ECONNECTION',系统调用:'connect',地址:'74.125.68.108',端口:465,命令:'CONN' }
2021-04-03 17:01:51

您应该使用XOAuth2 令牌连接到 Gmail。不用担心,Nodemailer 已经知道了:

var smtpTransport = nodemailer.createTransport('SMTP', {
    service: 'Gmail',
    auth: {
      XOAuth2: {
        user: smtpConfig.user,
        clientId: smtpConfig.client_id,
        clientSecret: smtpConfig.client_secret,
        refreshToken: smtpConfig.refresh_token,
        accessToken: smtpConfig.access_token,
        timeout: smtpConfig.access_timeout - Date.now()
      }
    }
  };

您需要转到Google Cloud Console来注册您的应用。然后,您需要检索要使用的帐户的访问令牌。你可以使用passportjs

这是它在我的代码中的样子:

var passport = require('passport'),
    GoogleStrategy = require('./google_oauth2'),
    config = require('../config');

passport.use('google-imap', new GoogleStrategy({
  clientID: config('google.api.client_id'),
  clientSecret: config('google.api.client_secret')
}, function (accessToken, refreshToken, profile, done) {
  console.log(accessToken, refreshToken, profile);
  done(null, {
    access_token: accessToken,
    refresh_token: refreshToken,
    profile: profile
  });
}));

exports.mount = function (app) {
  app.get('/add-imap/:address?', function (req, res, next) {
    passport.authorize('google-imap', {
        scope: [
          'https://mail.google.com/',
          'https://www.googleapis.com/auth/userinfo.email'
        ],
        callbackURL: config('web.vhost') + '/add-imap',
        accessType: 'offline',
        approvalPrompt: 'force',
        loginHint: req.params.address
      })(req, res, function () {
        res.send(req.user);
      });
  });
};
当您在生产中工作时,这应该是正确的解决方案
2021-03-24 17:01:51
你能解释一下passport.authorize是做什么的,为什么你需要scope、callbackurl等等,为什么你不能用clientId和secret来做?
2021-03-25 17:01:51
passport.authorizepassport.authenticate除了它不尝试更新当前会话之外,其他类似您需要通过,callbackURL因为在 OAuth 握手之后,Google 需要知道将用户重定向到何处,以便完成握手。
2021-03-27 17:01:51
是否有更简单的解决方案来使用 GMail 帐户在 NodeJS 中发送电子邮件?
2021-04-06 17:01:51

工作正常:

1- 安装nodemailer,如果未安装则打包(输入 cmd):npm install nodemailer

2- 转到https://myaccount.google.com/lesssecureapps并打开允许不太安全的应用程序

3-写代码:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'trueUsername@gmail.com',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: 'any@any.com', // sender address
    to: 'true@true.com', // list of receivers
    subject: 'test mail', // Subject line
    html: '<h1>this is a test mail.</h1>'// plain text body
};

transporter.sendMail(mailOptions, function (err, info) {
    if(err)
        console.log(err)
    else
        console.log(info);
})

4-享受!

谢谢!这真的很有帮助。
2021-03-15 17:01:51