2010-07-13 13 views
20

En mi proyecto he añadido un feed de noticias. Pero cuando se trata de enviar correos electrónicos con esta función:Envío de correo electrónico HTML en 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() 

usando las plantillas:

//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> 

y modelos:

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"),) 

que estoy recibiendo:

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

en {{}} n.date dentro text_email plantilla

Aunque mi depuración muestra que estoy enviando boletín adecuada se opone a la plantilla, así como del contexto de depuración:

context {'email': u'[email protected]', 'n': <Newsletter: Newsletter object>}

¿Por qué es eso sucediendo? De lo que he encontrado acerca de este error es de alguna manera conectado con el envío de diccionario vacío al procesador de plantilla, pero la mía no está vacío ...

+0

en su campo de fecha definición de modelo se denomina como 'datos', es que un error al escribir la pregunta o la tienes así en el código también? – Ashok

+0

error tipográfico, es una cita en todas partes. No sé cómo pudo haber pasado esto ... :) – crivateos

+0

en #django logs He leído 'Estás pasando un diccionario a algo que estaba esperando un objeto Contextual'. . ¿Cómo resolver esto? – crivateos

Respuesta

10

Esta es una solución bastante simple, que se está perdiendo una cosa menor.

Usted está haciendo esto:

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

Seguido de tratar de utilizar ese diccionario como parte de su método render(). Sin embargo, toma un renderContext por lo que necesita para hacer esto:

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

Asegúrese de que importarlo de django.template también. Eso debería arreglar el error que está recibiendo.

17

sólo para fines informativos. He encontrado otra forma de hacer esto:

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

Sí. Esta es una buena manera de hacerlo. – bozdoz

+2

Dejaste a cabo la declaración de importación de importación de 'django.core.mail EmailMultiAlternatives' –

+1

Es esto supone para enviar mensajes de correo electrónico HTML o cómo funciona esto? Estoy intentando este enfoque, pero solo recibo el mensaje de texto –

11

Han actualizan send_mail para permitir que los mensajes HTML en el 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

para Django> = 1.7 – laffuste

Cuestiones relacionadas