本文目录导读:

是的,Django 的邮件发送功能支持使用模板,Django 提供了 django.core.mail 模块,你可以结合 Django 的模板系统来生成邮件内容(包括纯文本和 HTML 格式)。
下面介绍具体实现方式。
基本思路
先创建 Django 模板文件,然后在视图中渲染模板并将结果作为邮件内容发送。
具体步骤
第一步:创建模板文件
在 templates/email/ 目录下创建两个模板:
HTML 模板 (welcome_email.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; }
.header { background-color: #4CAF50; color: white; padding: 20px; text-align: center; }
.content { padding: 20px; }
</style>
</head>
<body>
<div class="header">
<h1>欢迎加入 {{ site_name }}</h1>
</div>
<div class="content">
<p>亲爱的 {{ username }},</p>
<p>感谢您注册 {{ site_name }}!</p>
<p>请点击以下链接激活您的账户:</p>
<p><a href="{{ activation_url }}">激活账户</a></p>
<p>如果您无法点击链接,请复制以下地址到浏览器:</p>
<p>{{ activation_url }}</p>
<p>祝您使用愉快!</p>
</div>
</body>
</html>
纯文本模板 (welcome_email.txt):
亲爱的 {{ username }},
感谢您注册 {{ site_name }}!
请点击以下链接激活您的账户:
{{ activation_url }}
祝您使用愉快!
第二步:配置邮件设置
在 settings.py 中配置邮件后端(以使用 SMTP 为例):
# 邮件配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'your-email@gmail.com' EMAIL_HOST_PASSWORD = 'your-password' DEFAULT_FROM_EMAIL = 'Your Site <noreply@yoursite.com>'
第三步:编写发送邮件的函数
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags
def send_welcome_email(user_email, username):
# 模板上下文
context = {
'username': username,
'site_name': 'My Awesome Site',
'activation_url': f'https://example.com/activate/{username}/',
}
# 渲染模板
html_content = render_to_string('email/welcome_email.html', context)
text_content = strip_tags(html_content) # 或者使用纯文本模板
# 创建邮件对象(支持 HTML 和纯文本两种格式)
email = EmailMultiAlternatives(
subject='欢迎注册!', # 邮件主题
body=text_content, # 纯文本内容
from_email='noreply@example.com', # 发件人(可选,默认使用 DEFAULT_FROM_EMAIL)
to=[user_email], # 收件人列表
)
email.attach_alternative(html_content, "text/html") # 附加 HTML 版本
# 发送邮件
email.send(fail_silently=False)
第四步:在视图中调用
from django.shortcuts import render
def register(request):
if request.method == 'POST':
# 处理注册逻辑...
username = request.POST.get('username')
email = request.POST.get('email')
# 发送欢迎邮件
send_welcome_email(email, username)
return render(request, 'registration_success.html')
return render(request, 'register.html')
其他常用方式
使用 send_mail 发送纯文本邮件(带模板)
from django.core.mail import send_mail
from django.template.loader import render_to_string
def send_simple_email(to_email, username):
context = {'username': username}
message = render_to_string('email/simple_email.txt', context)
send_mail(
'通知',
message,
'from@example.com',
[to_email],
fail_silently=False,
)
发送带附件的邮件
from django.core.mail import EmailMessage
def send_email_with_attachment(to_email, pdf_path):
email = EmailMessage(
'带附件的邮件',
'请查收附件。',
'from@example.com',
[to_email],
)
email.attach_file(pdf_path) # 附件
email.send()
开发环境测试
在开发阶段,可以配置邮件输出到控制台,避免实际发送邮件:
# settings.py 开发环境 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
这样所有邮件内容会打印到终端,方便调试。
最佳实践建议
- 总是提供纯文本版本:部分邮件客户端不支持 HTML,纯文本版本作为备选
- 使用
EmailMultiAlternatives:同时支持 HTML 和纯文本 - 模板放在
templates/email/目录:组织清晰 - 模板使用
.html和.txt扩展名:区分格式 - 处理异常:在发送时捕获连接错误、认证失败等异常
这样,Django 就能完美支持模板化的邮件发送了。