Kiwi TCMS执行sendtestemail报OSError: [Errno 99]无法分配请求地址
错误原因
从调用栈可以定位到,错误触发点是Python的smtplib尝试建立到SMTP服务器的TCP连接阶段,属于系统层面的网络错误,和Kiwi TCMS、Django的代码逻辑无关。Errno 99 Cannot assign requested address的本质是发起socket连接时,要么配置的目标地址不可达导致路由选不到可用的源地址,要么手动绑定了不存在/不可用的本地源IP,导致连接无法建立。
排查解决步骤
- 核对SMTP配置项
检查Kiwi的邮件配置(容器内/Kiwi/settings.py、挂载的自定义配置文件、注入的环境变量都要查)里的EMAIL_HOST和EMAIL_PORT:- 禁止把SMTP地址填成
127.0.0.1/localhost:容器网络是隔离的,容器内的回环地址指向容器本身,不是宿主机。如果SMTP部署在Docker宿主机上,把地址改成Docker网桥的宿主机默认地址172.17.0.1,或者宿主机的内网物理IP即可 - 确认端口和加密模式匹配:明文SMTP默认25端口、SSL加密SMTP默认465端口、STARTTLS加密SMTP默认587端口,不要错填其他服务的端口
- 禁止把SMTP地址填成
- 容器内实测网络连通性
所有连通性测试必须在kiwi_web容器内部执行,宿主机测试通过不代表容器能通:
如果这一步直接报错连接失败,按以下方向排查:# 先进入容器 docker exec -it kiwi_web bash # 把<SMTP地址>、<SMTP端口>替换成你配置里的实际值,测试连通性 nc -zv <SMTP地址> <SMTP端口>- 检查SMTP服务的监听配置:如果SMTP服务只绑定了127.0.0.1,需要改成监听
0.0.0.0或者对应Docker网桥的IP,否则容器流量无法到达 - 检查防火墙/安全组规则:确认SMTP服务所在机器的防火墙、云服务商安全组放通了Docker网段的入站访问,对应SMTP端口没有被拦截
- 如果用的是公网SMTP服务(比如企业邮箱、第三方邮件推送服务),检查容器的出站网络是否正常,确认运营商、网络策略没有封禁25/465/587这类邮件常用端口
- 检查SMTP服务的监听配置:如果SMTP服务只绑定了127.0.0.1,需要改成监听
- 检查错误的源地址绑定配置
如果你在邮件配置里额外加了本地源IP绑定的参数,或者容器配置了出站网络的源IP强制绑定规则,确认绑定的IP是容器网卡实际持有的IP,不要绑定容器不存在的IP段地址,否则会直接触发这个错误。 - 验证修复结果
以上排查完成、nc测试连通正常后,重新执行原命令即可发送测试邮件:docker exec -it kiwi_web /Kiwi/manage.py sendtestemail user1@example1.tld
内容的提问来源于stack exchange,提问作者Chloe
相关产品推荐
相关产品推荐

