Docker容器中Django发送邮件报错(Cannot assign requested address)解决方法
Docker环境下Django发送SMTP邮件报错[Errno 99] Cannot assign requested address的解决方法
核心问题分析
OSError: [Errno 99] Cannot assign requested address本质是网络连通性问题,结合本地正常、Docker环境异常的现象,重点排查容器网络配置、SMTP访问权限及配置正确性。
具体排查与解决步骤
1. 检查容器网络连通性
- 进入容器内部,直接测试SMTP服务器的可达性:
如果无法连通,说明容器没有出站访问SMTP服务器的权限:docker exec -it 你的容器名称 bash # 测试SMTP主机连通性(替换为你的SMTP服务器地址) telnet smtp.bk.ru 587 # 或用ping测试DNS解析 ping smtp.bk.ru- 检查宿主机防火墙/安全组,是否允许容器IP段访问SMTP端口(常见587、465、25);
- 尝试切换容器网络模式为
host(运行容器时添加参数--network=host),绕过Docker NAT网络直接使用宿主机网络。
2. 验证SMTP配置准确性
- 确认
settings.py中的邮件配置与本地正常环境完全一致,重点检查:EMAIL_HOST = 'smtp.bk.ru' # 不要设为localhost/127.0.0.1(容器内localhost指向自身,而非宿主机) EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'volkodav2312@bk.ru' EMAIL_HOST_PASSWORD = '你的邮箱密码' - 如果SMTP服务部署在宿主机,容器内不要用
127.0.0.1,改用宿主机的局域网IP,或host.docker.internal(Docker Desktop适用,Linux环境需额外配置Docker允许该域名解析)。
3. 排查DNS解析问题
- 如果SMTP主机名无法解析,在容器内手动指定DNS服务器:
或在容器内测试解析:# 运行容器时添加DNS参数 docker run --dns=8.8.8.8 你的镜像名称nslookup smtp.bk.ru
4. 直接测试SMTP连接(排除Django封装问题)
在容器的Python环境中直接用smtplib测试,定位问题是否出在Django层:
import smtplib try: smtp_obj = smtplib.SMTP('smtp.bk.ru', 587) smtp_obj.starttls() smtp_obj.login('volkodav2312@bk.ru', '你的邮箱密码') smtp_obj.sendmail('volkodav2312@bk.ru', 'volkodav2312@inbox.ru', 'Test message from Docker') smtp_obj.quit() print("邮件发送成功") except Exception as e: print(f"报错:{str(e)}")
内容的提问来源于stack exchange,提问作者Razilator
相关产品推荐
相关产品推荐

