带有Gmail和NodeJS的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' } 

我的控制器:

 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('/'); } }); } 

我解决了这个问题,通过转到以下url(而连接到谷歌与我想发送邮件的帐户):

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

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

完成

您应该使用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云端控制台注册您的应用。 然后,您需要检索您希望使用的帐户的访问令牌。 你可以使用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); }); }); }; 

我有同样的问题。 在我的Google安全设置中允许“不太安全的应用程序”使其工作!

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

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

这样做后适用于我:

  1. 启用不太安全的应用程序 – https://www.google.com/settings/security/lesssecureapps
  2. 暂时禁用validation码,以便连接新的设备/服务器 – https://accounts.google.com/b/0/displayunlockcaptcha

尝试在您的Gmail帐户中禁用validation码。 可能是基于请求者的IP地址触发的。 请参阅: 如何使用GMail作为一个免费的SMTP服务器,并克服validation码

同样的问题也发生在我身上。 我在本地testing了我的系统,然后部署到服务器(位于不同的国家),然后当我在生产服务器上尝试系统时,我看到了这个错误。 我试图解决这个问题:

  1. https://www.google.com/settings/security/lesssecureapps启用它,但这不是我的解决scheme
  2. https://g.co/allowaccess我允许有限的时间从外部访问,这解决了我的问题。;

简单解决scheme

 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并启用/继续,然后尝试。;

对我来说,第一步没有工作,所以我不得不去第2步。

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

然后为了好玩,我只是试了一下(不太安全的应用程序),并挥发它再次工作!

 exports.mailSend = (res, fileName, object1, object2, to, subject, callback)=> { var smtpTransport = nodemailer.createTransport('SMTP',{ //smtpTransport host: 'hostname, port: 1234, secureConnection: false, // tls: { // ciphers:'SSLv3' // }, auth: { user: 'username', pass: 'password' } }); res.render(fileName, { info1: object1, info2: object2 }, function (err, HTML) { smtpTransport.sendMail({ from: "mail@from.com", to: to, subject: subject, html: HTML } , function (err, responseStatus) { if(responseStatus) console.log("checking dta", responseStatus.message); callback(err, responseStatus) }); }); } 

您必须在代码中添加secureConnectiontypes。

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

我希望能帮助别人。

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

这里列出了所有的configuration(包括例子)

它使用createTransport中的“nodemailer-smtp-transport”模块来解决。

 var smtpTransport = require('nodemailer-smtp-transport'); var transport = nodemailer.createTransport(smtpTransport({ service: 'gmail', auth: { user: '*******@gmail.com', pass: '*****password' } })); 

如果你使用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> 

非上述解决scheme为我工作。 我使用了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 } }); 

我使用的是旧版本的nodemailer 0.4.1,并有此问题。 我更新到0.5.15,现在一切正常。

编辑package.json以反映变化

 npm install 

所有你的代码是好的,只剩下的东西只是去链接https://myaccount.google.com/security

并保持向下滚动,你会发现允许不太安全的应用程序:打开并保持开启,你会发现没有错误。