2011-09-06 771 views
17

我使用pythons imaplib連接到我的Gmail賬戶。我想檢索前15個郵件(未讀或未讀,沒關係),只顯示主題和發件人姓名(或地址),但不知道如何顯示收件箱的內容。python imaplib獲取Gmail收件箱主題標題和發件人姓名

這裏是我到目前爲止的代碼(連接成功)

import imaplib 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login('[email protected]', 'somecrazypassword') 
mail.list() 
mail.select('inbox') 

#need to add some stuff in here 

mail.logout() 

我認爲這應該是很簡單的,我只是不熟悉不夠用了imaplib庫的命令。任何幫助,將必須感激...

UPDATE 感謝朱利安我可以通過每個消息循環,並取回全部內容:

typ, data = mail.search(None, 'ALL') 
for num in data[0].split(): 
    typ, data = mail.fetch(num, '(RFC822)') 
    print 'Message %s\n%s\n' % (num, data[0][1]) 
mail.close() 

,但我想只是主題和發件人。是否有這些項目的imaplib命令,或者我將不得不解析文本的全部內容[0] [1]:主題和發件人?

UPDATE OK,得到了主題和發件人部分工作,但迭代(1,15)由遞減順序進行顯然我展示了最早的消息第一。我該如何改變這一點?我試着這樣做:

for i in range(len(data[0])-15, len(data[0])): 
    print data 

但只是給了我None所有15次迭代...任何想法?我也試着mail.sort('REVERSE DATE', 'UTF-8', 'ALL')但Gmail的犯規支持的.sort()函數

UPDATE 想出一個辦法做到這一點:

#....^other code is the same as above except need to import email module 
mail.select('inbox') 
typ, data = mail.search(None, 'ALL') 
ids = data[0] 
id_list = ids.split() 
#get the most recent email id 
latest_email_id = int(id_list[-1]) 

#iterate through 15 messages in decending order starting with latest_email_id 
#the '-1' dictates reverse looping order 
for i in range(latest_email_id, latest_email_id-15, -1): 
    typ, data = mail.fetch(i, '(RFC822)') 

    for response_part in data: 
     if isinstance(response_part, tuple): 
      msg = email.message_from_string(response_part[1]) 
      varSubject = msg['subject'] 
      varFrom = msg['from'] 

    #remove the brackets around the sender email address 
    varFrom = varFrom.replace('<', '') 
    varFrom = varFrom.replace('>', '') 

    #add ellipsis (...) if subject length is greater than 35 characters 
    if len(varSubject) > 35: 
     varSubject = varSubject[0:32] + '...' 

    print '[' + varFrom.split()[-1] + '] ' + varSubject 

這給了我最近的15條消息,主題和發件人地址按要求在降序!感謝所有幫助!

+0

從Python文檔的例子正常工作對我來說:http://docs.python.org/library/ imaplib#imap4 - example – Julian

+0

是的,你說得對,這對於檢索所有消息的完整消息內容很安靜。我只想要主題和發件人地址。然後,我可以使for循環只有1到15 – sadmicrowave

+0

另一個鏈接到Python文檔:http://docs.python.org/library/email.html;) – Julian

回答

12
c.select('INBOX', readonly=True) 

    for i in range(1, 30): 
     typ, msg_data = c.fetch(str(i), '(RFC822)') 
     for response_part in msg_data: 
      if isinstance(response_part, tuple): 
       msg = email.message_from_string(response_part[1]) 
       for header in [ 'subject', 'to', 'from' ]: 
        print '%-8s: %s' % (header.upper(), msg[header]) 

這應該給你一個關於如何檢索主題和來自?

+2

什麼是電子郵件?你是指我的'郵件'變量?什麼是message_from_string()是由那個組成的?我收到一個錯誤,說明AttributeError(「未知的IMAP4命令:'%s'」%attr) AttributeError:未知的IMAP4命令:'message_from_string'' – sadmicrowave

+2

沒想到,算出來了,我沒有包含電子郵件模塊。謝謝 – sadmicrowave

+0

添加到我的OP問題,幫助這部分,我會給你勝利! – sadmicrowave

4

對於那些尋找如何檢查郵件和解析頭,這是我用什麼:

def parse_header(str_after, checkli_name, mailbox) : 
    #typ, data = m.search(None,'SENTON', str_after) 
    print mailbox 
    m.SELECT(mailbox) 
    date = (datetime.date.today() - datetime.timedelta(1)).strftime("%d-%b-%Y") 
    #date = (datetime.date.today().strftime("%d-%b-%Y")) 
    #date = "23-Jul-2012" 

    print date 
    result, data = m.uid('search', None, '(SENTON %s)' % date) 
    print data 

    doneli = [] 
    for latest_email_uid in data[0].split(): 
     print latest_email_uid 
     result, data = m.uid('fetch', latest_email_uid, '(RFC822)') 
     raw_email = data[0][1] 

     import email 
     email_message = email.message_from_string(raw_email) 
     print email_message['To'] 
     print email_message['Subject'] 
     print email.utils.parseaddr(email_message['From']) 
     print email_message.items() # print all headers 
+0

AttributeError:'模塊'對象沒有屬性'message_from_string'。我正在導入電子郵件,承諾。 –

+1

@ChaseRoberts你需要使用'from email import email'。我假設你使用了'import email'這意味着你試圖訪問錯誤級別的'message_from_string'。 – blockloop

+0

Bwahaha,非常感謝。 –

3

我一直在尋找一個現成的簡單的腳本來通過IMAP列出最後的收件箱,而無需通過所有郵件分揀。這裏的信息是有用的,雖然DIY和錯過了一些方面。首先,IMAP4.select返回消息計數。其次,主題頭解碼並不簡單。

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 


import imaplib 
import email 
from email.header import decode_header 
import HTMLParser 


# to unescape xml entities 
_parser = HTMLParser.HTMLParser() 

def decodeHeader(value): 
    if value.startswith('"=?'): 
    value = value.replace('"', '') 

    value, encoding = decode_header(value)[0] 
    if encoding: 
    value = value.decode(encoding) 

    return _parser.unescape(value) 

def listLastInbox(top = 4): 
    mailbox = imaplib.IMAP4_SSL('imap.gmail.com') 
    mailbox.login('[email protected]', 'somecrazypassword') 

    selected = mailbox.select('INBOX') 
    assert selected[0] == 'OK' 
    messageCount = int(selected[1][0]) 

    for i in range(messageCount, messageCount - top, -1): 
    reponse = mailbox.fetch(str(i), '(RFC822)')[1] 
    for part in reponse: 
     if isinstance(part, tuple): 
     message = email.message_from_string(part[1]) 
     yield {h: decodeHeader(message[h]) for h in ('subject', 'from', 'date')} 

    mailbox.logout() 


if __name__ == '__main__': 
    for message in listLastInbox(): 
    print '-' * 40 
    for h, v in message.items(): 
     print u'{0:8s}: {1}'.format(h.upper(), v) 
2

這是我的解決方案,從電子郵件獲取信息的有用位:

import datetime 
import email 
import imaplib 
import mailbox 


EMAIL_ACCOUNT = "[email protected]" 
PASSWORD = "your password" 

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login(EMAIL_ACCOUNT, PASSWORD) 
mail.list() 
mail.select('inbox') 
result, data = mail.uid('search', None, "UNSEEN") # (ALL/UNSEEN) 
i = len(data[0].split()) 

for x in range(i): 
    latest_email_uid = data[0].split()[x] 
    result, email_data = mail.uid('fetch', latest_email_uid, '(RFC822)') 
    # result, email_data = conn.store(num,'-FLAGS','\\Seen') 
    # this might work to set flag to seen, if it doesn't already 
    raw_email = email_data[0][1] 
    raw_email_string = raw_email.decode('utf-8') 
    email_message = email.message_from_string(raw_email_string) 

    # Header Details 
    date_tuple = email.utils.parsedate_tz(email_message['Date']) 
    if date_tuple: 
     local_date = datetime.datetime.fromtimestamp(email.utils.mktime_tz(date_tuple)) 
     local_message_date = "%s" %(str(local_date.strftime("%a, %d %b %Y %H:%M:%S"))) 
    email_from = str(email.header.make_header(email.header.decode_header(email_message['From']))) 
    email_to = str(email.header.make_header(email.header.decode_header(email_message['To']))) 
    subject = str(email.header.make_header(email.header.decode_header(email_message['Subject']))) 

    # Body details 
    for part in email_message.walk(): 
     if part.get_content_type() == "text/plain": 
      body = part.get_payload(decode=True) 
      file_name = "email_" + str(x) + ".txt" 
      output_file = open(file_name, 'w') 
      output_file.write("From: %s\nTo: %s\nDate: %s\nSubject: %s\n\nBody: \n\n%s" %(email_from, email_to,local_message_date, subject, body.decode('utf-8'))) 
      output_file.close() 
     else: 
      continue 
相關問題