2013-05-07 100 views
2

我想使用python imap和電子郵件包檢索電子郵件正文(僅文本)。使用python imap和電子郵件包獲取電子郵件的正文文本

按本SO thread,我使用下面的代碼:

mail = email.message_from_string(email_body) 
bodytext = mail.get_payload()[ 0 ].get_payload() 

雖然它的正常工作的一些情況,但有時我會得到類似下面的響應

[<email.message.Message instance at 0x0206DCD8>, <email.message.Message instance at 0x0206D508>] 

回答

5

你假設的消息有一個統一的結構,具有一個明確定義的「主要部分」。事實並非如此;可以有一部分不是文本部分的消息(只是二進制文件的「附件」,除此之外沒有其他內容),或者它可以是包含多個文本部分的多部分(或者再一次沒有),甚至可以是如果只有一個,則不必是第一部分。此外,嵌套的多部分(一個或多個部分是另一個MIME消息,遞歸)。

用這麼多的話來說,您必須檢查MIME結構,然後決定哪個部分與您的應用程序相關。如果你只接收來自相當靜態的小型客戶端的消息,那麼你可能會削減一些角落(至少在下一次微軟鼠疫升級之前),但總的來說,沒有任何類型的層次結構,只是一些(不一定總是直接相關的)同樣重要的部分。

0

也許this post(我的)可以有所幫助。我在美國收到一份含有不同種類石油價格的通訊。我使用給定的標題模式在gmail中獲取電子郵件,然後使用正則表達式提取郵件正文中的價格。所以我必須訪問最後n封郵件的郵件正文,其中標題遵守給定的模式。

我使用email.message_from_string()也:msg = email.message_from_string(response_part[1])

所以也許它給你如何在這條巨蟒的lib使用方法具體的例子。

6

在我的情況下,主要問題是在bodytext中作爲消息實例顯示的回覆或轉發的消息。

使用下面的代碼解決我的問題:

bodytext=mail.get_payload()[0].get_payload(); 
if type(bodytext) is list: 
    bodytext=','.join(str(v) for v in bodytext) 
+0

如果列表返回,加入內容的想法幫助了我,謝謝。 – scottydelta 2013-12-19 16:26:26

0

基本上你必須迭代消息的不同文本/純文本(或文本/ html)部分才能到達正文 - 絕對不能保證哪個位置是正文部分! (雖然有約定它是第一個...在大多數情況下...大概... :)

因爲我不想重複的內容,請參閱my answer to quite similar question here,並根據調整滿足您的需求。