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.

Était-ce utile?

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
scroll top