Django 4.2邮件模板锚点链接显示为纯文本的解决求助
解决Django 4.2 HTML邮件显示为纯文本、链接不可点击的问题
核心问题分析
你的邮件模板中使用了转义的HTML字符(如<、>),导致渲染后的内容是纯文本形式的HTML代码,而非邮件客户端可解析的HTML结构。虽然你在代码中设置了email.content_subtype = 'html',但内容本身的格式错误使得客户端无法识别为HTML。
解决方案步骤
1. 修正邮件模板的HTML标签
将模板中所有转义的<替换为<,>替换为>,保留{% autoescape off %}确保Django不会转义模板变量和HTML结构。修改后的模板如下:
{% autoescape off %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> h1{ color: chocolate; } p{ font-size: 22px; } </style> </head> <body> <h1>Hey there, you are almost there!</h1> <p>Please click link to verify your account</p> <a class="underline" href="http://{{ domain }}{% url 'activate' uidb64=uid token=token%}">Verify Your Account</a> </body> </html> {% endautoescape %}
2. 修复链接的空格问题
原模板中{{ domain }}和{% url %}之间有空格,会导致生成的URL包含无效空格,需删除该空格(如上述模板所示)。
更可靠的方式是在视图中直接生成完整的绝对URL,避免手动拼接:
在sendActivationMail函数的context中添加完整链接:
def sendActivationMail(user, request): current_site = get_current_site(request) email_subject = 'Verify your account' uid = urlsafe_base64_encode(force_bytes(user.pk)) token = generator_token.make_token(user) # 生成完整的激活URL activate_url = request.build_absolute_uri( reverse('activate', kwargs={'uidb64': uid, 'token': token}) ) email_body = render_to_string( 'mail_temp/confirm_temp.html', { 'user': user, 'activate_url': activate_url, }, ) email = EmailMessage( subject=email_subject, body=email_body, from_email=settings.EMAIL_HOST_USER, to=[user.email] ) email.content_subtype = 'html' email.send()
然后模板中直接使用该URL:
<a class="underline" href="{{ activate_url }}">Verify Your Account</a>
3. 确认视图中的HTML类型设置
你已正确设置email.content_subtype = 'html',此部分无需修改,确保邮件客户端识别内容为HTML格式。
验证效果
修改后重新发送邮件,邮件客户端会正确解析HTML结构,链接将变为可点击状态,样式也会生效。
内容的提问来源于stack exchange,提问作者theocode
相关产品推荐
相关产品推荐

