2011-06-28 63 views
6

我需要使用Django作爲電子郵件附件發送models.FileField。我已經看到了一些片段,展示瞭如何使用原始request.FILES數據(它仍包含Content-Type)執行此操作,但是一旦您已將文件保存在一個文件中,卻無法找到任何顯示如何操作的片段models.FileField。內容類型似乎無法從models.FileField訪問。如何通過電子郵件發送Django FileField作爲附件?

有人可以給我一個這如何工作的例子嗎?我開始認爲當我保存文件時,我可能不得不在模型中存儲Content-Type。

謝謝!

+0

您能否提供您找到的答案?我也想看到這個片段。 – Doppelganger

回答

0

我只是不提供內容類型,讓收件人的電子郵件客戶端解決它。除非它是不尋常的,否則它不應該是一個問題。

RFC2616狀態:

當且僅當媒體類型是不是由內容類型字段中給出 的 收件人可嘗試經由其 內容的檢查猜測 介質類型和/或用於標識 資源的URI的名稱擴展名 。

... 如果要指定它,然後存儲在上載內容類型是一個非常好的主意。應當指出的是,Django自己的文檔,以verify the data from users

說,如果你是一個* UNIX的操作系統,你可以嘗試猜測/檢查它:

import subprocess 
subprocess.check_output(['file', '-b', '--mime', filename]) 

(從How to find the mime type of a file in python?

+0

謝謝!我會放棄並報告回去! –

13

附加電子郵件中的models.FileField文件在Django中很好用且簡單:

from django.core.mail import EmailMultiAlternatives 
kwargs = dict(
    to=to, 
    from_email=from_addr, 
    subject=subject, 
    body=text_content, 
    alternatives=((html_content, 'text/html'),) 
) 
message = EmailMultiAlternatives(**kwargs) 
message.attach_file(model_instance.filefield.path) 
message.send() 
3

另一種方法:

from django.core.mail.message import EmailMessage 

msg = EmailMessage(subject=my_subject, body=my_email_body, 
     from_email=settings.DEFAULT_FROM_EMAIL, to=[to_addressed]) 
msg.attach_file(self.my_filefield.file) # self.my_filefield.path for Django 1.7+ 
msg.send(fail_silently=not(settings.DEBUG)) 
+0

這對我有用,謝謝。 – Prateek

+2

我不得不使用'msg.attach_file(self.my_filefield.path)'和Django 1.7.1 – sspross

相關問題