جلب رسائل IMAP متعددة مرة واحدة
سؤال
الأمثلة التي رأيتها حول تحميل رسائل البريد الإلكتروني عبر IMAP باستخدام Python قم بالبحث ثم لكل معرف رسالة في النتائج ، قم بإجراء استعلام. أريد تسريع الأمور عن طريق جلبها جميعًا مرة واحدة.
المحلول
يقول 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
نصائح أخرى
يمكنك تجربة ذلك لجلب معلومات الرأس لجميع الرسائل في 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')
لا تنتمي إلى StackOverflow