2010-08-27 6 views
5

Die Beispiele, die ich über das Laden von E-Mails über IMAP mit Python gesehen habe, führen eine Suche durch und führen dann für jede Nachrichten-ID in den Ergebnissen eine Abfrage durch. Ich möchte die Dinge beschleunigen, indem ich sie alle auf einmal abhole.Abrufen mehrerer IMAP-Nachrichten auf einmal

+4

Ich möchte eine Suche durchführen und dann alle resultierenden Nachrichten in einem Vorgang abrufen. Es sei denn, jemand hat ein neues Physikgesetz hinzugefügt, wenn ich nicht aufgepasst habe. Ich denke, es wird mir gut gehen. –

Antwort

12

RFC 3501 sagt Fetch dauert eine Sequenz, aber ich habe keine Definition dafür gefunden und das Beispiel verwendet eine Bereichsform (2: 4 = Nachrichten 2, 3 und 4). Ich habe herausgefunden, dass eine durch Komma getrennte Liste von IDs funktioniert. In Python mit imaplib, ich habe so etwas wie:

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

du versuchen können, die Header-Informationen aller Mails in nur 1 Gehen Sie zu Server zu holen.

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')