2012-12-05 13 views
5

Używam poniższego kodu do wysyłania wiadomości e-mail z załącznikiem pdf. Ale to zarzuca błąd - "stwierdzenie braku treści". Nie jestem pewien, dlaczego tak jest. Jestem w stanie wysłać wiadomość e-mail z pdf synchronicznie, a także wysłać e-mail async bez pdf. (przy użyciu Django 1.3)Wysyłanie wiadomości e-mail asynchronicznie z załącznikiem w 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

Co to są pdf i html podczas połączenia z send_mail? (Są to dwie rzeczy, które są sprawdzane za pomocą 'assert content is not None' w django.core.mail.message.) Czy jest możliwe, że jakoś pdf zmienia się pomiędzy czasem wywołania send_mail a czasem uruchomienia wątku wysyłania ? – medmunds

+1

Ponadto, FYI, istnieje aplikacja o nazwie django-mailer, która implementuje (rozsądnie) solidną asynchroniczną kolejkę wysyłania. Obsługuje takie przypadki jak ponawianie próby później, jeśli msg.send nie powiedzie się za pierwszym razem. W zależności od tego, co próbujesz osiągnąć, może to być lepsze podejście niż używanie takich wątków. – medmunds

Odpowiedz

1

Pomyśl o tym, co się dzieje z kodem podczas próby wysłania wiadomości e-mail bez załącznika, ponieważ jest bardzo oczekiwane ze 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) 

Tak, w końcu spróbujesz dołączyć plik bez zawartości. Musisz się upewnić, że załączasz tylko wtedy, gdy jest coś do załatwienia. Jaki byłby sens? Niektóre ticket.pdf to pusty ciąg znaków?

Ponadto, po drugie pomysł na użycie django-mailer.

Powiązane problemy