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

部署在Cloud Run的Django发送邮件报Connection unexpectedly closed如何排查?

Django部署Google Cloud Run发送邮件报错排查

我将Django应用部署在Google Cloud Run上,尝试发送邮件时始终收到“Connection unexpectedly closed”错误,无堆栈跟踪及其他信息。

我的settings.py配置如下:

EMAIL_BACKEND = django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST = smtp-relay.gmail.com
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False

API端点中发送邮件的代码为:

send_mail(subject, body, email_from, recipient_list)

我已通过日志确认账号和密码正确,且本地运行时该功能正常。Cloud Run网络设置已允许所有入口,未配置VPC网络,推测非网络问题,但因容器化特性,不知其他可能原因。请问还有哪些排查方向?


排查方向

  • 检查Gmail账号安全配置

    • 若账号开启了2FA,必须使用应用专用密码而非原账号密码,即使本地可用,Cloud Run环境可能触发Google安全检测拦截。
    • 查看Google账号登录活动记录,确认Cloud Run的IP是否被标记为可疑,是否需要手动授权该登录来源。
  • 验证Cloud Run出站网络连通性

    • 在Cloud Run容器内执行端口连通测试:nc -zv smtp-relay.gmail.com 587,确认是否能正常访问SMTP端口。即使入口设置允许,部分地区或环境可能存在出站端口限制。
  • 开启Django邮件调试日志
    在settings.py中添加日志配置,获取SMTP交互的详细过程:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {'console': {'class': 'logging.StreamHandler'}},
        'root': {'handlers': ['console'], 'level': 'DEBUG'},
        'loggers': {
            'django.core.mail': {
                'handlers': ['console'],
                'level': 'DEBUG',
                'propagate': False,
            },
        },
    }
    

    从日志中可定位TLS握手、命令交互等环节的具体错误。

  • 检查容器CA证书完整性
    若容器基础镜像(如alpine)缺少系统CA证书,会导致TLS握手失败。在Dockerfile中添加证书安装步骤:

    • Alpine:apk add --no-cache ca-certificates
    • Debian/Ubuntu:apt-get install -y ca-certificates
  • 核查Gmail发送配额
    确认是否触发Gmail每日发送上限或短时间内发送频率过高,导致账号被临时限制。可登录Google账号查看Gmail配额状态。

  • 切换至GCP原生邮件服务
    改用Google Cloud Mail Service或Gmail API发送邮件,避开SMTP协议的网络与安全限制,更适配GCP环境。

内容的提问来源于stack exchange,提问作者JYang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:44:58