2011-05-08 51 views
3

我想發送電子郵件給我的網站會員參加會議(即客人),每個會議都有相同的PDF附件。我正在用Django的內置批量電子郵件功能執行此操作,格式爲connection.send_messages(messages)。目前,我這樣做:使用相同的附件發送在Django的批量電子郵件

guests = Guest.objects.all() 
connection = mail.get_connection() 
connection.open() 
messages = [] 
for guest in guests: 
    msg = EmailMultiAlternatives(title, text_content, from_address, [guest.email], connection=connection) 
    msg.attach_alternative(html_content, 'text/html') 
    pdf_data = open(os.path.join(settings.MEDIA_ROOT, 'uploads/flyer.pdf')) 
    msg.attach('Invitation Card.pdf', pdf_data.read(), 'application/pdf') 
    pdf_data.close() 
    messages.append(msg) 
connection.send_messages(messages) 
connection.close() 

現在,當我像這樣做,同樣的PDF文件將被加載的每封電子郵件,單獨連接,然後分別發送每封電子郵件,就好像它是不同的PDF文件。如果文件大小爲10MB,那麼這個10MB將會上傳到我的郵件服務器上,這個郵件服務器可能只有一次。

所以問題是:是否有可能將文件一次附加到所有電子郵件,因此也只能上傳一次?或者我只是簡單地做錯了?

UPDATE

如果我改變連接線以下:

msg.attach_file(os.path.join(settings.MEDIA_ROOT, 'uploads/flyer.pdf')) 

將是解決我的問題?

回答

0

看着Django的/核心/郵件/ message.py揭示attach_file僅僅是調用attach之前打開該文件爲你方便的功能:

def attach_file(self, path, mimetype=None): 
    """Attaches a file from the filesystem.""" 
    filename = os.path.basename(path) 
    content = open(path, 'rb').read() 
    self.attach(filename, content, mimetype) 

您可避免打開附件,並讀入內存如果您將EmailMultiAlternatives歸類並覆蓋attach方法,則一遍又一遍。你應該考慮使用一個工作/任務隊列,例如celery

+0

嗯,好的。感謝您的期待,我只是懶得打開它自己:)你能想出任何解決這個問題的方法嗎? – 2011-05-08 21:21:52

+0

不,但您可能要考慮使用鏈接而不是實際附件。 – zeekay 2011-05-08 21:25:24

+0

是的,在這種情況下,這不是一個真正的選項:( – 2011-05-08 21:27:53