Plusieurs messages Récupérer IMAP à la fois
Question
Les exemples que je l'ai vu sur les e-mails de chargement sur python en utilisant IMAP faire une recherche, puis pour chaque identifiant de message dans les résultats, faire une requête. Je veux accélérer les choses en les aller chercher à la fois.
La solution
RFC 3501 dit prend un ensemble d'extraction de séquence, mais je ne vois pas une définition pour cela et l'exemple utilise une forme de gamme (2: 4 = messages 2, 3 et 4). Je me suis dit qu'une liste séparée par des virgules des œuvres ids. En python avec imaplib, j'ai quelque chose comme:
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
Autres conseils
Vous pouvez essayer cette chercher les informations d'en-tête de tous les mails en 1 Go au serveur.
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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow