ابحث عن رسائل جديدة تمت إضافتها إلى صندوق بريد IMAP منذ آخر مرة تم فحصها مع Python Imaplib2؟

StackOverflow https://stackoverflow.com/questions/2047067

سؤال

أحاول كتابة برنامج يراقب صندوق بريد IMAP ونسخ تلقائيا كل رسالة واردة جديدة في مجلد "أرشيف". أنا أستخدم IMAPLIB2 الذي ينفذ الأمر الخمول. إليك برنامجي الأساسي:

M = imaplib2.IMAP4("mail.me.com")
M.login(username,password)
lst = M.list()
assert lst[0]=='OK'
for mbx in lst[1]:
    print "Mailboxes:",mbx

def process(m):
    print "m=",m
    res = M.recent()
    print res


M.select('INBOX')
M.examine(mailbox='INBOX',callback=process)
while True:
    print "Calling idle..."
    M.idle()
    print "back from idle"
M.close()
M.logout()

يطبع صناديق البريد بشكل صحيح ويتم تشغيل العملية () عند التغيير الأول في صندوق البريد. لكن الاستجابة من الأخيرة () لا معنى لي، وبعد الرسالة الأولى، لم أحصل على أي إخطارات أخرى.

أي شخص يعرف كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

انظر المثال والمراجع في بيثون imap-idle-with-imaplib2وبعد تنطوي الوحدة على الخيوط، يجب عليك الانتباه إلى مزامنة الحدث.

يشير المثال إلى المزامنة مع الأحداث، وتترك معالجة البريد إلى القارئ:

# The method that gets called when a new email arrives. 
# Replace it with something better.
def dosync(self):
    print "Got an event!"

أخذ تلميح من السؤال، "شيء أفضل" يمكن ان يكون:

# Replaced with something better.
def dosync(self):
    print "Got an event!"
    res = self.M.recent()
    print res

نصائح أخرى

أنا أجد أن حديثة () غامضة بعض الشيء (هذا غموض IMAP، وليس IMAPLIB2). يبدو أفضل للحفاظ على قائمة أرقام الرسائل قبل وبعد الخمول، والفرق هو رسائل جديدة.

ثم استخدم Fetch (الرسائل "،" UID ") للحصول على الرسالة UID.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top