2012-12-05 8 views
5

Sto usando il seguente codice per inviare e-mail con allegato pdf. Ma è un errore - "asserzione senza contenuto". Non sono sicuro del perché sia ​​così. Sono in grado di inviare l'e-mail con il pdf in modo sincrono così come inviare e-mail asincrona senza pdf. (Django 1,3)Invio di e-mail in modo asincrono con l'allegato in Django

from django.core.mail import EmailMultiAlternatives 
import threading 
from django.core.mail import send_mail 

class EmailThread(threading.Thread): 
    def __init__(self, subject, body, from_email, recipient_list, fail_silently, html,pdf): 
     self.subject = subject 
     self.body = body 
     self.recipient_list = recipient_list 
     self.from_email = from_email 
     self.fail_silently = fail_silently 
     self.html = html 
     self.pdf = pdf 
     threading.Thread.__init__(self) 

    def run(self): 
     msg = EmailMultiAlternatives(self.subject, self.body, self.from_email, self.recipient_list) 
     msg.attach('ticket.pdf',self.pdf,'application/pdf') 
     if self.html: 
      msg.attach_alternative(self.html, "text/html") 
     msg.send(self.fail_silently) 


def send_mail(subject, body, from_email, recipient_list, fail_silently=True, html=None,pdf=None, *args, **kwargs): 
    EmailThread(subject, body, from_email, recipient_list, fail_silently, html, pdf).start() 
+0

Cosa sono pdf e html quando si chiama send_mail? (Queste sono le due cose che vengono verificate con 'asserzione del contenuto non è None' in django.core.mail.message.) È possibile che in qualche modo il pdf venga modificato tra il momento in cui si chiama send_mail e il momento in cui viene eseguito il thread di invio ? – medmunds

+1

Inoltre, FYI, c'è un'app chiamata django-mailer che implementa una coda di invio asincrona (ragionevolmente) robusta. Gestisce casi come riprovare più tardi se msg.send fallisce la prima volta. A seconda di cosa stai cercando di ottenere, potrebbe essere un approccio migliore rispetto all'utilizzo di thread come questo. – medmunds

risposta

1

pensare a cosa succede con il codice quando si tenta di inviare una e-mail, senza un allegato, come è del tutto previsto con send_mail.

def run(self): 
     msg = EmailMultiAlternatives(self.subject, self.body, self.from_email, self.recipient_list) 
     msg.attach('ticket.pdf',self.pdf,'application/pdf') 
     #      ^^^^^^^^ is None. 
     if self.html: 
      msg.attach_alternative(self.html, "text/html") 
     msg.send(self.fail_silently) 

Sì, si finirebbe cercando di allegare un file senza contenuto. Devi assicurarti di allegare solo se c'è qualcosa da allegare. Quale sarebbe il punto comunque? Alcuni ticket.pdf sono una stringa vuota?

Inoltre, ho in secondo piano l'idea di utilizzare django-mailer.