You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker环境运行Node服务出现connect ETIMEDOUT超时错误如何解决?

问题根因

启动超时直接原因

你当前配置的MAIL_DRIVER=ethereal,对应的EtherealMailProvider在构造初始化阶段,会自动调用nodemailer.createTestAccount()方法,该方法需要主动请求https://api.nodemailer.com申请测试账号,你的运行环境(Docker容器/宿主机)无法正常访问该外网地址,触发连接超时错误导致应用启动失败。

切换Mailjet驱动不生效原因

  1. mail.ts配置中,driver的类型定义仅包含ethereal和ses两个可选值,未加入mailjet枚举支持,即使修改.env的MAIL_DRIVER参数也不会命中你编写的MailjetProvider逻辑
  2. 你的.env配置文件中未补充Mailjet服务的必填参数,即使触发Mailjet初始化逻辑也会因配置缺失报错
解决方案

方案1:临时跳过邮件服务初始化(开发场景无需发邮件时用)

直接注释掉项目中邮件服务的全局初始化逻辑,或者新增Mock邮件驱动实现,所有发信逻辑直接空跑不发起任何网络请求,即可避开启动时的外网调用。

方案2:修复Ethereal驱动可用性

  • 先在宿主机执行命令测试网络连通性:
    curl https://api.nodemailer.com/user
    
    • 若宿主机能正常返回结果,说明是Docker容器网络配置问题,检查docker-compose配置是否允许容器访问外网,可手动进入容器执行上述curl命令验证
    • 若宿主机也无法访问,说明你的网络环境限制了该地址的访问,直接换用其他邮件驱动即可

方案3:正确配置Mailjet驱动

  1. 修改mail.ts的driver类型定义,补充mailjet选项:
driver: 'ethereal' | 'ses' | 'mailjet';
  1. 在.env文件中补充Mailjet必填配置:
MAIL_DRIVER=mailjet
MAILJET_HOST=in-v3.mailjet.com
MAILJET_PORT=587
MAILJET_USER=你申请的Mailjet API Key
MAILJET_PASS=你申请的Mailjet Secret Key
MAIL_FROM=你在Mailjet平台备案的发件人邮箱
MAIL_FROM_NAME=自定义发件人名称
  1. 检查项目的依赖注入配置,确保当MAIL_DRIVER=mailjet时,容器会注入你实现的MailjetProvider实例,而不是其他邮件驱动实现

额外Docker网络排查

如果所有配置正确仍出现超时,可进入运行的容器内部手动测试目标地址连通性,排查是否是Docker的DNS、代理配置导致外网访问异常:

# 进入容器
docker exec -it 你的应用服务容器名 /bin/sh
# 测试Mailjet服务连通性
telnet in-v3.mailjet.com 587

内容的提问来源于stack exchange,提问作者mazha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:54:03