Docker容器中Django发送邮件报错:Cannot assign requested address
解决Docker中Django注册时发送SMTP邮件报OSError [Errno 99]的问题
问题分析
报错[Errno 99] Cannot assign requested address发生在Socket创建连接阶段,结合你本地环境正常、Docker环境异常的情况,核心原因是Docker容器内无法正常建立到外部SMTP服务器(smtp.gmail.com:465)的网络连接,而非邮件配置本身错误。
解决方案
1. 移除不必要的端口映射
你的docker-compose.yml中映射了465:465,但Django作为SMTP客户端是主动发起连接到外部服务器,不需要暴露这个端口。该映射可能导致端口占用或网络冲突,先删除这一行:
# 删掉以下无效映射 # - 465:465
修改后重启容器:
docker-compose down && docker-compose up --build
2. 验证容器内网络连通性
进入Web容器,测试能否访问Gmail的SMTP服务器:
# 进入Web容器(替换为你的容器名,默认是web) docker exec -it <web-container-name> /bin/bash # 测试DNS解析是否正常 ping smtp.gmail.com # 测试端口连通性(无telnet则先安装:apt update && apt install telnet -y) telnet smtp.gmail.com 465
如果ping不通或telnet无法建立连接,说明容器网络存在问题:
- 先确认宿主机能否正常访问smtp.gmail.com:465
- 可临时将容器网络模式改为
host排查(不推荐生产环境):
在docker-compose.yml的web服务中添加:
同时删除network_mode: "host"ports: - 8000:8000(host模式下无需端口映射),重启容器测试。
3. 检查Gmail配置细节
即使本地正常,仍需确认:
- 若账号开启两步验证,必须使用应用专用密码代替普通密码,普通密码会被谷歌拒绝
- 未开启两步验证的账号,需确保已启用“允许不太安全的应用访问”(该选项已逐步废弃,优先推荐应用专用密码)
4. 排除Django逻辑问题
切换到文件邮件后端,验证注册流程本身是否正常:
修改settings.py中的邮件配置:
EMAIL_BACKEND = "django.core.mail.backends.filebased.EmailBackend" EMAIL_FILE_PATH = "/tmp/django_emails"
重启容器后提交注册请求,查看/tmp/django_emails目录是否生成邮件文件。如果生成,说明Django注册逻辑正常,问题确实出在SMTP网络连接上。
内容的提问来源于stack exchange,提问作者xralf
相关产品推荐
相关产品推荐

