You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django发送HTML样式邮件失效问题及解决方法

Django发送HTML邮件样式不生效的解决办法

问题场景

在Django项目中尝试发送带彩色内容的美观邮件,编写了构造邮件内容的函数:

def construct_mail_body():
    user = User.objects.get(id=1)
    context = {
        'username': user.username,
    }
    template = render_to_string('mail/mail_body.html', context=context)
    message = strip_tags(template)
    return message

对应的HTML模板mail/mail_body.html:

{% load static %}

<h3>Hello <span style="color: red;">{{ username }}</span>,</h3>

<h3>You've successfully completed our Tutorial!</h3>

<h3>Congratulations!</h3>

遇到的问题:HTML标签未生效,邮件内容还出现呈紫色的情况,同时想了解是否可以添加CSS样式。

问题原因

  1. 邮件发送时未指定内容类型为HTML,默认以纯文本(plain)格式解析内容,导致HTML标签被当作普通文本显示。
  2. 构造邮件内容时调用了strip_tags()方法,直接移除了所有HTML标签,即使后续设置HTML类型,也无可用标签渲染样式。

解决步骤

1. 修改邮件内容构造函数

移除strip_tags()调用,直接返回渲染后的HTML模板内容:

def construct_mail_body():
    user = User.objects.get(id=1)
    context = {
        'username': user.username,
    }
    # 直接返回渲染后的HTML内容,保留标签
    return render_to_string('mail/mail_body.html', context=context)

2. 发送邮件时指定HTML内容类型

使用EmailMessage发送邮件时,设置content_subtype为'html',告知邮件客户端以HTML格式解析内容:

from django.core.mail import EmailMessage
from django.conf import settings

subject = "完成教程通知"
body = construct_mail_body()
email = "user@example.com"

mail = EmailMessage(
    subject,
    body,
    settings.EMAIL_HOST_USER,
    [email],
)
mail.fail_silently = False
# 关键配置:指定内容为HTML类型
mail.content_subtype = 'html'
mail.send()

关于CSS样式的说明

可以添加CSS样式,但邮件客户端对CSS支持差异较大,建议遵循以下原则:

  • 优先使用内联样式(如模板中<span style="color: red;">的形式),这是兼容性最好的方式。
  • 避免使用外部CSS文件或<style>标签定义的内部样式,大部分邮件客户端(如Gmail)会过滤这类样式。
  • 尽量使用基础CSS属性,避免复杂选择器和高级样式特性。

内容的提问来源于stack exchange,提问作者Python Django

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:40:41