2014-05-01 2 views
1

J'ai appris à utiliser la bibliothèque python imaplib pour un projet sur lequel je travaille, mais je vois un comportement qui m'a bloqué. Lorsque j'essaie de faire une recherche avec 'NOT FROM', elle retourne la même chose que 'FROM', comme si le non n'était même pas là. Mon hypothèse est que je ne fais que mettre la commande en erreur, mais j'ai cherché quelques exemples et chacun que j'ai trouvé semble faire comme je suis. J'ai essayé tous les moyens de saisir ce que je peux penser, mais aucun d'entre eux ne semble fonctionner. J'ai vérifié les deux RFC2060, celui imaplib dit qu'il est basé sur et certains des plus récents.Python imaplib search Mot clé 'NOT'

$ python --version 
Python 2.7.5+ 

Est-ce que quelqu'un voit où je suis en train de bousiller ou voit aussi ce problème? Il y a très peu de là-bas sur cette bibliothèque particulière, il semble


EDIT: Je l'ai regardé pour un peu plus loin et il semble être un problème spécifique avec le serveur imap je me connecte à .. après avoir essayé de se connecter sur OpenSSL avec

$ openssl s_client -connect imap.mail.yahoo.com:993 -crlf 

et vous connecter et essayer

UID SEARCH FROM "gmail" 
UID SEARCH NOT FROM "gmail" 

je reçois le même comportement.

Cependant, lorsque je me connecte à un compte gmail

$ openssl s_client -connect imap.gmail.com:993 -crlf 

et essayer

UID SEARCH FROM "gmail" 
UID SEARCH NOT FROM "gmail" 

Je reçois le comportement attendu.

Je suppose que cela est « RESOUDRE », puis

+0

J'ai vérifié votre code, cela fonctionne très bien. – Mortezaipo

+0

Merci! Mais je ne suis pas sûr de ce que vous voulez dire par là, je sais que ça va très bien. Le problème était que NOT FROM "foo" retournait la même chose que FROM "foo". Voulez-vous dire que cela ne s'est pas passé pour vous? (Avez-vous essayé sur yahoo mail? Parce qu'il semble que c'était la racine du problème.) – user3591723

+0

J'ai essayé avec Gmail, avec PAS DE 'gmail' il m'a eu: ('OK', ['21 23 24 25 35 37 38 41 42 ']) et avec FROM' gmail ': (' OK ', ['12 13 14 15 16 17 18 19 20 22 26 27 28 29 30 31 32 33 34 36']) – Mortezaipo

Répondre

0

Je l'ai regardé pour un peu plus loin et il semble y avoir un problème spécifique avec le serveur imap je connecte. . Après avoir essayé de se connecter sur OpenSSL avec

$ openssl s_client -connect imap.mail.yahoo.com:993 -crlf 

et vous connecter et essayer

UID SEARCH FROM "gmail" 
UID SEARCH NOT FROM "gmail" 

J'ai le même comportement.

Cependant, lorsque je me connecte à un compte gmail

$ openssl s_client -connect imap.gmail.com:993 -crlf 

et essayer

UID SEARCH FROM "gmail" 
UID SEARCH NOT FROM "gmail" 

Je reçois le comportement attendu.

Je suppose que c'est "RESOLU" alors

0

NOT FROM gmail fonctionne très bien dans Gmail imap, mais sur Yahoo il ne fonctionne pas.

Essayez-le:

import imaplib 
## connect to imap server 
mail = imaplib.IMAP4_SSL('imap.mail.yahoo.com') 
mail.login('username','password') 
mail.select('inbox') 

## search all mails 
all_mail = mail.search(None,'ALL') 

## search all gmails 
all_gmail = mail.search(None,'(FROM "gmail")') 

## make them as list of int 
all_mail = [x for x in all_mail[1][0].split() if x != ""] 
all_gmail = [x for x in all_gmail[1][0].split() if x != ""] 
not_gmail = [x for x in all_mail if x not in all_gmail] 
#not_gmail = set(all_mail) - set(all_gmail)  

## get the output 
print "all mail: " + str(all_mail) 
print "all gmail: " + str(all_gmail) 
print "all not gmail: " + str(not_gmail) 

Il est un peu lent, mais fonctionne très bien. Et pour RFC ont un regard sur:

http://tools.ietf.org/html/rfc3501.html

http://tools.ietf.org/html/draft-ietf-imapext-regex-00

+1

Je suis venu avec un hack similaire, mais je fais juste les ensembles à la place parce que l'ordre n'a pas vraiment d'importance pour moi :) Kinda idiot que yahoo n'a pas de RECHERCHE disponible en état de fonctionnement à mon avis! – user3591723

+0

@ user3591723 Je trouve juste comme ça. J'espère que cela vous sera utile. ;) – Mortezaipo

Questions connexes