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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:20:00