Recupero più messaggi IMAP in una sola volta
Domanda
Gli esempi che ho visto sugli e-mail di carico oltre IMAP utilizzando python fare una ricerca e poi per ogni id messaggio nei risultati, fanno una query. Voglio accelerare le cose in crescita di tutte recupero in una volta.
Soluzione
RFC 3501 dice recuperare prende un set di sequenza, ma non ho visto una definizione per questo e l'esempio utilizza un modulo di gamma (2: 4 = messaggi 2, 3 e 4). Ho capito che una virgola elenco di ID lavori separati. In pitone con imaplib, ho qualcosa di simile:
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
Altri suggerimenti
Si può provare questo per recuperare le informazioni di intestazione di tutte le mail in appena 1 Andare su Server.
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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow