Domanda

In Gmail, ho un sacco di messaggi etichettati.

Vorrei usare un client IMAP per ottenere quei messaggi, ma non sono sicuro di quale sia l'incantesimo di ricerca.

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

Non trovo molti esempi per questo genere di cose.

È stato utile?

Soluzione

imaplib è intenzionalmente un involucro sottile attorno al protocollo IMAP, presumo per consentire un maggiore grado di flessibilità dell'utente e una maggiore capacità di adattamento ai cambiamenti nelle specifiche IMAP. Di conseguenza, non offre alcuna struttura per le tue query di ricerca e richiede che tu abbia familiarità con Specifica IMAP .

Come vedrai nella sezione " 6.4.4. Comando SEARCH " ;, ci sono molte cose che puoi specificare per il criterio di ricerca. Nota che devi SELEZIONARE una casella di posta (il nome IMAP per una cartella) prima di poter cercare qualsiasi cosa. (La ricerca simultanea di più cartelle richiede più connessioni IMAP, a quanto ho capito.) IMAP4.list ti aiuterà a capire quali sono gli identificativi delle cassette postali.

Utile anche nel formulare le stringhe che passi a imaplib è " 9. Sintassi formale " dalla RFC collegata sopra.

Il r '(\ HasNoChildren) " / "' è un flag di mailbox sulla mailbox di root, / . Vedi "7.2.6. Risposta FLAGS " ;.

Buona fortuna!

Altri suggerimenti

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"')

Il modo più semplice di utilizzare imaplib con Gmail è utilizzare l'attributo X-GM-RAW come descritto nell'attributo pagina Estensioni di imap Gmail .

Il processo sarebbe così:

Per prima cosa connettiti all'account con l'e-mail e la password appropriate:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
password = 'spamspamspam'
c.login(email, password)

Quindi connettiti a una delle cartelle / etichette:

c.select("INBOX")

Se necessario, puoi elencare tutte le cartelle / etichette disponibili con c.list () .

Infine, usa il metodo di ricerca:

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

Nel gmail_search puoi utilizzare la stessa sintassi di ricerca utilizzata in ricerca avanzata di gmail .

Il comando di ricerca restituirà lo stato del comando e gli ID di tutti i messaggi che corrispondono a gmail_search.

Dopodiché puoi recuperare ogni messaggio per ID con:

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

Sono stato piuttosto sorpreso dal fatto che imaplib non esegua molto l'analisi della risposta. E sembra che le risposte siano state realizzate per essere difficili da analizzare.

FWIW, per rispondere alla mia domanda:     c.search (Nessuno, "GM")

(Non ho idea di cosa sia la parte '(\ HasNoChildren) " / "').

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