技术分享
🗒️Django 4.2无法发送邮件
00 分钟
2024-10-10
type
status
date
slug
summary
tags
category
icon
password
😂
Django 4.2之后, 默认的EmailBackend添加了对hostnamecertificates的校验,可能导致出现ssl相关的错误。

📝 遇到问题

 
之前公司的项目一直使用的是Django 4.0版本。几天前,同事将Django版本升级到了4.2。部署到生产环境后就发现不能发送邮件。我们的邮件服务是自己搭建的,SMTP后端使用的Django默认的EmailBackend
首先我们在日志系统中找到了报错信息:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:997)
以为邮件服务的证书过期了,接着去更新了证书,结果仍然出现报错:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issue (_ssl.c:997
网上一查资料,才发先是Django版本升级造成的问题:
notion image

🤗 解决方案

解决方案有很多,比如在使用EmailBackend的时候传递服务器证书,使用自定义的EmailBackend等。但由于我们的项目是Saas系统,支持客户自行定义邮件服务器。因此选择了最简单的方法:使用自定义的EmailBackend.
  • 首先创建一个自定义的EmailBackend
 
  • 然后在settings.py中配置自定义的EmailBackend
 
完美解决😁