使用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账号权限配置
- 若账号开启了两步验证,必须用应用专用密码替代原登录密码:
- 登录Google账号后台,进入「安全」板块
- 找到「应用专用密码」,生成一个仅用于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验证:
- 在你的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
- 修改
settings.py中的邮件后端配置:
EMAIL_BACKEND = "你的应用名.backends.CustomEmailBackend"
三、确认端口与协议匹配
587端口对应EMAIL_USE_TLS = True,EMAIL_USE_SSL = False,不要和465端口的SSL配置混淆。
内容的提问来源于stack exchange,提问作者Anup Shrestha
相关产品推荐
相关产品推荐

