【问题标题】:Sending HTML email in django在 django 中发送 HTML 电子邮件
【发布时间】:2011-03-15 07:55:55
【问题描述】:

在我的项目中,我添加了一个时事通讯提要。但是当尝试使用此功能发送电子邮件时:

def send(request):
    template_html = 'static/newsletter.html'
    template_text = 'static/newsletter.txt'
    newsletters = Newsletter.objects.filter(sent=False)
    subject = _(u"Newsletter")
    adr = NewsletterEmails.objects.all()
    for a in adr:
        for n in newsletters:
            to = a.email
            from_email = settings.DEFAULT_FROM_EMAIL           
            subject = _(u"Newsletter Fandrive")
            text = get_template(template_text)
            html = get_template(template_html)
            d = { 'n': n,'email': to }
            text_content = text.render(d)
            html_content = html.render(d)

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

使用这些模板:

//text

===================  Newsletter - {{ n.date }}  ============
==========================================================
                      {{ n.title }}
==========================================================          
{{ n.text }}
==========================================================

//html

<html>
    <head>
    </head>
    <body>
    <div style="">
        <div style="">
            <h1 style="">{{ n.title }} - {{n.date}}</h1>
                <p style="">            
                    {{ n.text }}
                </p>
        </div>
    </div>
    </body>
</html>

和模型:

class Newsletter(models.Model):
    title = models.CharField("title", blank=False, max_length=50)
    text = models.TextField("text", blank=False)
    sent = models.BooleanField("sent", default=False)
    data = models.DateTimeField("creation date", auto_now_add=True, blank=False)

class NewsletterEmails(models.Model):
    email = models.EmailField(_(u"e-mail address"),)

我明白了:

TemplateSyntaxError at /utils/newsletter_send/
Caught an exception while rendering: 'dict' object has no attribute 'autoescape'

{{ n.date }} 在 text_email 模板中

虽然我的调试显示我正在向模板发送适当的时事通讯对象,以及调试上下文:

context {'email': u'admin@domain.com', 'n': &lt;Newsletter: Newsletter object&gt;}

为什么会这样?根据我对这个错误的发现,它以某种方式与向模板渲染器发送空字典有关,但我的不是空的......

【问题讨论】:

  • 在您的模型定义日期字段中被命名为“数据”,这是发布问题时的拼写错误,还是您在代码中也有这样的错误??
  • 错字,到处都是日期。不知道这怎么可能发生... :)
  • 在#django 日志中,我读到“您正在将字典传递给期望 Context 对象的东西。” .如何解决这个问题?

标签: html django django-templates html-email


【解决方案1】:

仅供参考。我找到了另一种方法:

def send(request):
    template_html = 'static/newsletter.html'
    template_text = 'static/newsletter.txt'
    newsletters = Newsletter.objects.filter(sent=False)
    subject = _(u"Newsletter Fandrive")
    adr = NewsletterEmails.objects.all()
    for a in adr:
        for n in newsletters:
            to = a.email
            from_email = settings.DEFAULT_FROM_EMAIL           
            subject = _(u"Newsletter Fandrive")

            text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
            html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})

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

    return HttpResponseRedirect('/')

【讨论】:

  • 你漏掉了from django.core.mail import EmailMultiAlternatives的import语句
  • 这应该发送 HTML 电子邮件还是如何工作?我正在尝试这种方法,但我只收到短信
【解决方案2】:

他们更新了send_mail 以允许dev version 中的html 消息

def send(request):
    template_html = 'static/newsletter.html'
    template_text = 'static/newsletter.txt'
    newsletters = Newsletter.objects.filter(sent=False)
    subject = _(u"Newsletter Fandrive")
    adr = NewsletterEmails.objects.all()
    for a in adr:
        for n in newsletters:
            to = a.email
            from_email = settings.DEFAULT_FROM_EMAIL           
            subject = _(u"Newsletter Fandrive")

            text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})
            html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.date, 'email': to})

            send_mail(subject, text_content, from_email,
             to, fail_silently=False, html_message=html_content)
    return HttpResponseRedirect('/')

【讨论】:

    【解决方案3】:

    这是一个非常简单的解决方法,你错过了一件小事。

    你正在这样做:

      d = { 'n': n,'email': to }
    

    然后尝试将该字典用作您的 render() 方法的一部分。但是,render 需要 Context,因此您需要这样做:

     d = Context({ 'n': n,'email': to })
    

    确保也从django.template 导入它。这应该可以解决您收到的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 2013-06-27
      • 2013-10-15
      • 2015-01-23
      • 2012-04-26
      • 2012-08-27
      • 2014-12-10
      • 2011-05-30
      相关资源
      最近更新 更多