nodemailer 失败,连接被拒绝,使用已知良好的 SMTP 服务器

Posted

技术标签:

【中文标题】nodemailer 失败,连接被拒绝,使用已知良好的 SMTP 服务器【英文标题】:nodemailer fails with connection refused, using known good SMTP server 【发布时间】:2019-06-20 10:54:26 【问题描述】:

我有一个邮件服务器设置和工作(在 Linode 上 dockerized dovecot/postfix,使用 tvial docker 映像) - 我可以从我的 macbook 上的 roundcube 和邮件客户端发送和接收邮件。

但是使用相同的 SMTP 服务器和凭据设置 nodemailer,我得到:

 Error: queryA ECONNREFUSED mail.xxxxx.com
    at errnoException (dns.js:50:10)
    at QueryReqWrap.onresolve [as oncomplete] (dns.js:238:19)
  code: 'EDNS',
  errno: 'ECONNREFUSED',
  syscall: 'queryA',
  hostname: 'mail.xxxxx.com',
  command: 'CONN' 

我正在使用文档中的示例脚本:

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

// async..await is not allowed in global scope, must use a wrapper
async function main()

   // Generate test SMTP service account from ethereal.email
  // Only needed if you don't have a real mail account for testing
  //let account = await nodemailer.createTestAccount();

  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport(
    host: "mail.xxxxx.com",
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: 
      user: "steve@xxxxx.com", 
      pass: "pppppp" 
    
  );

  // setup email data with unicode symbols
  let mailOptions = 
    from: '"Fred Foo ????" <foo@example.com>', // sender address
    to: "steve@zzzzz.com", // list of receivers
    subject: "Hello ✔", // Subject line
    text: "Hello world?", // plain text body
    html: "<b>Hello world?</b>" // html body
  ;

  // send mail with defined transport object
  let info = await transporter.sendMail(mailOptions)

  console.log("Message sent: %s", info.messageId);
  // Preview only available when sending through an Ethereal account
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));

  // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
  // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...


main().catch(console.error);

我也收到同样的错误,但没有尝试使用以下方式发送电子邮件:

transporter.verify((err, success) => 
    if (err) 
        console.error(err);
    else
        console.log('Your config is correct');
);

【问题讨论】:

【参考方案1】:

遇到了同样的问题。只需使用 5.0.0 之前的版本即可。

要安装特定版本,请使用npm install package@version

在我们的例子中:npm install nodemailer@4.7.0

【讨论】:

这个答案比投票更有价值!我花了几个小时来解决这个问题。开发人员如何判断最新的 nodemailer 是坏的? (在我的情况下为 6.5.0)。 nodemailer 开发团队感到羞耻。【参考方案2】:

我在通过生成 html 文件发送批量邮件时遇到了类似的问题。 这对我来说是因为 Linux 对打开文件的数量有限制,这会阻止打开每封邮件的电子邮件模板。

Linux 上的默认限制是 1024。 检查命令:ulimit -n

将打开文件数限制提高到最多 10000 个: ulimit -n 10000(我已经设置了10000)

提高当前shell中打开文件的数量限制: ulimit -s 10000

如果:您收到权限错误: 您需要在 /etc/limits.conf 或 /etc/security/limits.conf 文件中提高允许的限制(文件所在的位置取决于您的特定 Linux 发行版)。

例如,要允许机器上的任何人将打开文件的数量增加到 10000 个,请将该行添加到 limits.conf 文件中。

* hard nofile 10000

然后注销并重新登录到您的系统,您应该可以这样做:

ulimit -n 10000

没有权限错误。

它解决了我的问题。我在这里找到了解决方案: changing number of open files limit @将

【讨论】:

以上是关于nodemailer 失败,连接被拒绝,使用已知良好的 SMTP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

“连接失败:用户'root'@'localhost'的访问被拒绝(使用密码:YES)”来自php函数[重复]

curl: (7) 连接 127.0.0.1 端口 8000 失败:连接被拒绝

FileZilla尝试连接“ECONNREFUSED - 连接被服务器拒绝”失败。解决方案

连接到上游时connect()失败(111:连接被拒绝)

Tomcat/Hibernate 与 MySql 的连接失败,出现“通信链接失败”和“权限被拒绝”

确定ajax调用是不是由于不安全的响应或连接被拒绝而失败