我已在本地(http://localhost:8080
)设置了一个基本的NodeJS服务器(使用nodemailer模块),以便我可以测试服务器是否可以实际发送电子邮件。
如果我正确理解了SMTP选项(如果我错了请纠正我),我可以尝试从我的服务器向某人的电子邮件帐户发送电子邮件直接,或我可以发送电子邮件,仍然使用Node.js,但通过实际的电子邮件帐户(在这种情况下是我的个人Gmail帐户),即使用SMTP。此选项要求我通过NodeJS远程登录该帐户。
因此,在下面的服务器中,我实际上是尝试使用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帐户:登录尝试已被阻止 如果这是你 您可以切换到Google制作的应用,例如Gmail,以访问您的帐户(推荐)或更改 您在https://www.google.com/settings/security/lesssecureapps的设置,以便您的帐户为否 受现代安全标准保护更长时间。
我在nodemailer GitHub页面上找不到上述问题的解决方案。有没有人有解决方案/建议?
谢谢! : - )
答案 0 :(得分:46)
答案来自谷歌的消息。
将访问安全性较低的应用设置为启用
对于问题的第二部分,并回应
我实际上只是按照nodemailer github页面中的步骤操作,所以我的代码中没有错误
我将向您推荐nodemailer github页面,以及这段代码:
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'gmail.user@gmail.com',
pass: 'userpass'
}
});
它与您的代码略有不同,因为您拥有:nodemailer.createTransport("SMTP"
。
删除SMTP参数,它工作(刚刚测试)。另外,为什么将它封装在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!'
});
答案 1 :(得分:15)
对于那些真正想要使用OAuth2 /不想让应用程序“不太安全”的人,你可以通过
实现这一点SCOPES
var从['https://www.googleapis.com/auth/gmail.readonly']
更改为快速入门js文件中的['https://mail.google.com/']
,并按照https://nodemailer.com/smtp/oauth2/ acessToken
,refreshToken
和expires
属性
醇>
这样您可以使用OAuth2身份验证,如下所示
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密码并降低帐户的安全性。
答案 2 :(得分:8)
我只是将我的域名设置为: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>
确保:
度过愉快的一天;)
答案 3 :(得分:3)
出于调试目的,实现一个回调函数(它们永远不会在nodemailer github页面上执行)很方便,它显示错误消息(如果有的话)。
transporter.sendMail({
from: from,
to: to,
subject: subject,
html: text
}, function(err){
if(err)
console.log(err);
})
它帮助我解决了我的问题......原来新版本无法正常工作:
&#34;看起来nodemailer 1.0有突破性的变化,因此必须改为使用0.7:http://www.nodemailer.com/
截至2015年12月17日在nodemailer上发布的消息:
不要将Nodemailer从0.7或更低版本升级到1.0,因为存在重大变化。只要您愿意,您可以继续使用0.7分支。请参阅0.7 here。&#34;
的文档我找到了这个答案here
答案 4 :(得分:3)
您只需要谷歌身份验证的应用密码,然后在您的代码中替换您的谷歌密码。 去这里https://myaccount.google.com/apppasswords
示例代码:
const nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: "Gmail",
auth: {
user: 'example@gmail.com',
pass: 'app password here'
}
});
transporter.sendMail(option, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
答案 5 :(得分:1)
虽然上述答案确实有效,但我想指出您可以通过以下两个步骤降低Gmail的安全性。
第1步
Google帐户:登录尝试已被阻止如果是您的话您可以切换到Google制作的应用程序(如Gmail)来访问您的帐户(推荐)或更改https://www.google.com/settings/security/lesssecureapps设置,以便您的帐户无效受现代安全标准保护更长时间。
第2步
除了启用允许安全性较低的应用之外,您可能还需要导航到https://accounts.google.com/DisplayUnlockCaptcha并点击“继续”。
答案 6 :(得分:0)
试试这段代码吧。
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 your app',
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 sending email');
console.dir({success: true, existing: false, sendError: false});
console.dir(response);
res.end('Successful in sending email');
}
});
}).listen(8000);
console.log('Server listening on port 8000');
回复:
Successful in sending 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' }
答案 7 :(得分:0)
并安装smtp模块作为依赖项:
npm install smtp
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'gmail',
type: "SMTP",
host: "smtp.gmail.com",
secure: true,
auth: {
user: 'writeYourGmailId@gmail.com',
pass: 'YourGmailPassword'
}
});
var mailOptions = {
from: 'xyz.khan704@gmail.com',
to: 'azran.khan704@gmail.com',
subject: 'Sending Email to test Node.js nodemailer',
text: 'That was easy to test!'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error);
} else {
console.log('Email sent');
}
});
转到 https://myaccount.google.com/lesssecureapps 并打开进行更改,因为 某些应用和设备使用不太安全的登录技术,这会使您的帐户更容易受到攻击。您可以关闭我们建议的这些应用程序的访问权限,也可以在有风险的情况下如果要使用它们,则打开访问权限。
答案 8 :(得分:0)