Trova nuovi messaggi aggiunti a una casella di posta IMAP dall'ultima volta che ho controllato con pitone imaplib2?

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top