2010-07-13 4 views
20

В моем проекте я добавил канал новостей. Но при попытке отправить электронную почту с помощью этой функции:Отправка HTML-адреса электронной почты в django

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'[email protected]', 'n': <Newsletter: Newsletter object>}

Почему что происходит? Из того, что я нашел об этой ошибке, он каким-то образом связан с отправкой пустого словаря в средство визуализации шаблонов, но мой не пуст ...

+0

в вашей модели поле даты определения называется как «данные», что опечатка во время публикации вопроса или у вас есть это как в коде тоже? – Ashok

+0

опечатка, это дата повсюду. Dunno, как это могло произойти, хотя ... :) – crivateos

+0

в журналах #django Я читал «Вы передаете словарь чему-то, что ожидало объект Context». , Как это решить? – crivateos

ответ

10

Это довольно простое исправление, вам не хватает одной незначительной вещи.

Вы делаете это:

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

Круги, пытаясь использовать этот словарь, как часть вашего метода визуализации(). Однако render занимает Context так что вам нужно сделать, это:

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

Убедитесь в том, чтобы импортировать его из django.template а. Это должно исправить ошибку, которую вы получаете.

17

Только для информационных целей. Я нашел еще один способ сделать это:

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('/') 
+0

Да. Это хороший способ сделать это. – bozdoz

+2

Вы отказались от инструкции по импорту 'from django.core.mail import EmailMultiAlternatives' –

+1

Должен ли он отправлять HTML-письма или как это работает? Я пытаюсь использовать этот подход, но получаю текстовое сообщение –

11

Они обновили send_mail разрешить HTML сообщения в dev version

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('/') 
+2

для Django> = 1.7 – laffuste