2010-08-27 3 views
5

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

+4

Я хочу выполнить поиск, а затем получить все полученные сообщения за одну операцию. Если кто-то не добавит новый закон о физике, когда я не обращу внимания, я думаю, что все будет в порядке. –

ответ

12

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

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