2008-10-07 18 views
10

En Gmail, tengo un montón de mensajes etiquetados.¿Cómo realizo una búsqueda IMAP en Python (usando Gmail e imaplib)?

Me gustaría utilizar un cliente IMAP para obtener esos mensajes, pero no estoy seguro de qué es el encantamiento de búsqueda.

c = imaplib.IMAP4_SSL('imap.gmail.com') 
c.list() 
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...]) 
c.search(???) 

No encuentro muchos ejemplos para este tipo de cosas.

Respuesta

8

imaplib es intencionalmente una envoltura delgada alrededor del protocolo IMAP, supongo que para permitir un mayor grado de flexibilidad del usuario y una mayor capacidad para adaptarse a los cambios en la especificación IMAP. Como resultado, realmente no ofrece ninguna estructura para sus consultas de búsqueda y requiere que esté familiarizado con el IMAP specification.

Como verá en la sección "6.4.4. Comando BUSCAR", hay muchas cosas que puede especificar para el criterio de búsqueda. Tenga en cuenta que debe llamar al SELECT un buzón de correo (nombre de IMAP para una carpeta) antes de buscar cualquier cosa. (La búsqueda simultánea de varias carpetas requiere varias conexiones IMAP, según tengo entendido). IMAP4.list le ayudará a descubrir qué son los identificadores de los buzones.

También es útil para formular las cadenas que pasa a imaplib es "9. Sintaxis formal" de la RFC vinculada anteriormente.

El r'(\HasNoChildren) "/"' es un indicador de buzón en el buzón raíz, /. Ver "7.2.6. Respuesta de FLAGS".

¡Buena suerte!

5
+1

Esto no es cierto. No puede hacer conn.select ("some-label-name"). –

+2

@pyrony: Sí, puedes. Las ** etiquetas ** de Gmail están expuestas como buzones IMAP ** de nivel superior **. No estoy seguro de por qué decidieron hacerlo en lugar de exponerlos como palabras clave de IMAP, pero eso es lo que Gmail decidió hacer. – dkarp

0

He estado bastante sorprendido de que imaplib no haga mucho del análisis de respuestas. Y parece que las respuestas fueron diseñadas para ser difíciles de analizar.

Fwiw, para responder a mi propia pregunta: c.search (Ninguna, 'GM')

(no tengo ni idea de qué '(\ HasNoChildren) "/"' parte se trata.)

+0

Esto se debe incorporar a la pregunta original a través de una edición. (No es una respuesta.) – cdleary

+0

@cdleary: ¿Ha notado la parte 'c.search (None, 'GM')'. Puede ser la respuesta incorrecta. Pero es una respuesta. – jfs

+0

Oh, lo perdí. Lo siento por eso. – cdleary

7
import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
obj.login('username', 'password') 
obj.select('**label name**') # <-- the label in which u want to search message 
obj.search(None, 'FROM', '"LDJ"') 
0

La forma más fácil de usar imaplib con Gmail es utilizar el atributo X-GM-RAW como se describe en la Gmail Imap Extensions page.

El proceso sería la siguiente:

Primero conecte a la cuenta con el correo electrónico y la contraseña apropiada:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993) 
email = '[email protected]' 
password = 'spamspamspam' 
c.login(email, password) 

continuación, conectarse a una de las carpetas/etiquetas:

c.select("INBOX") 

Si es necesario, puede listar todas las carpetas/etiquetas disponibles con c.list().

Por último, utilice el método de búsqueda:

gmail_search = "has:attachment eggs OR spam" 
status, data = c.search(None, 'X-GM-RAW', gmail_search) 

En el gmail_search puede utilizar la misma sintaxis de búsqueda utilizado en gmail advanced search.

El comando de búsqueda devolverá el estado del comando y los ID de todos los mensajes que coincidan con su búsqueda de gmail.

Después de esto se puede recuperar cada uno de los mensajes por id con:

for id in data[0].split(): 
    status, data = gmail.fetch(id, '(BODY[TEXT])') 
Cuestiones relacionadas