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
相关产品推荐
相关产品推荐

