Domanda

Per farla breve, ho creato un nuovo account Gmail, e collegati molti altri conti ad esso (ognuno con 1000s di messaggi), che sto importazione. Tutti i messaggi importati arrivano come non letto, ma ho bisogno di loro di apparire come letto.

Ho un po 'di esperienza con Python, ma ho usato solo i moduli di posta e imaplib per l'invio di posta elettronica, non è l'elaborazione di conti.

C'è un modo per processo in massa tutti gli elementi in una casella di posta, e semplicemente segnare i messaggi più vecchi di una data specificata come leggere?

È stato utile?

Soluzione

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

Questa è una leggera modifica del codice nella imaplib doc pagina per la metodo store. Ho trovato i criteri di ricerca da utilizzare da RFC 3501 . Questo dovrebbe iniziare.

Altri suggerimenti

In base alla risposta di Philip T. sopra e RFC 3501 e RFC 2822 , ho costruito alcune righe di codice per segnare mail più vecchie di 10 giorni come letto. Un elenco statico viene utilizzato per i nomi dei mesi abbreviati. Questo non è particolarmente elegante, ma% b stringa di formato di Python dipende dal locale, che potrebbe dare sorprese sgradevoli. Tutti i comandi IMAP sono UID basano.

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

A proposito: non so, perché "-" doveva essere usato come delimitatore data nella stringa di ricerca nel mio caso (server IMAP dovecot). Per me che sembra contraddire RFC 2822. Tuttavia, le date con semplice spazio bianco come delimitatore restituito solo errori IMAP.

Piuttosto che cercare di analizzare il nostro HTML perché non basta utilizzare l'interfaccia IMAP? Collegarlo ad un client di posta standard e poi semplicemente ordina per data e segnare a seconda di quale quelli che si desidera come lettura.

Basta andare l'interfaccia web di Gmail, eseguire una ricerca avanzata per data, quindi selezionare tutto e segnare come letto.

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