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

在DRF中使用Celery发送SMTP邮件时遭遇SSL证书验证失败问题

解决DRF+Celery发送SMTP邮件时的SSL证书验证失败问题

问题分析

使用Django REST Framework结合Celery通过SMTP发送邮件时出现SSLCertVerificationError,切换到控制台后端正常,说明问题出在SMTP连接的SSL证书验证环节,大概率是运行Celery的环境缺少完整CA证书链,或是Gmail账号配置不符合要求。

解决方案

1. 修正Gmail账号配置(关键前提)

如果使用Gmail SMTP服务:

  • 若账号开启两步验证,必须生成应用专用密码,替换settings.py中的EMAIL_HOST_PASSWORD(原登录密码不再生效)
  • 若未开启两步验证,需确认账号是否允许非OAuth应用访问(Gmail目前逐步禁用该选项,建议优先启用两步验证并使用应用专用密码)

2. 配置完整CA证书链(推荐,安全)

找到系统的CA证书文件路径:

  • Linux:/etc/ssl/certs/ca-certificates.crt
  • macOS:/usr/local/etc/openssl/cert.pem(brew安装openssl后)或/etc/ssl/cert.pem
  • Windows:下载Mozilla官方CA证书包,保存为本地文件

在settings.py中添加CA证书路径配置:

# 原有邮件配置保持不变
EMAIL_SSL_CERTFILE = '/path/to/your/ca-certificates.crt'  # 替换为实际路径

3. 更新系统CA证书(Linux/macOS)

如果系统CA证书过期或不全,执行以下命令更新:

  • Debian/Ubuntu:
sudo apt-get update && sudo apt-get install --reinstall ca-certificates
  • macOS:
brew install openssl

4. 临时绕过SSL验证(仅测试环境使用)

仅用于测试场景,生产环境禁止使用:

  1. 在你的Django应用中创建backends.py文件:
import ssl
from django.core.mail.backends.smtp import EmailBackend

class NoSSLVerifyEmailBackend(EmailBackend):
    def connection(self):
        conn = super().connection()
        # 关闭证书验证
        conn.context.check_hostname = False
        conn.context.verify_mode = ssl.CERT_NONE
        return conn
  1. 在settings.py中替换邮件后端:
EMAIL_BACKEND = 'your_app_name.backends.NoSSLVerifyEmailBackend'

5. 确认Celery加载Django配置

启动Celery时确保正确加载项目配置,命令格式:

celery -A your_project_name worker --loglevel=info

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:15:28