2010-02-07 23 views
6

我試圖製作一個只檢索電子郵件的正文文本而不傳遞標題或任何其他參數的Python程序。我不知道如何去做這件事。Python:僅檢索POP3消息文本,沒有標題

目標是能夠通過消息文本向程序發送基本命令。

我現在是這樣的:

import poplib 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     print j 

mail.quit() 
input("Press any key to continue.") 

這是所有細,當「打印J」執行它打印整個消息,包括標題除外。我只是想提取正文文本,沒有任何額外的垃圾。

任何人都可以幫忙嗎?謝謝!

+1

WOW(他們是在一行的末尾打上# new statement)!這是用Python下載電子郵件所需的一切嗎?我一直試圖在C#中做幾個月!!!!而不是第三方組件之一在C#中工作........我不知道Python,但記得在某處看到同樣的問題,我正在尋找網站,如果我仍然可以找到它,生病發布人解決方案在這裏爲你...如果他們已經找到解決方案 – 2010-02-07 20:03:03

+0

Python使一切看起來像一個微不足道的任務;) – Ospho 2014-01-29 21:40:42

回答

2

您可以使用email module解析eMails。

+0

謝謝!這個模塊是完美的。 – mplewis 2013-01-28 17:39:55

3

這是代碼從我自己的POP3讀者片段:

 response, lines, bytes = pop.retr(m) 

     # remove trailing blank lines from message 
     while lines[-1]=="": 
      del lines[-1] 

     try: 
      endOfHeader = lines.index('') 
      header = lines[:endOfHeader] 
      body = lines[endOfHeader+1:] 
     except ValueError: 
      header = lines 
      body = [] 

此鍵關閉所有線作爲頭信息的結束列表中的第一個空行。然後,只需從那裏列出切片,直到消息正文的結尾。

+0

感謝您的幫助!我雖然有點麻煩。 m在pop.retr(m)中代表什麼?這是拋出錯誤,我不知道該放什麼,或者如果這個例程需要駐留在一個特定的子。 – mplewis 2010-02-08 06:55:40

+0

我的代碼中的'pop.retr(m)'類似於代碼中的'mail.retr(i + 1)' - m是消息號,是一個整數。看看我如何解開由retr返回的元組,而你只需要[1] th元素?在你的代碼中,只需遍歷行,直到你點擊一個空字符串,或者你用盡了行。其餘的是身體。 – PaulMcG 2010-02-08 12:14:16

5

我會用電子郵件模塊獲取電子郵件消息的正文與get_payload()方法,該方法跳過頭信息。

我添加幾行代碼

import poplib 
import email # new statement 

host = "pop.gmail.com" 
mail = poplib.POP3_SSL(host) 
print mail.getwelcome() 
print mail.user("user") 
print mail.pass_("pass") 
print mail.stat() 
print mail.list() 
print "" 

if mail.stat()[1] > 0: 
    print "You have new mail." 
else: 
    print "No new mail." 

print "" 

numMessages = len(mail.list()[1]) 
for i in range(numMessages): 
    for j in mail.retr(i+1)[1]: 
     #print j 
     msg = email.message_from_string(j) # new statement 
     print(msg.get_payload()) # new statement 

mail.quit() 
input("Press any key to continue.") 
+0

當試圖使用你的行時,我得到錯誤'TypeError:initial_value必須是str或None,不是字節'msg = email.message_from_string(j) – 2018-01-02 00:29:21

+0

@Tintinabulator Zea - 這應該發生是因爲你正在使用** Python3 **。使用'msg = email.message_from_bytes(j)'而不是'msg = email.message_from_string(j)'。請參閱[Python電子郵件分析問題](https://stackoverflow.com/questions/19508393/python-email-parsing-issue/19508543)。 – 2018-01-16 06:53:32