Django结合django-sesame发送HTML邮件问题求助
Django发送HTML格式邮件的修复方案
你遇到的问题是因为user.email_user()默认发送纯文本邮件,导致HTML代码被直接当作文本显示,而非渲染后的内容;同时代码里的模板变量{{user.username}}和{{link}}也不会自动解析,需要用Django的模板渲染工具处理。
修改后的完整代码
from django.template.loader import render_to_string def email(request): campanii = Campanie.objects.order_by('-pub_date') if request.method == 'POST': form = EmailLoginForm(request.POST) if form.is_valid(): email = form.cleaned_data['email'].lower() user = UserVot.objects.filter(email=email).first() if user is None: # daca userul nu exista cu acea adresa de email messages.error(request, "adresa de email nu este corecta sau valida") return render(request, 'loginvot/email.html', {'form' : form, 'campanii':campanii , 'error_message' : "adresa de email nu este corecta sau valida"} ) # 注意:这里需要先初始化link变量,比如link = "你的基础URL" link = "https://你的域名/vot/" link += sesame.utils.get_query_string(user) # 准备模板上下文数据 email_context = { 'user': user, 'link': link } # 渲染HTML邮件内容(推荐用单独模板文件,也可以用字符串模板) html_content = render_to_string('loginvot/email_template.html', email_context) # 纯文本版本,作为HTML不兼容时的 fallback plain_text_content = f""" Salutare, {user.username} Acceseaza link-ul de mai jos pentru a intra in sectiunea de vot "Ambasadorii Valorilor Profi" {link} """ user.email_user( subject="Link vot", message=plain_text_content, html_message=html_content # 新增HTML内容参数 ) return render(request, 'loginvot/email.html', {'campanii':campanii , 'error_succes' : "in maximum 1 minut vei primi pe adresa de email completata un link de accesare sesiune de vot"} ) context = {'form' : EmailLoginForm, 'campanii' : campanii} return render(request, 'loginvot/email.html', context)
配套HTML模板文件(templates/loginvot/email_template.html)
把原代码中的HTML内容单独放在模板文件中,便于维护:
<html> <head> <meta charset="UTF-8"> </head> <body> <p> Salutare, <h4>{{user.username}}</h4></p><br> <p>Acceseaza link-ul de mai jos pentru a intra in sectiunea de vot "Ambasadorii Valorilor Profi"</p><br> <a href="{{link}}">{{link}}</a> </body> </html>
关键修改说明
- 导入模板渲染工具:
render_to_string负责将模板内容和上下文变量解析成最终的HTML字符串 - 上下文传递变量:把
user和link传入模板,确保{{user.username}}这类变量被正确替换 - 指定HTML邮件参数:
email_user方法新增html_message参数,告诉Django发送HTML格式邮件;同时保留message的纯文本版本,兼容不支持HTML的邮件客户端 - 模板分离:将HTML内容单独放在模板文件中,比硬编码字符串更易维护和修改
内容的提问来源于stack exchange,提问作者Robert Murariu
相关产品推荐
相关产品推荐

