Получение нескольких сообщений IMAP одновременно - PullRequest
5 голосов
/ 27 августа 2010

Примеры, которые я видел о загрузке писем через IMAP с использованием python, выполняют поиск, а затем для каждого идентификатора сообщения в результатах выполняют запрос. Я хочу ускорить процесс, извлекая их все сразу.

Ответы [ 2 ]

12 голосов
/ 27 августа 2010

RFC 3501 говорит, что fetch принимает набор последовательностей, но я не видел определения для этого, и в примере используется форма диапазона (2: 4 = сообщения 2, 3 и 4). Я понял, что список идентификаторов работает через запятую. В 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 голосов
/ 27 сентября 2010

Вы можете попробовать это, чтобы получить информацию заголовка всех писем всего за 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')
...