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

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>

关键修改说明

  1. 导入模板渲染工具:render_to_string负责将模板内容和上下文变量解析成最终的HTML字符串
  2. 上下文传递变量:把user和link传入模板,确保{{user.username}}这类变量被正确替换
  3. 指定HTML邮件参数:email_user方法新增html_message参数,告诉Django发送HTML格式邮件;同时保留message的纯文本版本,兼容不支持HTML的邮件客户端
  4. 模板分离:将HTML内容单独放在模板文件中,比硬编码字符串更易维护和修改

内容的提问来源于stack exchange,提问作者Robert Murariu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:40:19