Python3.12+Django4.0.1发邮件报错:SMTP.starttls()遇意外参数'keyfile'
解决SMTP.starttls()参数报错问题
问题原因
Python 3.12 移除了smtplib.SMTP.starttls()方法的keyfile和certfile参数,但你使用的Django 4.0.1版本的邮件后端仍在传递这两个参数,导致版本兼容冲突,触发该报错。
解决方案
方案1:升级Django版本(推荐)
Django 4.2及以上版本已适配Python 3.12,彻底解决了这个参数兼容问题。执行以下命令升级:
pip install --upgrade django>=4.2
方案2:自定义邮件后端(无需升级Django)
如果暂时无法升级Django,可以自定义一个SMTP邮件后端,重写starttls相关逻辑,移除过时参数:
- 在你的Django应用中创建一个
backends.py文件,写入以下代码:
from django.core.mail.backends.smtp import EmailBackend import smtplib class FixedSMTPBackend(EmailBackend): def _starttls(self, connection): try: # 调用starttls时仅传递ssl_context,不再传keyfile和certfile connection.starttls(context=self.ssl_context) connection.ehlo() return True except smtplib.SMTPException: return False
- 在项目的
settings.py中修改邮件后端配置:
EMAIL_BACKEND = 'your_app_name.backends.FixedSMTPBackend'
注意替换your_app_name为你实际的应用名称。
- 若之前配置过
keyfile和certfile,请改用ssl_context替代,示例:
import ssl EMAIL_SSL_CONTEXT = ssl.create_default_context()
内容的提问来源于stack exchange,提问作者Yuriy
相关产品推荐
相关产品推荐

