Django Html 邮件在邮件正文中添加额外字符

2 投票
2 回答
1294 浏览
提问于 2025-04-15 16:24

我正在使用Django发送一封电子邮件,这封邮件有文本部分和HTML部分。以下是我的代码:

    subject = request.session.get('email_subject', None)
    from_email = request.session.get('user_email', None)
    to = request.session.get('user_email', None)
    bcc = [email.strip() for email in request.session.get('email_recipients', None).split(settings.EMAIL_DELIMITER)]

    text_content = render_to_response(email_text_template, {
        'body': request.session.get('email_body', None),
        'link': "http://%(site_url)s/ecard/?%(encoded_greeting)s" % {
            'site_url': settings.SITE_URL,
            'encoded_greeting': urlencode({'g': quote_plus(request.session.get('card_greeting'))}),
        },
    }, context_instance=RequestContext(request))

    html_content = render_to_response(email_html_template, {
        'body': request.session.get('email_body', None),
        'link': "http://%(site_url)s/ecard/?%(encoded_greeting)s" % {
            'site_url': settings.SITE_URL,
            'encoded_greeting': urlencode({'g': request.session.get('card_greeting')}),
        },
        'site_url': settings.SITE_URL,
    }, context_instance=RequestContext(request))

    email = EmailMultiAlternatives(subject, text_content, from_email, [to], bcc)
    email.attach_alternative(html_content, "text/html")
    sent = email.send()

当用户收到这封邮件时,邮件里有这样的内容:“Content-Type: text/html; charset=utf-8”。有没有什么好的方法可以去掉这个内容呢?

2 个回答

2

在你采纳Alasdair的建议之前,先打开命令行,看看render_to_stringrender_to_response的输出结果。命令行可能会帮助你将来解决类似的问题。

你提到的“Content-Type: text/html; charset=utf-8”这一行是HttpResponse生成的响应头。对于像你例子中的简单HttpResponse对象来说,这就是头部的唯一内容。

$ ./manage.py shell
Python 2.6.3 (r263:75183, Oct 14 2009, 15:40:24) 
Type "help", "copyright", "credits" or "license" for more information.
>>> from django.shortcuts import render_to_response
>>> from django.template.loader import render_to_string
>>> template = 'your_template.html'
>>> print( "\n".join(render_to_string(template).split('\n')[:3]) )
template-line-1
template-line-2
template-line-3
>>> print( "\n".join(str(render_to_response(template)).split('\n')[:3]) )
Content-Type: text/html; charset=utf-8

template-line-1
>>>
5

你正在使用 render_to_response 来生成 html_contenttext_content,这个方法会返回一个 HttpResponse 对象。

但是你希望 html_contenttext_content 是字符串类型的,所以应该使用 render_to_string 来代替。

你可以用下面这一行来导入 render_to_string

from django.template.loader import render_to_string

撰写回答