2010-08-27 30 views
5

Python kullanarak IMAP üzerinden e-posta yüklemeyle ilgili gördüğüm örnekler bir arama yapar ve sonuçlarda her ileti kimliği için bir sorgu yapar. Hepsini bir an önce alıp hızlandırmak istiyorum.Aynı anda birden çok IMAP iletisi alma

+4

Arama yapmak ve sonuçta oluşan tüm iletileri tek bir işlemle almak istiyorum. Birisi dikkat etmediğimde yeni bir fizik yasası eklemediyse, iyi olacağımı düşünüyorum. –

cevap

12

RFC 3501, getirmenin bir dizi kümesi aldığını ancak bunun için bir tanım görmediğimi ve örnekte bir aralık biçimi kullandığını (2: 4 = ileti 2, 3 ve 4) söyledi. Virgülle ayrılmış ids listesinin çalıştığını anladım. Sunucuya sadece 1 Go tüm postaların başlık bilgilerini almak için bu deneyebilirsiniz

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

: imaplib ile piton, ben böyle bir şey var.

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') 
İlgili konular