Trova nuovi messaggi aggiunti a una casella di posta IMAP dall'ultima volta che ho controllato con pitone imaplib2?
-
20-09-2019 - |
Domanda
Sto cercando di scrivere un programma che controlla una casella di posta IMAP e copia automaticamente ogni nuovo messaggio in arrivo in una cartella "Archivio". Sto utilizzando imaplib2 che implementa il comando IDLE. Ecco il mio programma di base:
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()
Esso stampa correttamente le cassette postali e di processo () viene eseguito quando il primo cambiamento avviene alla cassetta postale. Ma la risposta di recente () non ha senso per me, e dopo il primo messaggio non ho mai ottenere qualsiasi altro notifiche.
Qualcuno sa come fare questo?
Soluzione
Si veda l'esempio e riferimenti in python-imap -idle-con-imaplib2. Il modulo prevede threading, si dovrebbe prestare attenzione alla sincronizzazione degli eventi.
L'esempio suggerisce la sincronizzazione con gli eventi, e lascia elaborazione della posta al lettore:
# The method that gets called when a new email arrives.
# Replace it with something better.
def dosync(self):
print "Got an event!"
Prendendo spunto dalla questione, "qualcosa di meglio" può essere:
# Replaced with something better.
def dosync(self):
print "Got an event!"
res = self.M.recent()
print res
Altri suggerimenti
mi sto trovando che la recente () è un po 'vago (si tratta di una vaghezza IMAP, non imaplib2). Sembra meglio mantenere un elenco di numeri di messaggio prima e dopo di inattività, e la differenza è di nuovi messaggi.
Quindi utilizzare fetch (messaggi, "UID") per ottenere il messaggio uid.