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样式。
问题原因
- 邮件发送时未指定内容类型为HTML,默认以纯文本(
plain)格式解析内容,导致HTML标签被当作普通文本显示。 - 构造邮件内容时调用了
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
相关产品推荐
相关产品推荐

