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
我启用了不太安全的应用程序.
完成
Gre*_*g T 49
请参阅nodemailer连接Gmail的官方指南:
https://community.nodemailer.com/using-gmail/
-
这样做之后对我有用:
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)
小智 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包,令我惊讶的是它有效.但是当我重新启动我的系统时,它给了我同样的错误,所以我不得不去打开不太安全的应用程序(我在工作后禁用它).
然后为了好玩我只是尝试了关闭(不太安全的应用程序)和挥发它再次工作!
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上测试了我的系统,然后部署到服务器(位于不同的国家),然后当我在生产服务器上尝试系统时,我看到了这个错误.我试过这些来解决它:
它使用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)
以上解决方案均不适合我.我使用了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)
我发现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-享受!
如果您使用 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)
出于某种原因,即使是验证码的事情,只允许不太安全的应用程序配置对我来说也不起作用。我必须执行另一个步骤,即启用 IMAP 配置:
从谷歌的帮助页面:https : //support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin
Google 已禁用不太安全的应用程序访问,以下是在 Nodejs 中使用 Gmail 的新流程
| 归档时间: |
|
| 查看次数: |
114716 次 |
| 最近记录: |