使用 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('/');
}
});
}
261339 次浏览

你应该使用 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()
}
}
};

你需要去 谷歌云控制台注册你的应用程序。然后,您需要检索希望使用的帐户的访问令牌。你可以使用 护照

我的代码是这样的:

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

我在使用旧版本的 nodemailer0.4.1时遇到了这个问题。我更新到0.5.15,现在一切正常。

然后编辑 package.json 以反映更改

npm install

尝试禁用 gmail 帐户中的 captchas; 可能会根据请求者的 IP 地址触发。 见: 如何使用 GMail 作为一个免费的 SMTP 服务器并克服 captcha

我通过访问以下网址解决了这个问题(当连接到我想发送邮件的帐户的谷歌时) :

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

在那里,我启用了不太安全的应用程序。

成交

如果你使用 Express,express-mailerwrapsnodemailer非常好,非常容易使用:

//# 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>

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

对我来说就是这样,使用端口和安全性(我有问题发送电子邮件从 gmail 使用 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);
}

所有配置都列出了 给你(包括示例)

我也遇到了同样的问题。我在本地主机上测试了我的系统,然后部署到服务器(位于不同的国家) ,然后当我在生产服务器上尝试系统时,我看到了这个错误。我试着用这些来修理它:

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

它使用 createTransport 内部的 nodemailer-smtp-transport模块解析。

var smtpTransport = require('nodemailer-smtp-transport');


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

参见 nodemailer 官方 Gmail 连接指南:

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

-

这样做之后,对我来说很有效:

  1. 启用不太安全的应用程序 -https://www.google.com/settings/security/lesssecureapps
  2. 暂时禁用验证码,以便连接新设备/服务器 -https://accounts.google.com/b/0/displayunlockcaptcha
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)
});
});
}

必须在代码中添加 secureConnection 类型。

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

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

简单的解决方案:

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

第一步:

到这里 https://myaccount.google.com/lesssecureapps和启用不太安全的应用程序。如果这不工作,然后

步骤2

到这里 https://accounts.google.com/DisplayUnlockCaptcha并启用/继续,然后尝试。

对我来说,第一步本身不起作用,所以我必须进入第二步。

我还尝试删除 nodemailer-smtp-Transport 软件包,令我惊讶的是它居然有效。但是当我重新启动我的系统时,它给了我同样的错误,所以我不得不去打开不太安全的应用程序(我在工作之后禁用了它)。

然后为了好玩,我只是尝试了关闭(不太安全的应用程序)和沃拉它再次工作!

以上的解决办法对我都不管用。我使用了 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
}
});

只要参加那些: 1-在重启客户端浏览器之前,允许低级别电子邮件的 Gmail 身份验证无法接受 2-如果你想发送电子邮件与 nodemailer,你不想使用 xouath2协议,你应该写为 secureconnect: 假如下面

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'

然后点击下面的链接启用“ less secureapps”

Https://myaccount.google.com/lesssecureapps

我发现最简单的方法,在 Greg T 的回答中提到的 这篇文章中描述的,是创建一个应用程序密码,该密码在为该帐户打开2FA 之后可用。

Myaccount.Google.com > 登入及保安 > 登入谷歌 > 应用程式密码

这为帐户提供了一个替代密码,然后只需将 nodemailer 配置为普通的 SMTP 服务即可。

var smtpTransport = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: "username@gmail.com",
pass: "app password"
}
});

虽然 Google 推荐 Oauth2作为最佳选择,但是这个方法很简单,而且在这个问题中还没有提到。

额外的提示: 我还发现你可以把你的应用程序名添加到“发件人”地址,GMail 不会像你尝试使用其他地址时那样只用账户电子邮件替换它。也就是说。

from: 'My Pro App Name <username@gmail.com>'

出于某种原因,仅仅允许不太安全的应用程序配置对我来说甚至验证码的事情不工作。我必须做另一个步骤来启用 IMAP 配置:

来自谷歌的帮助页面: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • 在右上角,单击“设置”。
  • 单击“设置”。
  • 单击转发和 POP/IMAP 选项卡。
  • 在“ IMAP Access”部分中,选择 启用 IMAP。
  • 单击“保存更改”。

首先安装节点破解程序

npm install nodemailer  --save

导入到 js 文件中

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

在我的申请中工作

工作良好:

1-安装 没有邮递员,包如果没有安装 (输入 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);
})

4-享受!

还有另一个选项可以使用 SendGrid 进行电子邮件传递,而且不会出现故障。很多时候,Nodemailer 给邮件失败,这可能会经常发生。

Nodemailer 可以在链接中找到。

您可能需要在您的 Gmail 帐户“ 允许不太安全的应用程序”(它的所有方式在底部)。你也可能需要“ 允许访问您的谷歌帐户”。 你也可能需要“ 允许访问您的谷歌帐户”。

我也有问题与 nodemailer 电子邮件发送时运行在 Vercellambda 的生产。

在我的例子中修复这个问题的方法是等待 sendMail灭口。

我还添加了 nodemailer-smtp-Transport,就像这个帖子中建议的那样,但是我不认为它有什么不同。

这就是我的全部功能:

const nodemailer = require('nodemailer');
const smtpTransport = require('nodemailer-smtp-transport');




const transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '***@gmail.com',
pass: process.env.SMTP_PASSWORD,
},
}));




async function contact(req: any, res: any) {
try {
const response = await transporter.sendMail({
from: '"*** <***gmail.com>', // sender address
to: "***@gmail.com", // list of receivers
subject: `***`, // Subject line
html: `${req.body.message}<br/><br/>${req.body.firstname} ${req.body.lastname} - <b>${req.body.email}</b>`, // html body
});
} catch (error: any) {
console.log(error);
return res.status(error.statusCode || 500).json({ error: error.message });
}


return res.status(200).json({ error: "" });
}


export default contact;

许多人回答了 允许不那么安全的应用程序的建议,这确实不是一个干净的解决方案。

相反,您应该生成一个专门用于此用途的 应用程序密码:

  1. 登录你的谷歌账户
  2. 转到 保安
  3. < strong > 登录 Google 下启用 两步验证
  4. < strong > 登录 Google 下单击 应用程序密码
  5. 现在生成一个新的密码。选择应用程序作为 邮件,设备作为 < strong > Other (Custom name) ,并命名它。
  6. 保存应用程序密码

您现在可以使用这个应用程序的密码,而不是您的登录密码。

这是我的 Nodemailer 配置,经过一些研究工作。

步骤1: 启用 less secureapp

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

步骤2: Gmail 的 Nodemailer 配置

设置传输器: 传输器将是一个可以发送邮件的对象。它是传输配置对象、连接 URL 或传输 插件实例

let transporter = nodemailer.createTransport({
service: 'gmail',                              // the service used
auth: {
user: process.env.EMAIL_FROM,              // authentication details of sender, here the details are coming from .env file
pass: process.env.EMAIL_FROM_PASSWORD,
},
});

写信

const message = {
from: 'myemail@gmail.com',                         // sender email address
to: "receiver@example.com, receiver2@gmail.com",   // reciever email address
subject: `The subject goes here`,
html: `The body of the email goes here in HTML`,
attachments: [
{
filename: `${name}.pdf`,
path: path.join(__dirname, `../../src/assets/books/${name}.pdf`),
contentType: 'application/pdf',
},
],

寄信

transporter.sendMail(message, function (err, info) {
if (err) {                                            // if error
console.log(err);
} else {
console.log(info);                                // if success
}
});

谷歌已经禁用了不太安全的应用程序访问,以下是在 Nodejs 使用 Gmail 的新进程

  1. 现在您必须在 Google 中启用2步验证(如何启用2步授权)
  2. 您需要生成应用程序特定密码
  3. 点击应用程序密码 > 选择其他,你会得到应用程序密码
  4. 您可以使用普通的 smtp 与电子邮件和应用程序密码。

Gmail 不再支持安全性较低的 选项。

从第三方发送电子邮件,gmail 也不允许与其 用户密码

您现在应该使用 应用程序密码来解决这个问题。 希望这个链接将有助于设置您的应用程序密码。 Https://support.google.com/mail/answer/185833?hl=en

正如 Yaach 指出的那样,从2022年5月30日起,Google 不再支持安全性较差的应用,而是转向了自己的 Gmail API

下面是带有 nodemailer 的 Gmail SMTP 的示例代码。

"use strict";
const nodemailer = require("nodemailer");


async function main() {
let transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
transportMethod: "SMTP",
secureConnection: true,
port: 465,
secure: true, // upgrade later with STARTTLS
auth: {
user: "yourEmail@gmail.com",
pass: "Your App  Specific password",
},
});


let info = await transporter.sendMail(
{
from: "yourEmail@gmail.com",
to: "to@gmail.com",
subject: "Testing Message Message",
text: "I hope this message gets delivered!",
html: "<b>Hello world?</b>", // html body
},
(err, info) => {
if (err) {
console.log(err);
} else {
console.log(info.envelope);
console.log(info.messageId);
}
}
);
}


main();