2012-12-05 37 views
5

Tôi đang sử dụng mã bên dưới để gửi email có tệp đính kèm pdf. Nhưng, đó là một lỗi - "khẳng định không có nội dung". Tôi không chắc tại sao nó lại như vậy. Tôi có thể gửi email với pdf đồng bộ cũng như gửi email không đồng bộ với pdf. (Sử dụng Django 1,3)Gửi email không đồng bộ với tệp đính kèm trong 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

pdf và html khi bạn gọi send_mail là gì? (Đây là hai thứ được kiểm tra với nội dung 'assert không phải là None' trong django.core.mail.message.) Có thể nào đó bằng cách nào đó pdf bị thay đổi giữa thời gian bạn gọi send_mail và thời gian mà chuỗi gửi được chạy ? – medmunds

+1

Ngoài ra, FYI, có một ứng dụng gọi là django-mailer thực hiện một hàng đợi gửi async (hợp lý) mạnh mẽ. Nó xử lý các trường hợp như thử lại sau nếu msg.send không thành công trong lần đầu tiên. Tùy thuộc vào những gì bạn đang cố gắng đạt được, nó có thể là một cách tiếp cận tốt hơn so với sử dụng các chủ đề như thế này. – medmunds

Trả lời

1

Hãy suy nghĩ về những gì xảy ra với mã của bạn khi bạn cố gắng để gửi một email mà không có một tập tin đính kèm, như là khá mong đợi với 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) 

Có, bạn sẽ kết thúc cố đính kèm tệp không có nội dung. Bạn cần phải chắc chắn rằng bạn chỉ đính kèm nếu có cái gì đó để đính kèm. Điều gì sẽ là điểm anyways? Một số ticket.pdf đó là một chuỗi rỗng?

Ngoài ra, tôi thứ hai ý tưởng sử dụng django-mailer.

Các vấn đề liên quan