Docker环境下Django-allauth VK登录回调触发OSError 99地址不可用问题
问题根因
从错误回溯可直接定位触发报错的逻辑:
- 首次点击VK登录时,allauth已成功拉取VK返回的用户信息并完成本地账号创建,后续调用Django SMTP后端发送新用户邮箱验证邮件时,无法连接到配置的SMTP服务器,抛出
OSError: [Errno 99] Address not available错误 - 第二次点击登录时,allauth检测到该VK账号已绑定本地用户,跳过了注册、发送验证邮件的流程,直接完成登录,因此可以正常跳转个人主页
- 该问题和Docker内的venv虚拟环境无关,本地非容器环境正常运行,大概率是本地开发环境配置了不需要联网的邮件后端(比如控制台输出),或本地网络可正常访问SMTP服务器,而容器环境的网络/邮件配置未对齐。
解决方案
方案1:开发环境快速修复(关闭邮箱验证)
如果是开发场景,直接在settings.py添加以下配置,关闭allauth的强制邮箱验证要求,同时将邮件输出到控制台避免连接SMTP:
# 关闭注册后强制邮箱验证 ACCOUNT_EMAIL_VERIFICATION = "none" # 可选:开发环境邮件直接输出到控制台,不需要连接SMTP服务器 EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
方案2:保留邮箱验证功能,修复容器SMTP访问配置
如果生产环境需要保留邮箱验证逻辑,检查以下配置:
- 确认
settings.py中EMAIL_HOST、EMAIL_PORT等SMTP相关配置,在容器网络环境下可正常访问 - 若SMTP服务部署在宿主机器上,不要使用
127.0.0.1作为EMAIL_HOST:容器内的127.0.0.1指向容器本身而非宿主,需要改为宿主的局域网IP,或Docker专属网关地址(Docker for Mac/Windows可使用特殊域名host.docker.internal访问宿主) - 检查容器出口网络的防火墙、安全组规则,确认未禁止访问SMTP服务器的对应端口
方案3:仅跳过第三方登录用户的邮箱验证
如果VK返回的用户邮箱已经是官方验证过的状态,可以单独配置第三方登录跳过邮箱验证,不影响普通账号注册的验证逻辑:
SOCIALACCOUNT_EMAIL_VERIFICATION = "none"
内容的提问来源于stack exchange,提问作者Lomank
相关产品推荐
相关产品推荐

