Nodemailer中createTestAccount()函数触发ECONNRESET错误的问题排查求助
createTestAccount() 抛出ECONNRESET错误的方案 我之前也碰到过一模一样的问题!当时没改代码突然就出现这个连接错误,折腾了好一会儿才找到几个可行的解决方向,分享给你:
调整请求频率,加个小延迟
虽然官方博客说高频调用可行,但说不定近期Ethereal悄悄调整了限流阈值。你现在每秒调用一次,试试改成每1.5-2秒调用一次,在测试代码里加个简单的延迟:// 在调用createTestAccount前加延迟 await new Promise(resolve => setTimeout(resolve, 1500)); const testAccount = await nodemailer.createTestAccount();我当时就是把频率降下来后,连接重置的问题直接消失了。
切换DNS服务器
有时候本地DNS解析api.nodemailer.com会出问题,导致连接中途重置。可以试试把你的设备DNS换成Google的8.8.8.8或者Cloudflare的1.1.1.1,很多时候能解决这类莫名其妙的连接问题。更新Nodemailer到最新版本
旧版本的Nodemailer可能和Ethereal服务器的TLS协议不兼容,导致握手失败触发ECONNRESET。执行npm update nodemailer升级到最新版,说不定就能修复这个问题。查GitHub Issues看是否是服务端问题
虽然Nodemailer没有公开的状态页,但你可以去Nodemailer的GitHub仓库搜ECONNRESET api.nodemailer.com,看看有没有其他开发者近期报告同样的问题。如果是服务端临时故障,那只能等官方修复,但如果是普遍问题,大概率会有开发者在Issues里讨论解决方案。临时用缓存机制复用账号(无需手动生成)
如果你不想手动生成账号,又想彻底避免高频调用的问题,可以做个简单的内存缓存,只在第一次测试时调用createTestAccount(),后续测试复用缓存的凭据:let cachedTestAccount = null; async function getTestAccount() { if (!cachedTestAccount) { cachedTestAccount = await nodemailer.createTestAccount(); } return cachedTestAccount; } // 测试时调用getTestAccount()代替直接调用createTestAccount() const testAccount = await getTestAccount();这个方案完全不需要手动介入,还能减少对Ethereal服务的请求,一举两得。
内容的提问来源于stack exchange,提问作者Imran Remtulla

