nodemailer在Linux服务器上dns无法解析域名

丶灬走出姿态 提交于 2020-01-13 23:35:35

报错如下:

 { Error: queryA ETIMEOUT smtp.qq.com
 at QueryReqWrap.onresolve [as oncomplete] (dns.js:201:19)
errno: 'ETIMEOUT',
code: 'EDNS',
syscall: 'queryA',
hostname: 'smtp.qq.com',
command: 'CONN' }
即配置了hosts将smtp.qq.com域名指向一个IP地址,还是无法解析。

通过使用dns.lookup进行域名解析,发现又能正常解析,猜想是不是nodemailer域名解析与当前dns版本不匹配导致,

通过跟踪代码发现在node_modules/nodemailer/lib/shared/index.js文件中其在调用发送邮件使用的dns解析如下:

dns['resolve' + family](hostname, (err, addresses) => {
    if (err) {
        switch (err.code) {
            case dns.NODATA:
            case dns.NOTFOUND:
            case dns.NOTIMP:
            case dns.SERVFAIL:
            case dns.CONNREFUSED:
            case 'EAI_AGAIN':
                return callback(null, []);
        }
        return callback(err);
    }
    return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));
});

可以看到并非使用的lookup进行解析,我部署到服务器一直在这里无法解析,但是本地却一直能够解析,经常测试知道使用lookup方法一定能够解析,于是将此处代码修改如下 :

dns.lookup(hostname, (err, addresses, family) => {
        if (err) {
            switch (err.code) {
                case dns.NODATA:
                case dns.NOTFOUND:
                case dns.NOTIMP:
                case dns.SERVFAIL:
                case dns.CONNREFUSED:
                case 'EAI_AGAIN':
                    return callback(null, []);
            }
            return callback(err);
        }
    return callback(null,Array.isArray(addresses) ? addresses : [].concat(addresses || []));
});

修改完成后,重启生效

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!