如何使用 Django 发送电子邮件:完整的 SMTP 指南
Source: Dev.to
理解 Django 的邮件系统
Django 通过其 django.core.mail 模块提供了一个强大的发送邮件框架。该模块包含用于发送普通、HTML 和批量邮件的函数和类。
该模块需要一个后端才能正常工作,因此你需要为项目配置想要使用的邮件后端。

Django 支持许多开箱即用的邮件后端。SMTP 后端 是最流行的,适用于大多数应用。
除了默认后端之外,你还可以构建自定义邮件后端,但本指南侧重于内置的 SMTP 邮件后端。
如何使用 Django 发送邮件
前置条件
- 项目中已安装 Django(本指南使用 Django 5.0,亦适用于 Django 3.x 及以上)
- 具备 Django 与 Python 的基础知识
- 一个可运行的 Django 项目
(如果需要创建项目,请参阅官方 Django 安装指南) - 一个邮件服务提供商(示例使用 SendLayer,任何 SMTP 提供商均可)
如果选择 SendLayer,你可以使用免费账户,最多可发送 200 封邮件。
创建账户后,需要授权发送域名,这可以提升投递成功率并验证你的账户。
配置邮件后端
打开项目的 settings.py,添加以下配置(将占位符替换为你自己的 SMTP 凭证):
# Django email configuration
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sendlayer.net' # Replace with your SMTP server
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-sendlayer-username'
EMAIL_HOST_PASSWORD = 'your-sendlayer-password'

从 SendLayer(或你使用的其他提供商)账户中获取 SMTP 凭证,并相应替换占位符。
保护凭证安全
将用户名和密码直接写在代码中并不安全。请使用环境变量。
-
在项目根目录创建
.env文件:EMAIL_HOST_USER='your-sendlayer-username' EMAIL_HOST_PASSWORD='your-sendlayer-password' -
安装
python-decouple:pip install python-decouple -
在
settings.py中读取变量:from decouple import config EMAIL_HOST_USER = config('EMAIL_HOST_USER') EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD')
方法 1:使用 send_mail() 函数发送普通邮件
send_mail() 是用于发送简易文本邮件的内置快捷方式。
必需参数
subject:邮件主题message:纯文本正文from_email:发件人地址recipient_list:收件人地址列表
可选参数
fail_silently:False会抛出异常;True会抑制异常connection:自定义邮件后端(默认使用 settings 中定义的后端)html_message:邮件正文的 HTML 版本
示例
from django.core.mail import send_mail
send_mail(
subject='Welcome to Our App',
message='Thank you for signing up!',
from_email='paulie@example.com',
recipient_list=['user@example.com'],
fail_silently=False,
)
专业提示: 使用 SendLayer 时,
from_email必须是已授权域名下的地址(例如@example.com)。
发送给多个收件人
from django.core.mail import send_mail
send_mail(
subject='Welcome to Our App',
message='Thank you for signing up!',
from_email='paulie@example.com',
recipient_list=[
'user1@example.com',
'user2@example.com',
'user3@example.com',
],
fail_silently=False,
)
方法 2:使用 EmailMessage 类发送邮件
EmailMessage 类比 send_mail() 更灵活,允许添加附件、设置自定义头部以及发送 HTML 内容。
