2012-09-14 43 views
1

我試圖從IMAP提取未讀郵件。當我嘗試解析電子郵件內容時,我收到len(email_message.keys()) == 0。所以我永遠不會得到FromToSubject解析郵件,來自和主題

打印電子郵件(email.message_from_string(email_str)):

From nobody Fri Sep 14 13:42:50 2012 

1 (RFC822 {1015} 
Return-Path: <[email protected]> 
X-Original-To: [email protected] 
Delivered-To: [email protected] 
Received: from ec2.....amazonaws.com (unknown [IP]) 
    (Authenticated sender: [email protected]) 
    by domain.com (Postfix) with ESMTPA id EACD436CF 
    for <[email protected]>; Fri, 14 Sep 2012 12:47:54 +0000 (UTC) 
DKIM-Signature: .... 
Content-Type: text/plain; charset="us-ascii" 
MIME-Version: 1.0 
Content-Transfer-Encoding: 7bit 
From: [email protected] 
To: [email protected] 
Subject: welcome 

Dear recipient, 

Welcome. 

Best, 
Robot 

而這裏的代碼:

def fetch_new_emails(host, port, user, password): 
    conn = imaplib.IMAP4(host=host, port=port) 

    try: 
    (retcode, capabilities) = conn.login(user, password) 
    conn.select(readonly=1) # Select inbox or default namespace 
    (retcode, messages) = conn.search(None, '(UNSEEN)') 
    results = [] 
    if retcode == 'OK': 
     for message in messages[0].split(' '): 
     (ret, raw_email) = conn.fetch(message, '(RFC822)') 
     if ret == 'OK': 
      print raw_email[0] 
      email_str = string.join(raw_email[0], "\n") 
      email_message = email.message_from_string(email_str) 
      email_from = email_message['From'] 
      to = email_message['To'] 
      subject = email_message['Subject'] 
      results.append({ 
      'from': email_from, 
      'to': to, 
      'subject': subject}) 
    except: 
    print sys.exc_info()[1] 
    sys.exit(1) 
    finally: 
    conn.close() 
    return results 

問題:

print email_message['From'] 
>>None  
print email_message['To'] 
>>None 
print email_message['Subject'] 
>>None 
+0

你能打印出raw_email的迴應嗎? – Max

回答

2

還有的From nobody...線後,一個奇怪的空行。從技術上講,空行是標題的結尾,之後的所有內容都是正文,所以該消息實際上沒有這些標題。

無論如何,IMAP消息不應該有From行(這是典型的Berkeley mbox格式,很少有IMAP服務器使用這種格式;即使您的存儲實現的細節不應該對IMAP客戶端可見) 。

奇怪的1 (RFC822 {1015}行也不屬於;它看起來隱約像是IMAP協議響應的一部分,而不是實際消息的一部分。正確的消息以Return-Path:標題開始,在這種情況下。

IMAP服務器和/或客戶端代碼是否爲生產版本?

+1

事實上,這是IMAP協議的一部分:''1(RFC822 {1015}''。實際上,這就是imaplib給你的FETCH響應,消息序列號1,RFC822響應,1015字節。的迴應是實際的消息。 – Max