替代方法成功时,nodemailer偶尔会出现ETIMEDOUT

时间:2017-10-12 19:18:12

标签: node.js networking smtp nodemailer

上下文

  • Windows Server 2012 R2 Standard,不在网络代理之后
  • NodeJS 6.11.3
  • Nodemailer 4.1.0
  • 此代码段尝试向不需要身份验证的同一网络上的内部SMTP服务器发送电子邮件:

    var transporter = nodemailer.createTransport({
        host: "smtp.example.com",
        port: 25,
        secure: false
    });
    
    var mailOptions = {
        'from': 'noreply@example.com',
        'to': 'someone@example.com',
        'subject': 'test email',
        'text': 'some text for a body',
    };
    
    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            // do something
        } else {
            // do something else
        }
    });
    
  • 以下是我们正在执行ad hoc测试的替代脚本(VBScript)。

    Set objMail=CreateObject("CDO.Message")
        objMail.From="noreply@example.com"
        objMail.To="someone@example.com"
        objMail.Subject="Test from new server"
        objMail.TextBody = "This is a message."
        objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing")=2
        objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver")="smtp.example.com"
        objMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25
        objMail.Configuration.Fields.Update
        objMail.Send
    
    Set objMail=nothing
    

问题

  • 设置setInterval()以尝试每分钟向Nodemailer发送一次电子邮件。
  • 有时会发送电子邮件,但更多时候我们会收到以下错误。

    { Error: connect ETIMEDOUT XXX.XXX.XX.XX:25
            at Object.exports._errnoException (util.js:1020:11)
            at exports._exceptionWithHostPort (util.js:1043:20)
            at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1086:14)
        code: 'ECONNECTION',
        errno: 'ETIMEDOUT',
        syscall: 'connect',
        address: 'XXX.XXX.XX.XX',
        port: 25,
        command: 'CONN' }
    
  • 重启服务器,调用脚本的频率等没有明显的相关性
  • 最奇怪的是(对我而言)正好在40个Nodemailer尝试失败的中间,执行VBScript发送电子邮件就好了。它永远不会失败。

分辨率尝试

  • 我查看了几十个nodemailer用法示例并阅读了nodemailer文档。我不能说我做错了什么;防火墙没有阻止我们,我们不在网络代理后面,SMTP服务器不需要身份验证。
  • 我没有看到任何可以调查的名为 util.js net.js 的文件。
  • 我已阅读每篇提及ETIMEDOUT错误的Stack Overflow帖子。

问题

  • 我做错了什么?如果是,那是什么?
  • 如果我不是,那么可能导致这种行为的原因是什么?我应该问我的系统/网络管理员如何调查?

1 个答案:

答案 0 :(得分:0)

原来这是由我的申请外的问题引起的。因此,我正在回答原始问题集的以下部分,以防其他人得到相同的错误消息/遇到相同的间歇性行为,并在她/他的应用程序之外寻找可能的原因:“[w] hat会导致这个问题行为?我应该问我的系统/网络管理员如何调查?“

在我的示例中,host参数设置为“smtp.example.com”(当然,这不是真正的主机名)。在我们的网络上,我给出的主机名可以解析为两个IP地址中的任何一个。当它解析为一个IP地址时,到达SMTP服务器并接受该消息进行排队。当它解析为其他IP地址时,未到达SMTP服务器并且结果是timedout错误。

在网络管理员发现问题之前,我正在跳过主机名并直接发送到有效的IP地址。