使用nodemailer通过Node.js发送电子邮件不起作用

我已经在本地( http://localhost:8080 )build立了一个基本的NodeJS服务器(使用nodemailer模块),这样我就可以testing服务器是否可以发送电子邮件。

如果我正确理解了SMTP选项(如果我错了,请纠正我),我可以尝试直接从我的服务器发送电子邮件到某人的电子邮件帐户, 或者我可以使用Node.js发送电子邮件,但是通过一个真实的电子邮件帐户 (在这种情况下,我的个人Gmail帐户),即使用SMTP。 这个选项要求我通过NodeJS远程login到这个帐号。

所以在下面的服务器中,我实际上是试图使用NodeJs从我的个人电子邮件帐户发送电子邮件到我的个人电子邮件帐户。

这是我的简单服务器:

 var nodemailer = require('nodemailer'); var transporter = nodemailer.createTransport("SMTP", { service: 'Gmail', auth: { user: '*my personal Gmail address*', pass: '*my personal Gmail password*' } }); var http = require('http'); var httpServer = http.createServer(function (request, response) { transporter.sendMail({ from: '*my personal Gmail address*', to: '*my personal Gmail address*', subject: 'hello world!', text: 'hello world!' }); }).listen(8080); 

但是,它不工作。 我收到了谷歌的一封电子邮件:

Google帐户:login尝试被阻止如果这是您可以切换到由Google制作的应用程序(如Gmail)以访问您的帐户(推荐)或者通过https://www.google.com/settings/security/更改您的设置lesssecureapps,以便您的帐户不再受现代安全标准的保护。

在nodemailer GitHub页面找不到上述问题的解决scheme。 有没有人有解决scheme/build议?

谢谢! 🙂

答案是在谷歌的消息。

  • 转到: https : //www.google.com/settings/security/lesssecureapps

  • 访问不太安全的应用程序设置为启用

对于问题的第二部分,并作出回应

我实际上只是简单地按照从nodemailer github页面的步骤,所以没有在我的代码错误

我会引用你到nodemailer的github页面,这段代码:

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

它与你的代码略有不同,事实上你有: nodemailer.createTransport("SMTP" 。删除SMTP参数,它的工作原理(刚刚testing)。为什么封装在http服务器?下面的工作:

 var nodemailer = require('nodemailer'); var transporter = nodemailer.createTransport({ service: 'Gmail', auth: { user: 'xxx', pass: 'xxx' } }); console.log('created'); transporter.sendMail({ from: 'xxx@gmail.com', to: 'xxx@gmail.com', subject: 'hello world!', text: 'hello world!' }); 

对于那些真正想要使用OAuth2 /不希望使应用程序“不太安全”,您可以通过

  1. 从google API控制台search“Gmail API”,然后点击“启用”
  2. 按照https://developers.google.com/gmail/api/quickstart/nodejs中的步骤操作。 在quickstart.js文件中,在快速入门js中将SCOPES var从['https://www.googleapis.com/auth/gmail.readonly']更改为['https://mail.google.com/']文件提供的故障排除在https://nodemailer.com/smtp/oauth2/
  3. 按照(2)中的步骤,生成的JSON文件将包含acessTokenrefreshToken ,以及在OAuth2 Examples for Nodemailer中所需的expires属性

这样,您可以使用如下的OAuth2身份validation

 let transporter = nodemailer.createTransport({ service: 'Gmail', auth: { type: 'OAuth2', user: 'user@example.com', clientId: '000000000000-xxx0.apps.googleusercontent.com', clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0', refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx', accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x', expires: 1484314697598 } }); 

而不是以纯文本格式存储您的Gmail密码,并降低您帐户的安全性。

为了debugging目的,实现一个callback函数(它们从不在nodemailer的github页面上)显示错误消息(如果有的话)是很方便的。

 transporter.sendMail({ from: from, to: to, subject: subject, html: text }, function(err){ if(err) console.log(err); }) 

它帮助我解决了我的问题…发现新版本无法正常工作:

“看起来nodemailer 1.0有突破性改变,所以必须使用0.7: http ://www.nodemailer.com/

2015年12月17日发布在nodemailer上的消息:

不要将Nodemailer从0.7或更低版​​本升级到1.0,因为有重大更改。 只要你喜欢,你可以继续使用0.7分支。 请参阅0.7的文档。“

我在这里find了这个答案

我只是设置我的域名:smtp.gmail.com,它的工作原理。 我正在使用VPS Vultr。

代码:

 const nodemailer = require('nodemailer'); const ejs = require('ejs'); const fs = require('fs'); let transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 465, secure: true, auth: { user: 'xxx@gmail.com', pass: 'xxx' } }); let mailOptions = { from: '"xxx" <xxx@gmail.com>', to: 'yyy@gmail.com', subject: 'Teste Templete ✔', html: ejs.render( fs.readFileSync('e-mail.ejs', 'utf-8') , {mensagem: 'olá, funciona'}) }; transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log('Message %s sent: %s', info.messageId, info.response); }); 

我的ejs模板(e-mail.ejs):

 <html> <body> <span>Esse é um templete teste</span> <p> gerando com o EJS - <%=mensagem%> </p> </body> </html> 

确保:

  • 安装ejs: npm install ejs –save
  • 安装nodemailer: npm install nodemailer –save
  • ping到smtp.gmail.com的作品: ping smtp.gmail.com
  • 将xxx@gmail.com更改为您的gmail电子邮件
  • 将yyy@gmail.com更改为您要发送电子邮件的电子邮件地址
  • 启用安全性较低的应用
  • 暂时禁用Captcha

祝你今天愉快 ;)

虽然上面的答案确实起作用,但我想指出的是,您可以通过以下两个步骤来降低Gmail的安全性。

步骤1

Google帐户:login尝试被阻止如果这是您可以切换到由Google制作的应用程序(如Gmail)以访问您的帐户(推荐)或者通过https://www.google.com/settings/security/更改您的设置lesssecureapps,以便您的帐户不再受现代安全标准的保护&#x3002;

第2步

除了启用允许安全性较低的应用程序之外,您还可能需要导航到https://accounts.google.com/DisplayUnlockCaptcha并点击继续&#x3002;

试试这个代码它为我工作。

 var http = require('http'); var nodemailer = require('nodemailer'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var fromEmail = 'akarthi@xyz.com'; var toEmail = 'akarthi@xyz.com'; var transporter = nodemailer.createTransport({ host: 'domain', port: 587, secure: false, // use SSL debug: true, auth: { user: 'fromEmail@xyz.com', pass: 'userpassword' } }); transporter.sendMail({ from: fromEmail, to: toEmail, subject: 'Regarding forget password request', text: 'This is forget password response from youapp', html: '<p>Your password is <b>sample</b></p>' }, function(error, response){ if(error){ console.log('Failed in sending mail'); console.dir({success: false, existing: false, sendError: true}); console.dir(error); res.end('Failed in sending mail'); }else{ console.log('Successful in sedning email'); console.dir({success: true, existing: false, sendError: false}); console.dir(response); res.end('Successful in sedning email'); } }); }).listen(8000); console.log('Server listening on port 8000'); 

响应:

 Successful in sedning email { success: true, existing: false, sendError: false } { accepted: [ 'akarthi@xyz.com' ], rejected: [], response: '250 2.0.0 uAMACW39058154 Message accepted for delivery', envelope: { from: 'akarthi@xyz.com', to: [ 'akarthi@xyz.com' ] }, messageId: '1479809555147-33de4987-29d605fa-6ee150f1@xyz.com' }