2008-10-07 9 views
10

In Google Mail habe ich eine Reihe von etikettierten Nachrichten.Wie führe ich eine IMAP-Suche in Python durch (mit Gmail und imaplib)?

Ich möchte einen IMAP-Client verwenden, um diese Nachrichten zu erhalten, aber ich bin mir nicht sicher, was die Suchbeschwörung ist.

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

Ich finde nicht viele Beispiele für diese Art von Sache.

Antwort

8

imaplib ist absichtlich eine dünne Wrapper rund um das IMAP-Protokoll, ich nehme an, um ein höheres Maß an Benutzerflexibilität und eine größere Fähigkeit zu Anpassung an Änderungen in der IMAP-Spezifikation zu ermöglichen. Daher bietet es keine Struktur für Ihre Suchanfragen und erfordert, dass Sie mit der IMAP specification vertraut sind.

Wie Sie in Abschnitt "6.4.4. Befehl SUCHEN" sehen, gibt es viele Dinge, die Sie für das Suchkriterium angeben können. Beachten Sie, dass Sie ein Postfach (IMAP-Name für einen Ordner) SELECT müssen, bevor Sie nach etwas suchen können. (Das gleichzeitige Durchsuchen mehrerer Ordner erfordert mehrere IMAP-Verbindungen, wie ich es verstehe.) IMAP4.list hilft Ihnen herauszufinden, was die Postfachkennungen sind.

Auch nützlich bei der Formulierung der Zeichenfolgen, die Sie an imaplib übergeben ist "9. Formal Syntax" aus dem RFC nach oben verknüpft.

Die r'(\HasNoChildren) "/"' ist ein Postfach-Flag für das Stammpostfach /. Siehe "7.2.6. FLAGS-Antwort".

Viel Glück!

5
+1

Das ist nicht wahr. Sie können conn.select ("some-label-name") nicht ausführen. –

+2

@pyrony: Ja, du kannst. Gmail ** -Etiketten ** werden als IMAP-Postfächer der obersten Ebene ** angezeigt. Ich bin mir nicht sicher, warum sie sich dafür entschieden haben, anstatt sie als IMAP-Keywords zu veröffentlichen, aber Gmail hat sich dafür entschieden. – dkarp

0

Ich war ziemlich überrascht, dass imaplib nicht viel der Antwortanalyse tut. Und es scheint, dass Antworten so erstellt wurden, dass sie schwer zu analysieren sind.

FWIW, meine eigene Frage zu beantworten: c.search (None, 'GM')

(Ich habe keine Ahnung, was das '(\ HasNoChildren) "/"' Teil ausmacht.)

+0

Dies sollte in die ursprüngliche Frage über eine Bearbeitung integriert werden. (Es ist keine Antwort.) – cdleary

+0

@cdleary: Haben Sie 'c.search (None, 'GM')' 'Teil bemerkt. Es könnte die falsche Antwort sein. Aber es ist eine Antwort. – jfs

+0

Oh, verpasste das. Das tut mir leid. – 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

Der einfachste Weg, mit Google Mail verwenden imaplib ist das X-GM-RAW Attribut zu verwenden, wie in den Gmail Imap Extensions page beschrieben.

würde der Prozess so aussehen:

Zuerst mit der entsprechenden E-Mail und Passwort für den Account:

c.select("INBOX") 
:

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

dann zu einem des Ordner/Labels verbinden

Bei Bedarf können Sie alle verfügbaren Ordner/Etiketten mit c.list() auflisten.

Schließlich verwenden die Suchmethode:

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

In der gmail_search Sie die gleichen Suchsyntax in gmail advanced search verwendet verwenden können.

Der Suchbefehl gibt den Status des Befehls und die IDs aller Nachrichten zurück, die mit Ihrer gmail_search übereinstimmen.

Danach können Sie jede Nachrichten-ID holen mit:

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