messaggi di posta elettronica Problema Eliminazione in Gmail utilizzando imaplib
-
10-10-2019 - |
Domanda
I provare a rimuovere un messaggio dalla cartella Posta in arrivo e tutto va bene, ma quando sono passato a Tutti i messaggi cartella rimozione non funziona. expunge()
metodo restituisce ('OK', [None])
e il messaggio non è stato rimosso:
>>>import imaplib
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993')
>>>server.login('likvidator89@gmail.com','Password')
>>>server.select('inbox')
>>>for i in server.search(None,'all')[1][0].split():
... print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
...
# that how i know what UID hame my message? I select by subject
#....
#28
#Subject: 1 Question Has 1 Answer - Stack Overflow
#
#
#29
#Subject: 2222222222
#...
>>>server.store(29,'+FLAGS','\\Deleted')
#('OK', ['29 (FLAGS (\\Seen \\Deleted))'])
>>>server.expunge()
#('OK', ['29'])
>>> server.select('[Gmail]/All Mail')
('OK', ['47'])
>>> for i in server.search(None,'all')[1][0].split():
... print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
...
#....
#
#46
#Subject: 2222222222
#
#
#47
#Subject: 3333333333333333
#
#....
>>> server.store(47,'+FLAGS','\\Deleted')
('OK', ['47 (FLAGS (\\Seen \\Deleted))'])
>>> server.expunge()
('OK', [None])
Soluzione
Come si dice sul gmail sito blog , l'implementazione di Google di IMAP è un po 'diverso. Quando si seguono le istruzioni per ottenere la semantica più usuali, lo fa d'aiuto?
Ci sono anche alcuni più oscuri opzioni per quelli di voi che vogliono rendere il lavoro IMAP di Gmail più simile fornitori IMAP tradizionali: è possibile disattivare l'auto-expunge o spazzatura i messaggi quando non sono più visibile attraverso IMAP.
Il protocollo IMAP permette che i messaggi essere contrassegnato per l'eliminazione, una sorta di Stato limbo in cui un messaggio è ancora presente nella cartella, ma previsto per essere cancellato la prossima volta che la cartella è espunta. Nel nostro standard IMAP implementazione, quando si contrassegna un messaggio come cancellato, Gmail non consente indugiare in quello stato - cancella (O auto-expunges) dalla cartella al momento. Se si desidera che i due stadi processo di cancellazione, dopo aver attivato Questo laboratorio, basta selezionare 'Do not cancellare automaticamente in messaggi la scheda 'Inoltro e POP / IMAP' in Impostazioni.
Allo stesso modo, la maggior parte dei sistemi IMAP non lo fanno condividere il concetto di Gmail di archiviazione messaggi (invio di messaggi al cartella [Gmail] / Tutti i messaggi, piuttosto che [Gmail] / Cestino). Se preferisci che messaggi eliminati non rimanenti in alcun altre cartelle IMAP visibili vengono inviati a [Gmail] / Cestino invece, IMAP avanzata Controlli consente di impostare le preferenze per di qua. Nel 'Accesso IMAP:' sezione della 'Inoltro e POP / IMAP 'scheda, trovare la' Quando un messaggio viene eliminato dall'ultima cartella IMAP visibile:' opzione. Selezionare 'Spostare il messaggio nel Cestino di Gmail.' Se si vuole fare un passo inoltre, è possibile selezionare 'Immediatamente eliminare il messaggio per sempre. '
Altri suggerimenti
si muove tutta la posta in una determinata etichetta gmail al gmail Cestino
#!usr/bin/python
import email, imaplib
user = 'xxx'
pwd = 'xxx'
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("some_gmail_label")
m.store("1:*",'+X-GM-LABELS', '\\Trash')
m.expunge() # should be useless, but gmail server says it is ok
Ricordate di aggiornare la vostra interfaccia di Gmail causa ha la cache
Gmail controlli IMAP avanzati è possibile impostare cosa succede ai messaggi quando li si elimina sopra IMAP.
Basta abilitare "Controlli avanzati IMAP" in Gmail Labs. La pagina delle impostazioni sarà simile a questa:
Poi, quando si contrassegna un messaggio come cancellati e expunge come per questa risposta verrà spostato nel cestino, in modo permanente eliminati o archiviati su 'Tutti i messaggi' a seconda di ciò impostazione selezionata.
Ecco uno che funziona con Gmail e lo fa molto velocemente (senza conservare in un ciclo for). Tailor questo come lo si desidera, ma l'idea è tutto quello che c'è su come utilizzare selezionare / search e quindi eseguire un negozio, o semplicemente selezionare da solo per tutti gli elementi con una specifica etichetta / cartella:
#!/bin/python
import datetime
import imaplib
m = imaplib.IMAP4_SSL("imap.gmail.com") # server to connect to
print "Connecting to mailbox..."
m.login('gmail@your_gmail.com', 'your_password')
print m.select('[Gmail]/All Mail') # required to perform search, m.list() for all lables, '[Gmail]/Sent Mail'
before_date = (datetime.date.today() - datetime.timedelta(365)).strftime("%d-%b-%Y") # date string, 04-Jan-2013
typ, data = m.search(None, '(BEFORE {0})'.format(before_date)) # search pointer for msgs before before_date
if data != ['']: # if not empty list means messages exist
no_msgs = data[0].split()[-1] # last msg id in the list
print "To be removed:\t", no_msgs, "messages found with date before", before_date
m.store("1:{0}".format(no_msgs), '+X-GM-LABELS', '\\Trash') # move to trash
print "Deleted {0} messages. Closing connection & logging out.".format(no_msgs)
else:
print "Nothing to remove."
#This block empties trash, remove if you want to keep, Gmail auto purges trash after 30 days.
print("Emptying Trash & Expunge...")
m.select('[Gmail]/Trash') # select all trash
m.store("1:*", '+FLAGS', '\\Deleted') #Flag all Trash as Deleted
m.expunge() # not need if auto-expunge enabled
print("Done. Closing connection & logging out.")
m.close()
m.logout()
print "All Done."