Django邮件发送支持模板吗

wen python案例 1

本文目录导读:

Django邮件发送支持模板吗

  1. 基本思路
  2. 具体步骤
  3. 其他常用方式
  4. 开发环境测试
  5. 最佳实践建议

是的,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'

这样所有邮件内容会打印到终端,方便调试。

最佳实践建议

  1. 总是提供纯文本版本:部分邮件客户端不支持 HTML,纯文本版本作为备选
  2. 使用 EmailMultiAlternatives:同时支持 HTML 和纯文本
  3. 模板放在 templates/email/ 目录:组织清晰
  4. 模板使用 .html.txt 扩展名:区分格式
  5. 处理异常:在发送时捕获连接错误、认证失败等异常

这样,Django 就能完美支持模板化的邮件发送了。

抱歉,评论功能暂时关闭!