django 原生仅支持单一邮件后端,但可通过自定义 `emailbackend` 组合多个后端(如 smtp 发送 + 控制台打印),实现开发调试与真实投递并行。
在 Django 项目中,我们常希望:开发时既能将邮件实际发送到收件人(通过 SMTP),又能实时在终端查看邮件内容(便于调试)。然而,Django 的 EMAIL_BACKEND 设置项仅接受单个后端类路径(如 "django.core.mail.backends.smtp.EmailBackend"),不支持列表或链式配置。直接设置 EMAIL_BACKEND = [...] 会引发配置错误。
解决方法是创建一个自定义邮件后端类,继承 BaseEmailBackend,并在其 send_messages() 方法中依次调用多个真实后端(如 SMTP 和 Console)。以下是一个健壮、可复用的实现:
# myproject/email_backends.py
from django.core.mail.backends.base import BaseEmailBackend
from django.core.mail.backends.console import EmailBackend as ConsoleBackend
from django.core.mail.backends.smtp import EmailBackend as SMTPBackend
class CombinedEmailBackend(BaseEmailBackend):
def __init__(self, *args, **kwargs):
# 初始化两个子后端;注意:ConsoleBackend 不依赖 host/port 等参数,但传入无害
self.smtp_backend = SMTPBackend(*args, **kwargs)
self.console_backend = ConsoleBackend(*args, **kwargs)
super().__init__(*args, **kwargs)
def send_messages(self, email_messages):
if not email_messages:
return 0
# 先通过 SMTP 发送(可能失败,需捕获异常)
try:
smtp_sent = self.smtp_backend.send_messages(email_messages)
except Exception as e:
smtp_sent = 0
# 可选:记录警告,但不中断控制台输出

import logging
logging.getLogger(__name__).warning(f"SMTP send failed: {e}")
# 再输出到控制台(始终成功,用于调试)
console_sent = self.console_backend.send_messages(email_messages)
# 返回主通道计数(以 SMTP 为准),确保行为符合预期
return smtp_sent然后在 settings.py 中启用该自定义后端:
# settings.py EMAIL_BACKEND = 'myproject.email_backends.CombinedEmailBackend' # SMTP 配置(按需填写) EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your@gmail.com' EMAIL_HOST_PASSWORD = 'your-app-password' # Console backend 无需额外配置,但可选设置: EMAIL_CONSOLE_LOG_LEVEL = 'INFO' # 此参数对内置 ConsoleBackend 无效,仅作示意;如需日志级别控制,可在自定义类中扩展
✅ 优势说明:
⚠️ 注意事项:
if DEBUG:
EMAIL_BACKEND = 'myproject.email_backends.CombinedEmailBackend'
else:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'通过这种方式,你既保持了 Django 邮件系统的简洁性,又获得了多通道协同调试的强大能力。