ابحث عن رسائل جديدة تمت إضافتها إلى صندوق بريد IMAP منذ آخر مرة تم فحصها مع Python Imaplib2؟
-
20-09-2019 - |
سؤال
أحاول كتابة برنامج يراقب صندوق بريد 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.