39

我已经在本地()设置了一个基本的 NodeJS 服务器(使用 nodemailer 模块)http://localhost:8080,以便我可以测试服务器是否真的可以发送电子邮件。

如果我正确理解了 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 页面上找不到上述问题的解决方案。有没有人有解决方案/建议?

谢谢!:-)

4

9 回答 9

79

答案在谷歌的消息中。

对于问题的第二部分,并响应

我实际上只是按照 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!'
});
于 2014-10-04T19:58:13.297 回答
30

过时:JSON 文件输出中不再存在 refreshToken 和 accessToken

对于那些真正想要使用 OAuth2 / 不想让应用程序“不那么安全”的人,您可以通过以下方式实现这一点

  1. 从google API 控制台搜索“Gmail API”,然后单击“启用”
  2. 按照https://developers.google.com/gmail/api/quickstart/nodejs中的步骤操作。在 quickstart.js 文件中,按照https://nodemailer.com/smtp/oauth2/故障排除中的建议将快速启动 js 文件中的SCOPESvar 从['https://www.googleapis.com/auth/gmail.readonly']更改为['https://mail.google.com/']
  3. 执行 (2) 中的步骤后,生成的 JSON 文件将包含Nodemailer 的 OAuth2 示例中acessToken所需的、refreshTokenexpires属性

这样您就可以使用 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 密码并降低您帐户的安全性。

于 2017-04-04T09:02:30.863 回答
17

我只是将我的域设置为: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 更改为您要发送电子邮件的电子邮件
  • 启用不太安全的应用程序
  • 暂时禁用验证码

祝你今天过得愉快 ;)

于 2017-06-07T20:20:29.833 回答
10

虽然上述答案确实有效,但我想指出,您可以通过以下两个步骤降低 Gmail 的安全性。

步骤1

Google 帐户:登录尝试被阻止 如果这是您您可以切换到由 Google 开发的应用程序(例如 Gmail)来访问您的帐户(推荐)或在https://www.google.com/settings/security/更改您的设置lesssecureapps使您的帐户不再受到现代安全标准的保护。

第2步

除了启用允许不太安全的应用程序之外,您可能还需要导航到https://accounts.google.com/DisplayUnlockCaptcha并单击继续。

于 2017-04-19T06:05:53.140 回答
5

您只需要谷歌身份验证的应用程序密码,然后在您的代码中替换您的谷歌密码。去这里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);
    }
});

截屏

于 2018-01-20T05:38:08.020 回答
4

出于调试目的,实现一个回调函数(他们从不在 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 文档。”

我在这里找到了这个答案

于 2015-11-19T14:05:55.257 回答
4

并安装 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 并将其更改为ON,因为某些应用和设备使用安全性较低的登录技术,这会使您的帐户更容易受到攻击。您可以关闭我们推荐的这些应用程序的访问权限,或者如果您想在有风险的情况下使用它们,则可以打开访问权限。

于 2018-09-08T13:35:02.033 回答
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' }
于 2016-11-22T11:52:48.873 回答
0

在此处输入图像描述

添加到 xShirase 答案只是提供启用的屏幕截图。还要安全地确认之前的尝试来自您。

Xshirase 值得所有赞成票。我只是显示屏幕截图。

于 2020-11-25T18:18:15.030 回答