Javascript 带Gmail和NodeJS的nodeEmailer
我尝试使用nodeEmailr来实现一个使用NodeJS的联系人表单,但是它只在本地工作,在远程服务器上不工作 我的错误消息:Javascript 带Gmail和NodeJS的nodeEmailer,javascript,node.js,nodemailer,Javascript,Node.js,Nodemailer,我尝试使用nodeEmailr来实现一个使用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)
[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('/');
}
});
}
你应该使用连接到Gmail的。不用担心,NodeEmailer已经知道了:
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()
}
}
};
您需要转到以注册您的应用程序。然后,您需要为希望使用的帐户检索访问令牌。你可以用它
以下是我的代码中的外观:
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);
});
});
};
我使用的是旧版本的nodemailer 0.4.1,出现了这个问题。我更新到0.5.15,现在一切正常 编辑package.json以反映更改
npm install
尝试在你的gmail帐户中禁用CAPTCHA;可能是根据请求者的IP地址触发的。
请参阅:我通过以下url解决了这个问题(使用我想发送邮件的帐户连接到google): 在那里,我启用了不太安全的应用程序
完成如果您使用Express,
Express-mailer
将NodeEmailr
包装得非常好,并且非常易于使用:
//# 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>
/#config/mailer.js
module.exports=函数(应用程序){
如果(!app.mailer){
var-mailer=require('express-mailer');
log(“[MAIL]Mailer使用用户”+app.config.MAIL.auth.user);
返回mailer.extend(应用程序{
发件人:app.config.mail.auth.user,
主机:“smtp.gmail.com”,
安全连接:正确,
港口:465,
transportMethod:'SMTP',
认证:{
用户:app.config.mail.auth.user,
通过:app.config.mail.auth.pass
}
});
}
};
//#some.js
需要('./config/mailer.js)(应用程序);
app.mailer.send(“path/to/express/views/some_view”{
致:ctx.email,
主题:ctx.subject,
上下文:ctx
},函数(err){
如果(错误){
控制台错误(“[MAIL]电子邮件失败”,错误);
返回;
}
console.log(“[MAIL]已发送电子邮件”);
});
//#一些_view.ejs
...
我也有同样的问题。在我的谷歌安全设置使它工作 对于我来说,使用端口和安全性是这样工作的(我在没有安全设置的情况下使用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);
}
var sendmail=function(somedata){
var smtpConfig={
主机:“smtp.gmail.com”,
港口:465,
secure:true,//使用SSL,
//您可以尝试使用TLS,但端口为587
认证:{
用户:'***@gmail.com',//您的电子邮件id
密码:'***'//您的密码
}
};
var transporter=nodeEmailer.createTransport(smtpConfig);
//用传递的数据替换硬编码选项(somedata)
var mailpoptions={
发件人:'xxxx@gmail.com“,//发件人地址
致:'yyyy@gmail.com“,//接收者列表
主题:'测试电子邮件',//主题行
text:'这是一些文本',//,//纯文本正文
你好,世界✔' // 您可以选择发送HTML正文
}
transporter.sendMail(邮件选项,函数(错误,信息){
如果(错误){
返回false;
}否则{
console.log('发送的消息:'+信息响应);
返回true;
};
});
}
exports.contact=功能(请求、回复){
//调用sendEmail函数并对其进行处理
发送电子邮件(somedata);
}
列出了所有配置(包括示例)同样的问题也发生在我身上。我在本地主机上测试了我的系统,然后将其部署到服务器(位于不同的国家/地区),然后在生产服务器上尝试该系统时,我看到了这个错误。我尝试了以下方法来修复它:
它是通过createTransport中的
nodeEmailer smtp传输
模块解决的
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '*******@gmail.com',
pass: '*****password'
}
}));
请参阅NodeEmailer的官方Gmail连接指南: - 完成此操作后,它对我有效:
您必须在代码中添加secureConnection类型。所有代码都正常,只剩下转到链接即可
继续向下滚动,你会发现允许不太安全的应用:打开并继续,你不会发现任何错误 简易解决方案:
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步:
转到此处并启用不太安全的应用程序。如果这不起作用,那么
步骤2
转到此处并启用/继续,然后重试
对我来说,单是第一步不起作用,所以我不得不进入第二步
我还尝试删除nodemailer smtp传输包,令我惊讶的是,它居然能正常工作。但是当我重新启动系统时,它给了我同样的错误,所以我不得不去打开不太安全的应用程序(我在工作后禁用了它)
然后,为了好玩,我只是用off(不太安全的应用)和vola试了一下,它又成功了 上述解决方案中没有一个对我有效。我使用了中存在的代码。看起来是这样的:
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
}
});
只需参加以下活动:
1-在重新启动客户端浏览器之前,不接受允许低级别电子邮件的Gmail身份验证
2-如果你想用nodeEmailer发送电子邮件,但你不想使用xouath2协议,你应该写为secureconnection:false,如下所示
const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
routes.get('/test', (req, res) => {
res.status(200).json({ message: 'test!' });
});
routes.post('/Email', (req, res) =>{
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
secureConnection: false,
port: 587,
requiresAuth: true,
domains: ["gmail.com", "googlemail.com"],
auth: {
user: "your gmail account",
pass: "your password*"
}
});
var mailOptions = {
from: 'from@gmail.com',
to:'to@gmail.com',
subject: req.body.subject,
//text: req.body.content,
html: '<p>'+req.body.content+' </p>'
};
smtpTransport.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log('Error while sending mail: ' + error);
} else {
console.log('Message sent: %s', info.messageId);
}
smtpTransport.close();
});
})
module.exports = routes;
const routes=require('express').Router();
var nodeEmailer=require('nodeEmailer');
var smtpTransport=require('nodemailer-smtp-transport');
routes.get('/test',(req,res)=>{
res.status(200).json({message:'test!'});
});
routes.post('/Email',(请求、回复)=>{
var smtpTransport=nodemailer.createTransport({
主机:“smtp.gmail.com”,
安全连接:false,
港口:587,
是的,
域名:[“gmail.com”、“googlemail.com”],
认证:{
用户:“您的gmail帐户”,
通过:“您的密码*”
}
});
var mailpoptions={
发件人:'from@gmail.com',
致:'to@gmail.com',
主题:req.body.subject,
//文本:req.body.content,
html:“”+req.body.conten
const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
routes.get('/test', (req, res) => {
res.status(200).json({ message: 'test!' });
});
routes.post('/Email', (req, res) =>{
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
secureConnection: false,
port: 587,
requiresAuth: true,
domains: ["gmail.com", "googlemail.com"],
auth: {
user: "your gmail account",
pass: "your password*"
}
});
var mailOptions = {
from: 'from@gmail.com',
to:'to@gmail.com',
subject: req.body.subject,
//text: req.body.content,
html: '<p>'+req.body.content+' </p>'
};
smtpTransport.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log('Error while sending mail: ' + error);
} else {
console.log('Message sent: %s', info.messageId);
}
smtpTransport.close();
});
})
module.exports = routes;
host: 'smtp.gmail.com'
var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: "username@gmail.com",
pass: "app password"
}
});
from: 'My Pro App Name <username@gmail.com>'
npm install nodemailer --save
const nodemailer = require("nodemailer");
const smtpTransport = nodemailer.createTransport({
service: "Gmail",
auth: {
user: "example@gmail.com",
pass: "password"
},
tls: {
rejectUnauthorized: false
}
});
const mailOptions = {
from: "example@gmail.com",
to: sending@gmail.com,
subject: "Welcome to ",
text: 'hai send from me'.
};
smtpTransport.sendMail(mailOptions, function (error, response) {
if (error) {
console.log(error);
}
else {
console.log("mail sent");
}
});
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);
})