Problema al eliminar correos electrónicos en gmail usando imaplib

Intento eliminar el mensaje de la carpeta de la bandeja de entrada y todo está bien, pero cuando cambié a la carpeta Todo el correo, la eliminación no funciona. expunge() método expunge() devuelve ('OK', [None]) y el mensaje no se eliminó:

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

Como se dice en el sitio del blog de gmail , la implementación de IMAP de Google es un poco diferente. Cuando sigues las instrucciones para obtener la semántica más habitual, ¿ayuda?

También hay algunas opciones más oscuras para aquellos de ustedes que quieren hacer que el IMAP de Gmail funcione como los proveedores IMAP tradicionales: puede desactivar los mensajes de autoexcursión o basura cuando ya no están visibles a través de IMAP.

El protocolo IMAP permite que los mensajes se marquen para ser eliminados, una especie de estado de limbo donde un mensaje todavía está presente en la carpeta, pero está progtwigdo para eliminarse la próxima vez que se borre la carpeta. En nuestra implementación estándar de IMAP, cuando marca un mensaje como eliminado, Gmail no lo deja permanecer en ese estado, sino que lo elimina (o elimina automáticamente) de la carpeta de inmediato. Si desea el proceso de eliminación en dos etapas, después de habilitar este laboratorio, simplemente seleccione ‘No borrar automáticamente los mensajes’ en la pestaña ‘Reenvío y POP / IMAP’ en Configuración.

De manera similar, la mayoría de los sistemas IMAP no comparten el concepto de Gmail de archivar mensajes (enviando mensajes a la carpeta [Gmail] / All Mail en lugar de [Gmail] / Trash). Si prefiere que los mensajes eliminados que no permanecen en otras carpetas IMAP visibles se envíen a [Gmail] / Basura, los controles avanzados de IMAP le permiten configurar sus preferencias de esta manera. En la sección ‘Acceso IMAP:’ de la pestaña ‘Reenvío y correo POP / IMAP’, busque la opción ‘Cuando se borra un mensaje de la última carpeta IMAP visible:’. Seleccione ‘Mover el mensaje a la Papelera de Gmail’. Si desea ir un paso más allá, puede seleccionar ‘Eliminar inmediatamente el mensaje para siempre’.

Mueve todo el correo de una etiqueta de Gmail dada a la Papelera de Gmail.

 #!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 

Recuerda actualizar tu interfaz de gmail porque tiene caché.

Con los controles avanzados de IMAP de Gmail , puede establecer qué sucede con los mensajes cuando los elimina a través de IMAP.

Simplemente habilita los “Controles avanzados de IMAP” en los laboratorios de Gmail. La página de configuración se verá así:

ajustes

Luego, cuando marca un mensaje como eliminado y borra según esta respuesta, se moverá a la papelera, se eliminará de forma permanente o se archivará en “Todos los correos”, según la configuración que haya seleccionado.

Aquí hay uno que funciona con Gmail y lo hace muy rápidamente (sin almacenar en un bucle for). Adapte esto como desee, pero la idea está en cómo utilizar seleccionar / buscar y luego realizar una tienda, o simplemente seleccionar por su cuenta para todos los elementos con una etiqueta / carpeta específica:

 #!/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."