2009-08-18 3 views
4

Lange Rede kurzer Sinn, ich habe ein neues Google Mail-Konto erstellt und mehrere andere Konten damit verbunden (jeweils mit 1000 Nachrichten), die ich importiere. Alle importierten Nachrichten kommen als ungelesen, aber ich brauche sie als gelesen zu lesen.Parsen Sie Gmail mit Python und markieren Sie alle älter als Datum als "lesen"

Ich habe ein wenig Erfahrung mit Python, aber ich habe nur Mail-und Imaplib-Module zum Senden von E-Mails, nicht zur Verarbeitung von Konten.

Gibt es eine Möglichkeit zur Massenverarbeitung aller Elemente in einem Posteingang, und markieren Sie einfach Nachrichten älter als ein bestimmtes Datum als gelesen?

Antwort

8
typ, data = M.search(None, '(BEFORE 01-Jan-2009)') 
for num in data[0].split(): 
    M.store(num, '+FLAGS', '\\Seen') 

Dies ist eine leichte Modifikation des Codes in den imaplib doc page für die Speicher-Methode. Ich fand die Suchkriterien von RFC 3501 zu verwenden. Dies sollte Ihnen den Einstieg erleichtern.

+0

Danke! Genau das habe ich gesucht! – Eric

+0

Für mich hat das Datumsformat '(SINCE 01-Jan-2011)' funktioniert. Dh, DD-MMM-JJJJ, thx – dhaval

+0

Danke für die heads up, dhaval. Ich habe das Beispiel korrigiert. Hat super für mich gearbeitet. –

1

Anstatt zu versuchen, unsere HTML zu analysieren, warum nicht einfach die IMAP-Schnittstelle verwenden? Schließen Sie es an einen Standard-E-Mail-Client an und sortieren Sie dann einfach nach Datum und markieren Sie die gewünschten Nachrichten als gelesen.

+0

weil es nicht so viel Spaß macht? Um es klar zu sagen, ich beabsichtige, die Imap-Schnittstelle zu verwenden, aber ich versuche, einen neuen Trick auf dem Weg zu lernen. Ich möchte keinen Mail-Client auf meinem Computer installieren, wenn dies technisch ohne einen möglich sein sollte. – Eric

+1

Ah ok, mir war nicht klar, dass Spaß in diesem Projekt oberste Priorität hatte;) – Marplesoft

1

Gehen Sie einfach zur Google Mail-Weboberfläche, führen Sie eine erweiterte Suche nach Datum durch, wählen Sie dann alle aus und markieren Sie sie als gelesen.

+0

Funktioniert nicht. Tausende von Nachrichten, und Gmail lässt mich nur 20 gleichzeitig auswählen ... – Eric

+4

Für mich wird eine kleine Nachricht angezeigt, die besagt "Alle 20 Konversationen auf dieser Seite sind ausgewählt. Wählen Sie alle Konversationen aus, die dieser Suche entsprechen" und Sie können alle Ihre Nachrichten auswählen. –

2

Basierend auf Philip T.'s Antwort oben und RFC 3501 und RFC 2822, habe ich einige Codezeilen erstellt, um Mails, die älter als 10 Tage sind, als gelesen zu markieren. Für die abgekürzten Monatsnamen wird eine statische Liste verwendet. Das ist nicht besonders elegant, aber Pythons% b-Formatzeichenfolge hängt vom Gebietsschema ab, was zu unangenehmen Überraschungen führen könnte. Alle IMAP-Befehle sind UID-basiert.

import imaplib, datetime 

myAccount = imaplib.IMAP4(<imapserver>) 
myAccount.login(<imapuser>, <password>) 
myAccount.select(<mailbox>) 

monthListRfc2822 = ['0', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
beforeDate = datetime.datetime.today() - datetime.timedelta(days = 10) 
beforeDateString = ("(BEFORE %s-%s-%s)" 
        % (beforeDate.strftime('%d'), 
         monthListRfc2822[beforeDate.month], 
         beforeDate.strftime('%Y'))) 
typ, data = myAccount.uid('SEARCH', beforeDateString) 
for uid in data[0].split(): 
    myAccount.uid('STORE', uid, '+FLAGS', '(\Seen)') 

By the way: Ich weiß nicht, warum "-" hatte in meinem Fall (Dovecot IMAP-Server) als Datumstrennzeichen in der Suchzeichenfolge verwendet werden. Für mich scheint das dem RFC 2822 zu widersprechen. Daten mit einfachen Leerzeichen als Trennzeichen gaben jedoch nur IMAP-Fehler zurück.

Verwandte Themen