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

Python应用在Docker容器中连接SMTP服务器报Errno 99错误如何解决?

问题原因与解决方案

Errno 99 Cannot assign requested address 在该场景下通常是容器出站网络限制、端口封禁、SMTP配置错误导致的,可按以下步骤排查解决:

1. 纠正配置误区

你在Dockerfile中添加的EXPOSE 25配置和该问题完全无关:EXPOSE是声明容器需要监听的入站端口,你作为客户端主动连接外部SMTP服务器的端口,不需要提前EXPOSE任何端口。

2. 网络配置排查

  • 先测试容器网络是否正常:运行容器时指定使用宿主机网络,验证功能是否正常:
    docker run --net=host <你的镜像名称>
    
    如果用host网络可以正常运行,说明默认Docker桥接网络存在DNS解析或出站限制:
    • 进入容器执行nslookup smtp.gmail.com检查是否能正常解析域名,解析失败可以在运行容器时指定公共DNS:
      docker run --dns 8.8.8.8 --dns 8.8.4.4 <你的镜像名称>
      
  • 检查宿主机/部署平台的出站规则:确认25、587、465端口的出站流量没有被安全组、防火墙、云服务商封禁。

3. SMTP配置修正

  • 大多数运营商、云服务商都会默认封禁25端口的出站流量用来防止垃圾邮件,建议直接改用Gmail提供的其他SMTP端口:
    • 587端口(TLS加密):适配原有starttls逻辑
    • 465端口(SSL加密):直接使用SMTP_SSL连接
  • Gmail早已不再支持直接使用账号密码登录SMTP服务,需要先开启账号两步验证,生成应用专用密码后替换原有登录密码。
  • 你的server变量未定义报错是因为连接失败时函数没有返回值,调用侧直接接收返回值就会出现未定义问题,需要补充异常返回逻辑。

修正后的SMTP连接代码示例:

import smtplib

def setupSMTPserver():
    try:
        # 改用587端口避免25端口封禁
        server = smtplib.SMTP(host="smtp.gmail.com", port=587)
        server.starttls()
        # 密码替换为你生成的Gmail应用专用密码
        server.login("eran.idar@gmail.com", "你的应用专用密码")
        return server
    except Exception as e:
        print(f"SMTP连接失败:{e}")
        # 异常时返回None,调用侧先判断返回值是否为None再使用
        return None

4. 非root用户权限排查

你在Dockerfile中使用了非root用户运行程序,部分系统安全策略会限制非root用户对外连接1024以下的端口(比如25端口),如果要继续使用25端口,可以临时注释Dockerfile中USER appuser相关配置用root用户测试,确认是权限问题后,更推荐直接改用587/465端口(均大于1024,无权限限制)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:36:03