报错如下:
{ 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 || []));
});
修改完成后,重启生效
来源:CSDN
作者:小卒过河0104
链接:https://blog.csdn.net/liushimiao0104/article/details/103952927