Django3.2.23+Python3.12.1配置SMTP报错:starttls()含未知参数keyfile
问题原因
Django 3.2.23属于旧版本,不兼容Python 3.12。Python 3.12对标准库smtplib.SMTP.starttls()方法做了变更,移除了keyfile和certfile这两个参数,但Django 3.2的SMTP邮件后端仍在调用该方法时传递这两个参数,导致触发TypeError。
解决方法
方案1:版本适配(推荐)
选项A:升级Django到兼容Python 3.12的版本
Django 4.2.x及以上版本支持Python 3.12,建议升级到4.2 LTS版本(长期支持,稳定性高):
pip install django==4.2.*
升级后需检查项目中第三方依赖是否兼容新版本Django,避免出现其他兼容性问题。
选项B:降级Python到Django 3.2支持的版本
Django 3.2官方支持Python 3.6至3.11,将Python降级到3.11.x版本,即可解决版本不兼容问题,无需修改现有邮件配置代码。
方案2:临时修改Django源码(不推荐长期使用)
找到Python环境中Django的smtp.py文件(路径通常为lib/python3.12/site-packages/django/core/mail/backends/smtp.py),定位到报错的第67行左右的starttls调用,移除keyfile和certfile参数:
原代码类似:
self.connection.starttls(keyfile=self.ssl_keyfile, certfile=self.ssl_certfile)
修改为:
self.connection.starttls()
注意:该方法仅作为临时 workaround,后续更新Django时会被覆盖,且可能引入其他未知问题,仅在无法升级/降级版本时临时使用。
内容的提问来源于stack exchange,提问作者MiguelSanLeon
相关产品推荐
相关产品推荐

