nodemailer发送邮件时出现ETIMEDOUT连接超时错误该如何解决
问题产生原因
- 代码冗余逻辑触发无效请求:你已经在transport配置里填写了真实的Gmail SMTP认证信息,不需要用到nodemailer的测试账号能力,但仍保留了示例代码中的
nodemailer.createTestAccount()调用,这个方法会主动请求nodemailer官方的测试账号接口https://api.nodemailer.com/user。当前这个接口请求超时,直接导致整个异步函数抛出错误终止,还没走到实际发邮件的逻辑。 - 网络策略变化:要么是你的部署服务器近期调整了出口访问规则,无法连通nodemailer的官方接口;要么是nodemailer官方的公共测试账号服务调整了访问策略,对部分地区或IP进行了限流、关停处理。
解决方案
- 优先删除冗余测试逻辑:直接移除
let testAccount = await nodemailer.createTestAccount();这行代码,同时可以删掉后续打印预览URL的相关代码(这部分代码仅针对测试账号生效,你用自有SMTP账号发信不会生成对应预览链接),即可解决当前的超时报错问题。 - 优化Gmail发信配置:目前Google已经不再支持普通账号密码的SMTP登录,如果你当前使用的
myauthpassword是账号的普通登录密码,后续也可能出现发信失败问题,建议先开启Google账号的两步验证,生成专用的应用密码替换当前的认证密码;如果你的服务部署在国内,也可以切换为腾讯企业邮、阿里云邮等国内邮件服务,降低网络连通性风险。 - 补充代码逻辑校验:你当前的session判断逻辑存在缺陷,
res.redirect('/login')执行后没有加return终止后续代码,未登录的用户请求也会触发后面的发信逻辑,建议调整为:
if (!req.session.loggedin) { res.redirect('/login') return req.session.destroy() }
内容的提问来源于stack exchange,提问作者gianlps
相关产品推荐
相关产品推荐

