2010-08-27 69 views
5

我已经看到有关使用python通过IMAP加载电子邮件的搜索,然后对结果中的每个消息ID执行查询。我想通过一次性提取所有东西来加快速度。一次提取多个IMAP消息

+4

我想做一个搜索,然后在一次操作中获取所有生成的消息。除非有人在我不注意的时候增加了新的物理法,我想我会没事的。 – 2010-08-27 17:43:38

回答

12

RFC 3501说fetch需要一个序列集,但我没有看到它的定义,并且该示例使用范围形式(2:4 =消息2,3和4)。我发现一个以逗号分隔的ID列表起作用。在python与imaplib,我有这样的东西:

status, email_ids = con.search(None, query) 
    if status != 'OK': 
     raise Exception("Error running imap search for spinvox messages: " 
         "%s" % status) 

    fetch_ids = ','.join(email_ids[0].split()) 
    status, data = con.fetch(fetch_ids, '(RFC822.HEADER BODY.PEEK[1])') 
    if status != 'OK': 
     raise Exception("Error running imap fetch for spinvox message: " 
         "%s" % status) 
    for i in range(len(email_ids[0].split())): 
     header_msg = email.message_from_string(data[i * 3 + 0][1]) 
     subject = header_msg['Subject'], 
     date = header_msg['Date'], 
     body = data[i * 3 + 1][1] # includes some mime multipart junk 
3

你可以试试这个获取所有邮件的头信息在1转到服务器。

import imaplib 
import email 

obj = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
obj.login('username', 'password') 
obj.select('folder_name') 
resp,data = obj.uid('FETCH', '1:*' , '(RFC822.HEADER)') 
messages = [data[i][1].strip() + "\r\nSize:" + data[i][0].split()[4] + "\r\nUID:" + data[i][0].split()[2] for i in xrange(0, len(data), 2)] 
for msg in messages: 
    msg_str = email.message_from_string(msg) 
    message_id = msg_str.get('Message-ID')