2016-02-28 158 views
1

PYTHON VERSION == 3.5解析電子郵件內容以電子郵件模塊(PYTHON)

代碼:

import getpass, poplib, email 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user("[email protected]") 
Mailbox.pass_('password_here') 
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
    info = b" ".join(Mailbox.retr(i+1)[1]) 
    msg = email.message_from_bytes(info) 
    print(msg.keys()) 

輸出:

['MIME-Version'] 
['MIME-Version'] 
['MIME-Version'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 
['Delivered-To'] 

輸出不正確的,因爲除"MIME-Version""Delivered-To"以外的 msg應該有更多的字段I tho ught

email.message_from_bytes()解析字節串

的內容msg不是一個字節的字符串?

docs建議這樣的:

M = poplib.POP3('localhost') 
M.user(getpass.getuser()) 
M.pass_(getpass.getpass()) 
numMessages = len(M.list()[1]) 
for i in range(numMessages): 
    for j in M.retr(i+1)[1]: 
     print(j) 

有沒有一種方法來解析使用電子郵件模塊返回的消息? 因此我們可以存儲電子郵件的詳細信息。像發送者,身體,頭部等

回答

1

的答案竟然是相當容易

import getpass, poplib, email 
Mailbox = poplib.POP3_SSL('pop.googlemail.com', '995') 
Mailbox.user("[email protected]") 
Mailbox.pass_('password_here') 
numMessages = len(Mailbox.list()[1]) 
for i in range(numMessages): 
    raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
    parsed_email = email.message_from_bytes(raw_email) 
    print(parsed_email.keys()) 

,而不是加入raw_email與空間只是由\n加入它和email模塊能正確解析字段:

也是一個有關使用email模塊 一個真棒的事情是,當你調用email.message_from_bytes()返回的輸出是一個 dict

所以你訪問的字段是這樣的:

raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
parsed_email = email.message_from_bytes(raw_email) 
print(parsed_email["header"]) 

但如果字段不存在什麼?:

raw_email = b"\n".join(Mailbox.retr(i+1)[1]) 
parsed_email = email.message_from_bytes(raw_email) 
print(parsed_email["non-existent field"]) 

上面的代碼將返回None,而不是拋出一個KeyError