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

使用Django发送邮件时遭遇SSL证书验证失败错误

Django发送Gmail邮件遇SSL证书验证失败的解决办法

问题重现

发送邮件时出现错误:

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)

当前配置:

# Email Settings
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = "xxxxxxxx@gmail.com"
EMAIL_HOST_PASSWORD = "xxxxxxxxxxxxx"
EMAIL_USE_TLS = True

发送代码:

send_mail(
    "Subject",
    "Test message",
    settings.EMAIL_HOST_USER,
    ["xxxxxxxxx@gmail.com"],
    fail_silently=False,
)

解决方案

一、先检查Gmail账号权限配置

  • 若账号开启了两步验证,必须用应用专用密码替代原登录密码:
    1. 登录Google账号后台,进入「安全」板块
    2. 找到「应用专用密码」,生成一个仅用于Django邮件服务的密码,将其填入EMAIL_HOST_PASSWORD
  • 未开启两步验证的账号,需开启「不太安全的应用访问」(注:该选项已逐步被Google淘汰,优先推荐使用应用密码)

二、修复SSL证书验证问题

方案1:指定可信CA证书文件

找到本地系统的CA证书路径:

  • Linux:/etc/ssl/certs/ca-certificates.crt
  • macOS:/usr/local/etc/openssl/cert.pem
  • Windows:可下载Mozilla官方CA证书包
    在settings.py中添加配置:
EMAIL_SSL_CERTFILE = "/完整的CA证书路径"

方案2:测试环境临时跳过验证(生产环境禁止)

自定义SMTP后端跳过SSL验证:

  1. 在你的Django应用下创建backends.py文件,内容如下:
import ssl
from django.core.mail.backends.smtp import EmailBackend

class CustomEmailBackend(EmailBackend):
    def open(self):
        if self.connection:
            return False
        try:
            context = ssl.create_default_context()
            context.check_hostname = False
            context.verify_mode = ssl.CERT_NONE
            self.connection = self.connection_class(
                host=self.host,
                port=self.port,
                timeout=self.timeout,
                source_address=self.source_address,
                context=context,
            )
            if self.use_tls:
                self.connection.starttls(context=context)
            self.connection.login(self.username, self.password)
            return True
        except OSError:
            if not self.fail_silently:
                raise
            return False
  1. 修改settings.py中的邮件后端配置:
EMAIL_BACKEND = "你的应用名.backends.CustomEmailBackend"

三、确认端口与协议匹配

587端口对应EMAIL_USE_TLS = True,EMAIL_USE_SSL = False,不要和465端口的SSL配置混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:20:40