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

Django中发送含激活链接的HTML账户激活邮件问题

解决Django HTML激活邮件的发送问题

你的代码其实已经正确在HTML模板中传入了uid和token,问题在于没有将邮件标记为HTML类型,导致邮件客户端把HTML内容当成纯文本显示。以下是具体的修改步骤:

1. 调整邮件发送代码,设置HTML内容类型

在registro视图中,你使用了EmailMessage类,只需要添加一行代码指定内容类型为HTML即可:

def registro(request,usuario):
    if request.method == 'POST':
        form = FormularioAutoRegistro(request.POST, initial={'usuario':usuario})
        if form.is_valid():
            user = form.save()  

            current_site_info = get_current_site(request)  
            mail_subject = 'Activar cuenta de usuario'  
            # 渲染HTML模板内容
            message_html = render_to_string('myApp/acc_active_email.html', {  
                'user': user,  
                'domain': current_site_info.domain,  
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),  
            })
            to_email = form.cleaned_data.get('email')  

            # 创建邮件对象并设置HTML类型
            email = EmailMessage(mail_subject, message_html, to=[to_email])
            email.content_subtype = "html"  # 关键:将邮件标记为HTML格式
            email.send()  

            form = FormularioAutoRegistro(initial={'usuario':''})   
            return redirect('esperaconfirmacionregistro') 
    # 其余代码保持不变

2. (可选)添加纯文本备选内容

为了兼容不支持HTML的邮件客户端,建议同时提供纯文本版本的邮件内容:

def registro(request,usuario):
    if request.method == 'POST':
        form = FormularioAutoRegistro(request.POST, initial={'usuario':usuario})
        if form.is_valid():
            user = form.save()  

            current_site_info = get_current_site(request)  
            mail_subject = 'Activar cuenta de usuario'  
            # 渲染HTML模板
            message_html = render_to_string('myApp/acc_active_email.html', {  
                'user': user,  
                'domain': current_site_info.domain,  
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),  
            })
            # 渲染纯文本模板(可新建acc_active_email.txt模板)
            message_text = render_to_string('myApp/acc_active_email.txt', {  
                'user': user,  
                'domain': current_site_info.domain,  
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),  
            })
            to_email = form.cleaned_data.get('email')  

            # 创建邮件对象,同时设置HTML和纯文本内容
            email = EmailMessage(mail_subject, message_text, to=[to_email])
            email.attach_alternative(message_html, "text/html")
            email.send()  

            form = FormularioAutoRegistro(initial={'usuario':''})   
            return redirect('esperaconfirmacionregistro') 

3. 优化HTML模板的链接显示

你的acc_active_email.html模板可以改成带<a>标签的格式,让链接在HTML邮件中直接可点击:

{% autoescape off %}  
Saludos, {{user.first_name}} {{user.last_name}}.

Por favor da click en el enlace para confirmar tu registro:
<a href="http://{{ domain }}{% url 'activate' uidb64=uid token=token %}">Activar mi cuenta</a>
{% endautoescape %}

这里的uid变量是你在视图中生成的urlsafe_base64_encode(force_bytes(user.pk)),和activate路由中的uidb64参数完全匹配,token直接传递生成的令牌即可,Django的{% url %}标签会自动拼接出正确的激活URL。

为什么之前的代码不生效?

默认情况下,EmailMessage发送的是纯文本邮件,即使你传入了HTML内容,邮件客户端也会把它当作普通文本解析,不会渲染成HTML格式。设置content_subtype = "html"或者使用attach_alternative添加HTML备选内容后,邮件客户端才会正确渲染HTML样式和可点击链接。

内容的提问来源于stack exchange,提问作者José Eloy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:36:23