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])
È stato utile?

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:

Impostazioni

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."
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top