Suchen Sie neue Nachrichten, die zu einem IMAP -Mailbox hinzugefügt wurden, da ich das letzte Mal mit Python iMaplib2 überprüft habe?
-
20-09-2019 - |
Frage
Ich versuche ein Programm zu schreiben, das eine IMAP -Mailbox überwacht und jede neue eingehende Nachricht automatisch in einen "Archiv" -Fordner kopiert. Ich verwende IMAPLIB2, das den Idle -Befehl implementiert. Hier ist mein grundlegendes Programm:
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()
Es druckt die Postfächer ordnungsgemäß aus und läuft den Prozess () aus, wenn die erste Änderung in der Mailbox stattfindet. Aber die Antwort von neuem () macht für mich keinen Sinn, und nach der ersten Nachricht bekomme ich nie andere Benachrichtigungen.
Weiß jemand, wie man das macht?
Lösung
Siehe Beispiel und Referenzen in Python-Imap-idle-mit-Imaplib2. Das Modul umfasst Threading, Sie sollten auf die Ereignissynchronisation achten.
Das Beispiel schlägt die Synchronisierung mit Ereignissen vor und überlässt die E -Mail -Verarbeitung an den Leser:
# The method that gets called when a new email arrives.
# Replace it with something better.
def dosync(self):
print "Got an event!"
Einen Hinweis auf die Frage nehmen, "etwas Besseres" kann sein:
# Replaced with something better.
def dosync(self):
print "Got an event!"
res = self.M.recent()
print res
Andere Tipps
Ich finde, dass neuer () ein bisschen vage ist (dies ist eine IMAP -Unbestimmtheit, nicht IMAPLIB2). Scheint besser vor und nach dem Leerlauf eine Liste von Nachrichtennummern zu führen, und der Unterschied sind neue Nachrichten.
Verwenden Sie dann Fetch (Nachrichten, "UID"), um die Nachricht UID zu erhalten.