带有Gmail和NodeJS的Nodemailer

ton*_*227 92 javascript node.js nodemailer

我尝试使用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' }
Run Code Online (Sandbox Code Playgroud)

我的控制器:

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('/');
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

bra*_*log 124

我通过转到以下网址解决了这个问题(使用我要发送邮件的帐户连接到谷歌时):

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

我启用了不太安全的应用程序.

完成

  • 自 2022 年 5 月 30 日起,常规 GMAIL 帐户不再具有安全性较低的应用程序功能。 (12认同)
  • 如果不启用此功能,它甚至无法在本地环境中工作。他明确提到它在本地环境中工作,而不是在远程服务器上工作。解决办法是什么? (2认同)

Gre*_*g T 49

请参阅nodemailer连接Gmail的官方指南:

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

-

这样做之后对我有用:

  1. 启用安全性较低的应用 - https://www.google.com/settings/security/lesssecureapps
  2. 暂时禁用验证码,以便您可以连接新设备/服务器 - https://accounts.google.com/b/0/displayunlockcaptcha

  • 2号解决了我的困境.我无法在谷歌的帐户设置中的任何地方找到该链接.谢谢! (14认同)
  • 对安全性较低的应用程序的支持将于 2022 年 5 月 30 日终止。请参阅此处的 Google 帮助:https://support.google.com/accounts/answer/6010255?p=less-secure-apps&amp;hl=en&amp;visit_id=637860305452437988-237633184&amp;rd=1# zippy=%2Cals-de-optie-toegang-door-minder-goed-beveiligde-apps-aanstaat-voor-je-account 不确定我是否仍然可以将 googlemail 与 nodemailer 一起使用。 (3认同)
  • 同样在这里。我之前做了#1,在本地主机上收到了电子邮件,然后转移到生产环境,但没有任何效果。#2 解决了我的生产问题。谢谢 (2认同)

Lau*_*rin 41

您应该使用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()
      }
    }
  };
Run Code Online (Sandbox Code Playgroud)

您需要转到Google云端控制台注册您的应用.然后,您需要检索要使用的帐户的访问令牌.你可以使用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);
      });
  });
};
Run Code Online (Sandbox Code Playgroud)

  • http://www.google.com/accounts/DisplayUnlockCaptcha - 这对我有用. (9认同)
  • 使用GMail帐户在NodeJS中发送电子邮件是否有更简单的解决方案? (7认同)

小智 34

简易方案:

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);
  }
});  
Run Code Online (Sandbox Code Playgroud)

步骤1:

访问https://myaccount.google.com/lesssecureapps并启用安全性较低的应用.如果这不起作用那么

第2步

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

对我来说,单独的第1步没有用,所以我不得不进入第2步.

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

然后为了好玩我只是尝试了关闭(不太安全的应用程序)和挥发它再次工作!

  • 第 1 步和第 2 步非常有帮助。谢谢你!在看到您的解决方案之前,我尝试了第 1 步,但没有奏效,但第 2 步是一种魔力! (2认同)

dan*_*pen 16

我有同样的问题.在我的Google安全设置中允许"安全性较低的应用"使其正常运行!


Cur*_*rse 14

许多答案建议允许安全性较低的应用程序,这实际上不是一个干净的解决方案。

相反,您应该生成专用于此用途的应用程序密码:

  1. 登录您的 Google 帐户
  2. 前往安检处
  3. 登录 Google下启用两步验证
  4. 在“登录 Google”下,单击“应用程序密码”
  5. 您现在将生成一个新密码。选择应用程序作为“邮件”,将设备选择为“其他”(自定义名称)并为其命名。
  6. 保存应用密码

您现在可以使用此应用程序密码代替登录密码。


Ang*_* M. 10

对我来说是这样的,使用端口和安全性(我有问题是使用PHP从gmail发送电子邮件而没有安全设置)

我希望能帮助别人.

var sendEmail = function(somedata){
  var smtpConfig = {
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL, 
                  // you can try with TLS, but port is then 587
    auth: {
      user: '***@gmail.com', // Your email id
      pass: '****' // Your password
    }
  };

  var transporter = nodemailer.createTransport(smtpConfig);
  // replace hardcoded options with data passed (somedata)
  var mailOptions = {
    from: 'xxxx@gmail.com', // sender address
    to: 'yyyy@gmail.com', // list of receivers
    subject: 'Test email', // Subject line
    text: 'this is some text', //, // plaintext body
    html: '<b>Hello world ?</b>' // You can choose to send an HTML body instead
  }

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

exports.contact = function(req, res){
   // call sendEmail function and do something with it
   sendEmail(somedata);
}
Run Code Online (Sandbox Code Playgroud)

此处列出所有配置(包括示例)


Ahm*_*ven 10

同样的问题也发生在我身上.我在localhost上测试了我的系统,然后部署到服务器(位于不同的国家),然后当我在生产服务器上尝试系统时,我看到了这个错误.我试过这些来解决它:

  1. https://www.google.com/settings/security/lesssecureapps已启用,但这不是我的解决方案
  2. https://g.co/allowaccess我允许从外面访问一段有限的时间,这解决了我的问题.

  • https://g.co/allowaccess链接对我来说是固定的(已经启用了lesssecureapps)-谢谢! (2认同)

sfn*_*fnd 9

尝试在您的Gmail帐户中禁用验证码; 可能是基于请求者的IP地址触发的.请参阅:如何将GMail用作免费的SMTP服务器并克服验证码


Gir*_*hod 8

它使用createTransport中的"nodemailer-smtp-transport"模块解决.

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

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));
Run Code Online (Sandbox Code Playgroud)


Ham*_*mid 7

以上解决方案均不适合我.我使用了NodeMailer文档中存在的代码.它看起来像这样:

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: 'user@example.com',
        serviceClient: '113600000000000000000',
        privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
}); 
Run Code Online (Sandbox Code Playgroud)


sci*_*lot 7

我发现Greg T的答案中提到的本文中介绍的最简单的方法是创建一个应用密码,该密码在为帐户启用2FA后可用。

myaccount.google.com>登录和安全>登录Google>应用密码

这为您提供了该帐户的备用密码,然后只需将nodemailer配置为普通的SMTP服务。

var smtpTransport = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "username@gmail.com",
        pass: "app password"
    }
});
Run Code Online (Sandbox Code Playgroud)

尽管Google建议Oauth2是最佳选择,但此方法很简单,并且尚未在此问题中提及。

额外提示:我还发现您可以将应用程序名称添加到“发件人”地址,GMail不会仅使用帐户电子邮件来代替它,就像您尝试使用其他地址一样。即。

from: 'My Pro App Name <username@gmail.com>'
Run Code Online (Sandbox Code Playgroud)


小智 7

工作正常:

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);
})
Run Code Online (Sandbox Code Playgroud)

4-享受!


mal*_*lix 5

如果您使用 Express,express-mailer包装nodemailer非常好并且非常易于使用:

//# config/mailer.js    
module.exports = function(app) {
  if (!app.mailer) {
    var mailer = require('express-mailer');
    console.log('[MAIL] Mailer using user ' + app.config.mail.auth.user);
    return mailer.extend(app, {
      from: app.config.mail.auth.user,
      host: 'smtp.gmail.com',
      secureConnection: true,
      port: 465,
      transportMethod: 'SMTP',
      auth: {
        user: app.config.mail.auth.user,
        pass: app.config.mail.auth.pass
      }
    });
  }
};

//# some.js
require('./config/mailer.js)(app);
app.mailer.send("path/to/express/views/some_view", {
  to: ctx.email,
  subject: ctx.subject,
  context: ctx
}, function(err) {
  if (err) {
    console.error("[MAIL] Email failed", err);
    return;
  }
  console.log("[MAIL] Email sent");
});

//#some_view.ejs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title><%= subject %></title>
  </head>
  <body>
  ... 
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


mel*_*ngs 5

出于某种原因,即使是验证码的事情,只允许不太安全的应用程序配置对我来说也不起作用。我必须执行另一个步骤,即启用 IMAP 配置:

从谷歌的帮助页面:https : //support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • 在右上角,单击设置设置。
  • 单击设置。
  • 单击转发和 POP/IMAP 选项卡。
  • 在“IMAP 访问”部分,选择启用 IMAP。
  • 单击保存更改。


Chi*_*tel 5

Google 已禁用不太安全的应用程序访问,以下是在 Nodejs 中使用 Gmail 的新流程

  1. 现在您必须在 Google 中启用两步验证(如何启用两步验证
  2. 您需要生成应用程序专用密码。转到Google 我的帐户 > 安全
  3. 点击应用程序密码 > 选择其他,您将获得应用程序密码
  4. 您可以使用普通的 smtp 以及电子邮件和应用程序密码。