【问题标题】:Nodemailer send email without smtp transportNodemailer 无需 smtp 传输即可发送电子邮件
【发布时间】:2014-04-11 15:03:56
【问题描述】:

我正在尝试通过没有 SMTP 传输的 nodemailer 发送电子邮件。所以我做到了:

var mail = require("nodemailer").mail;

mail({
    from: "Fred Foo ✔ <foo@blurdybloop.com>", // sender address
    to: "******@gmail.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
});

但是当我跑步时,我明白了:

> node sendmail.js
Queued message #1 from foo@blurdybloop.com, to vinz243@gmail.com
Retrieved message #1 from the queue, reolving gmail.com
gmail.com resolved to gmail-smtp-in.l.google.com for #1
Connecting to gmail-smtp-in.l.google.com:25 for message #1
Failed processing message #1
Message #1 requeued for 15 minutes
Closing connection to the server

Error: read ECONNRESET
    at errnoException (net.js:901:11)
    at TCP.onread (net.js:556:19)

我在 Windows 7 32 上。

编辑 这似乎是一个与 Windows 相关的错误,因为它在 linux 上工作

编辑#2

在 git shell 上,如果我输入 telnet smtp.gmail 587 它会在这里被阻止:

220 mx.google.com ESMTP f7...y.24 -gsmtp

【问题讨论】:

  • 确保您已允许通过连接到 gmail smtp 的端口进行连接,首先测试 telnet smtp.gmail.com 587
  • 我在 Windows 上,所以telnet 命令不起作用。
  • Windows 用户 :D,您可以启用它social.technet.microsoft.com/wiki/contents/articles/…。或者使用其他一些客户端,比如 Putty。
  • 没人有答案吗?我不想浪费 100 声望...

标签: node.js email nodemailer


【解决方案1】:

从您的示例输出看来,它似乎连接到了错误的端口 25,打开的 gmail smtp 端口是 465 用于 SSL 和其他 587 TLS。

Nodemailer 根据电子邮件域检测到正确的配置,在您的示例中,您没有设置传输器对象,因此它使用配置的默认端口 25。要更改端口,请在选项中指定类型。

这是应该与 gmail 一起使用的小示例:

var nodemailer = require('nodemailer');

// Create a SMTP transport object
var transport = nodemailer.createTransport("SMTP", {
        service: 'Gmail',
        auth: {
            user: "test.nodemailer@gmail.com",
            pass: "Nodemailer123"
        }
    });

console.log('SMTP Configured');

// Message object
var message = {

    // sender info
    from: 'Sender Name <sender@example.com>',

    // Comma separated list of recipients
    to: '"Receiver Name" <nodemailer@disposebox.com>',

    // Subject of the message
    subject: 'Nodemailer is unicode friendly ✔', 

    // plaintext body
    text: 'Hello to myself!',

    // HTML body
    html:'<p><b>Hello</b> to myself <img src="cid:note@node"/></p>'+
         '<p>Here\'s a nyan cat for you as an embedded attachment:<br/></p>'
};

console.log('Sending Mail');
transport.sendMail(message, function(error){
  if(error){
      console.log('Error occured');
      console.log(error.message);
      return;
  }
  console.log('Message sent successfully!');

  // if you don't want to use this transport object anymore, uncomment following line
  //transport.close(); // close the connection pool
});

【讨论】:

  • 谢谢它的工作...但我不想登录。如果我将它从 SMTP 更改为直接,它会告诉我它已成功发送但我没有收到任何东西......
  • 不想登录是什么意思? gmail SMTP 服务器需要它,如果您想在没有身份验证的情况下发送电子邮件,您可以设置自己的 SMTP 服务器。
  • 我想使用直接传输,所以我可以设置一个假地址,例如no-reply@vinz243.com
  • 以上传输对象在v0.7.1 中创建了支持。在最新的v2.7.0 创建传输对象使用var transporter = nodemailer.createTransport('smtps://user%40gmail.com:pass@smtp.gmail.com');
【解决方案2】:

看起来当前的nodemailer 不再可以选择不使用 smtp 发送邮件了。我建议查看sendmail 库,它NOT 需要任何 smtp/auth 来发送电子邮件。它为您提供与在 linux 中使用 sendmail 类似的体验。

const sendmail = require('sendmail')();

sendmail({
  from: 'test@finra.org',
  to: 'YourName@gmail.com',
  subject: 'Hello World',
  html: 'Hooray NodeJS!!!'
}, function (err, reply) {
  console.log(err && err.stack)
  console.dir(reply)
})

您还可以打开silent 以使其不那么冗长:const sendmail = require('sendmail')({silent: true});。需要注意的一件事是发件人不能是具有DMARC policy 的域,例如xxx@capitalone.com

【讨论】:

  • 如何强制 sendmail 直接发送到地址中的主机?例如我使用的是直接,否则我会收到错误“queryMx ENODATA”,但现在使用 sendmail 我再次看到此错误。
  • @Michael 不确定,您可能想先为您的 mx 服务器创建一个 dignslookup
  • 啊好的,我明白了问题所在。但是啊! “err”参数不是我可以轻松解析以确定错误是否为 4xx 的东西 - 我必须自己重试这些,不是吗?
  • @Michael 也许err 对象上有错误代码。我不太记得细节了。调试或在错误上执行console.log 将为您提供该对象的全貌。 :)
  • 在找到这个之前,我用 nodemailer 和 emailjs 挣扎了 2 天!请注意,gmail 会将这些邮件放在您的垃圾邮件文件夹中,因为它们无法验证发件人,但至少它适用于所有不断增加的安全检查。
【解决方案3】:

使用 nodemailer 0.7.1。
如果您之前安装了 nodemailer,则将其删除

npm remove nodemailer

现在安装它

npm install nodemailer@0.7.1

以下代码无需登录即可发送邮件,但只能在生产环境中使用,在本地无法使用

var mail = require("nodemailer").mail;

mail({
    from: "Fred Foo ✔ <foo@blurdybloop.com>", // sender address
    to: "bar@blurdybloop.com, baz@blurdybloop.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
});

【讨论】:

  • 如果您真的对将电子邮件凭据保存在代码中不感兴趣,那么带有上述代码 sn-p 的 nodemailer 0.7.1 效果很好。谢谢!
  • 这可以用 nodemailer 2.7.2 完成吗?如果不是,这两个版本是否可以共存于同一项目中需要它的其他模块?
  • 恢复到 v0.7.1 有效,但电子邮件未加密。如何加密消息?
【解决方案4】:

可能是 Windows 防火墙或防病毒软件阻止了传出访问。 尝试启用 nodemailer 调试消息。

启用调试

var nodemailer = require("nodemailer"),
  transport = nodemailer.createTransport('direct', {
    debug: true, //this!!!
  });

transport.sendMail({
    from: "Fred Foo ✔ <foo@blurdybloop.com>", // sender address
    to: "******@gmail.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world ✔", // plaintext body
    html: "<b>Hello world ✔</b>" // html body
}, console.error);

【讨论】:

  • 我禁用了 Windows 防火墙,但它没有任何改变。如何启用调试?
【解决方案5】:

这在 nodemailer 中似乎是可能的。不确定在提供其他答案时是否不存在。如此处所述:https://nodemailer.com/transports/sendmail/ 如果可以的话,您可以使用内置的 sendmail 进行发送。我已经测试了这个供我自己使用并且工作正常。 SMTP 有明显的优势,但说不可能是不正确的。

【讨论】:

    【解决方案6】:

    您需要有一个 SMTP 服务器,一个代表您转发电子邮件的电子邮件服务器。因此,要么设置您自己的 SMTP 服务器,例如 Haraka,要么向 Nodemailer 提供凭据以连接到其中一个,例如Gmail,MSN,雅虎。甚至我已经开始学习 NodeJs 并试图在我的项目中包含一个电子邮件功能,这也是我面临的同样问题。

    【讨论】:

    • 出于这个原因,我想使用 Direct。顺便说一句,不需要有适当的电子邮件来发送邮件。这就是为什么即使您不知道其凭据,您也可以使用他的电子邮件向某人发送电子邮件
    • 但是接收服务(SMTP 服务器)不会简单地拒绝您的邮件或发送垃圾邮件。它希望收到来自真实来源的电子邮件。
    • 没有回复的邮件不存在
    【解决方案7】:

    当您进行设置时,它允许发送邮件。 https://www.google.com/settings/security/lesssecureapps 这个对我有用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2018-08-06
      • 2018-05-03
      • 2022-08-17
      相关资源
      最近更新 更多