2010-01-12 5 views
3

J'essaie d'écrire un programme qui surveille une boîte aux lettres IMAP et copie automatiquement chaque nouveau message entrant dans un dossier "Archive". J'utilise imaplib2 qui implémente la commande IDLE. Voici mon programme de base:Trouver de nouveaux messages ajoutés à une boîte aux lettres imap depuis la dernière vérification avec python 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() 

Il imprime les boîtes aux lettres process() correctement et fonctionne lorsque le premier changement se produit à la boîte aux lettres. Mais la réponse de recent() n'a pas de sens pour moi, et après le premier message je n'ai jamais reçu d'autres notifications.

Quelqu'un sait-il comment faire?

Répondre

1

Voir l'exemple et les références dans python-imap-idle-with-imaplib2. Le module implique le filetage, vous devez faire attention à la synchronisation des événements.

L'exemple suggère la synchronisation avec les événements, et laisse le traitement du courrier au lecteur:

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

Prendre une indication de la question, "quelque chose de mieux" peut être:

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

Merci. Mais le code ne se déclenche qu'à chaque fois qu'un message est renvoyé; comment puis-je obtenir l'UID du message pour que je puisse faire quelque chose avec? – vy32

+0

Ajouté quelque chose que vous pouvez essayer. – gimel

+0

Merci. Je suis en train de mettre en place une application maintenant! – vy32

1

I Je trouve que recent() est un peu vague (c'est un vague IMAP, pas imaplib2). Il semble préférable de conserver une liste de numéros de message avant et après le repos, et la différence est de nouveaux messages.

Ensuite, utilisez fetch (messages, "UID") pour obtenir le message uid.

+0

Ouais. recent() a fini par ne pas fonctionner pour moi. J'ai aussi eu des problèmes avec imaplib2() - il se bloque après quelques heures de fonctionnement. Vous ne savez pas comment procéder ... Avez-vous du code qui fonctionne? – vy32

Questions connexes