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

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相关逻辑,移除过时参数:

  1. 在你的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
  1. 在项目的settings.py中修改邮件后端配置:
EMAIL_BACKEND = 'your_app_name.backends.FixedSMTPBackend'

注意替换your_app_name为你实际的应用名称。

  1. 若之前配置过keyfile和certfile,请改用ssl_context替代,示例:
import ssl
EMAIL_SSL_CONTEXT = ssl.create_default_context()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:35:06