smtp配置必须写在settings.py中,且email_backend、email_host/port/use_tls(或use_ssl)、email_host_user/password这三项缺一不可。

SMTP配置写在哪?settings.py里这三项不能少
Django发邮件必须在 settings.py 里配全三个核心项,缺一个都会报 SMTPAuthenticationError 或直接静默失败。不是写在视图里,也不是靠环境变量自动加载。
-
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'—— 不配这个,默认用 console 后端,根本不会连 SMTP -
EMAIL_HOST、EMAIL_PORT、EMAIL_USE_TLS(或EMAIL_USE_SSL)三者要匹配服务商要求:Gmail 用smtp.gmail.com+587+EMAIL_USE_TLS = True;Outlook 用smtp-mail.outlook.com+587+ TLS;QQ 邮箱必须开 POP3/SMTP 并用授权码,端口465时得设EMAIL_USE_SSL = True -
EMAIL_HOST_USER和EMAIL_HOST_PASSWORD—— 这里填的不是登录密码,是 SMTP 授权码(尤其 Gmail/qq/outlook),填错就SMTPAuthenticationError: (535, b'Authentication failed')
send_mail() 发 HTML 邮件?它原生不支持,得换 send_mass_mail 或 EmailMultiAlternatives
send_mail() 只能发纯文本,传 html_message 参数是无效的——它会被忽略,你看到的永远是 plain text 版本。真要发带链接、样式、图片的邮件,必须用 EmailMultiAlternatives。
- 先导入:
from django.core.mail import EmailMultiAlternatives - 构造邮件体时,
body是纯文本备用内容,attach_alternative(html_content, "text/html")才真正启用 HTML 渲染 - 别漏掉
msg.content_subtype = "html"—— 这个没用,Django 会按attach_alternative自动设 MIME 类型,手动设反而可能干扰 - 模板里避免内联样式失效:CSS 写成
style="..."属性,不要依赖外部 CSS 文件;图片用绝对 URL,本地路径收件方打不开
本地开发发不出邮件?别硬调 SMTP,用 console 或 file 后端快速验证逻辑
开发阶段死磕 Gmail SMTP 很容易卡在授权、网络、端口限制上,其实 Django 提供了两个零配置调试后端:
-
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'—— 邮件不发出去,直接打到终端,能看到完整 headers 和 body,适合检查收件人、主题、HTML 结构是否正确 -
EMAIL_BACKEND = 'django.core.mail.backends.file.EmailBackend'—— 配EMAIL_FILE_PATH = '/tmp/app-mails',所有邮件存成 .eml 文件,可用邮件客户端打开查看渲染效果 - 切记:这两个后端不校验
EMAIL_HOST等配置,所以即使 SMTP 配错了,它们也能“成功”运行,别误以为发信逻辑没问题
发信慢或超时?timeout 和 connection reuse 是关键
默认情况下每次 send_mail() 都新建 SMTP 连接,遇到批量发送或高并发场景,延迟明显,还可能触发服务商限流。Django 没有内置连接池,但可以手动复用连接。
- 加
EMAIL_TIMEOUT = 10到settings.py,防止卡死在 DNS 解析或握手阶段 - 批量发送时,别循环调
send_mail(),改用send_mass_mail()或自己用smtplib.SMTP建一次连接发多封 - 如果必须单封发送且量大,考虑用 Celery 异步发信,但注意:Celery worker 的
settings.py也要完整配置 SMTP,否则连不上 - Gmail 对免费账号有发送频率限制(约 100 封/天),超限后后续请求会直接被拒绝,错误信息是
(550, b'Requested action not taken: mailbox unavailable'),不是配置问题
send_mail() 根本不认 html_message 参数。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











