2010-11-01 39 views
18

我有一個電子郵件多部分郵件對象,我想將該電子郵件中的附件轉換爲python文件對象。這可能嗎?如果可能的話,我應該研究Python中的哪些方法或類來完成這樣的任務?獲取郵件附件到python文件對象

+0

你至今讀哪一部分Python庫嗎?你有沒有看過pop或imap庫? – 2010-11-01 10:12:44

+0

我只看着email.message.Message和mimetools.Message。好吧,我會讀入pop和imail,看看我能用它做什麼。 – 2010-11-01 10:18:18

回答

47

我真的不明白「email multipart message object」的含義。你的意思是屬於email.message.Message類的對象嗎?

如果這就是你的意思,那很簡單。在多部分消息中,get_payload方法返回消息部分的列表(每個消息部分本身都是一個Message對象)。您可以遍歷這些部分並檢查它們的屬性:例如,get_content_type方法返回該部分的MIME類型,get_filename方法返回該部分的文件名(如果在消息中指定了該文件)。然後,當您找到正確的信息部分時,您可以撥打get_payload(decode=True)獲取解碼的內容。

>>> import email 
>>> msg = email.message_from_file(open('message.txt')) 
>>> len(msg.get_payload()) 
2 
>>> attachment = msg.get_payload()[1] 
>>> attachment.get_content_type() 
'image/png' 
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True)) 

如果你編程方式提取您收到電子郵件中的附件,你可能要採取防範病毒和木馬的防範措施。特別是,你可能只應該提取你知道的MIME類型安全的附件,並且你可能想要選擇你自己的文件名,或者至少清除get_filename的輸出。

+0

這很好。謝謝。 – 2010-11-06 20:53:58

+1

HTML郵件通常在頁腳中有圖像,這些圖像也作爲附件發送。您可以通過查看Content-Disposition來區分這些內容與「真實」附件:內嵌圖像以「inline」開頭,而實際附件以「attachment」開頭。沒有獲取內容處置的方法,但如果您只對實際附件感興趣,則可以調用part.get('Content-Disposition')。startswith('attachment')。 – jrial 2017-06-25 15:21:45

9

這裏是工作的解決方案,消息形式IMAP服務器

self.imap.select() 
typ, data = self.imap.uid('SEARCH', 'ALL') 
msgs = data[0].split() 
print "Found {0} msgs".format(len(msgs)) 

for uid in msgs: 
    typ, s = self.imap.uid('FETCH', uid, '(RFC822)') 
    mail = email.message_from_string(s[0][1]) 

    print "From: {0}, Subject: {1}, Date: {2}\n".format(mail["From"], mail["Subject"], mail["Date"]) 

    if mail.is_multipart(): 
     print 'multipart' 
     for part in mail.walk(): 
      ctype = part.get_content_type() 
      if ctype in ['image/jpeg', 'image/png']: 
       open(part.get_filename(), 'wb').write(part.get_payload(decode=True))