2010-10-21 38 views
5

Intento eliminar el mensaje de la carpeta de la bandeja de entrada y todo está bien, pero cuando cambié a la carpeta All Mail, la eliminación no funciona. expunge() método devuelve ('OK', [None]) y el mensaje no se ha eliminado:Problema al eliminar correos en gmail usando imaplib

>>>import imaplib 
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993') 
>>>server.login('[email protected]','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]) 

Respuesta

7

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

También hay algunos más oscuros opciones para aquellos de ustedes que quieren hacer trabajo IMAP de Gmail más como proveedores IMAP tradicionales: puede desactivar la auto-EXPUNGE o basura mensajes cuando están sin más tiempo visible a través de IMAP.

El protocolo IMAP permite que los mensajes a ser marcados para su eliminación, una especie de limbo donde un mensaje no se presente en la carpeta pero programado para ser eliminará la próxima vez que la carpeta se borrado. En nuestra implementación estándar de IMAP , cuando marca un mensaje como eliminado, Gmail no permite que permanezca en ese estado: borra (o lo elimina automáticamente) de la carpeta de inmediato. Si desea el proceso de eliminación de 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.

Del mismo modo, la mayoría de los sistemas de IMAP No cuota concepto de Gmail de archivado de mensajes (envío de mensajes al [Gmail]/Todos carpeta de correo en lugar de [Gmail]/Papelera). Si prefiere que mensajes eliminados no queden en , otras carpetas IMAP visibles se envían a [Gmail]/Papelera, en su lugar, los controles Advanced IMAP le permiten establecer sus preferencias de esta manera. En la sección 'Acceso IMAP:' de la pestaña 'Reenvío y POP/IMAP', busque 'Cuando se elimina un mensaje de la última carpeta IMAP visible '. Seleccione 'Mueva el mensaje a la Papelera de Gmail'. Si desea dar un paso más en el , puede seleccionar 'Inmediatamente borrar el mensaje para siempre'.

6

Con Gmail advanced IMAP controls puede establecer qué sucede con los mensajes cuando los elimina mediante IMAP.

Simplemente active "Controles IMAP avanzados" en Gmail Labs. La página de configuración se verá así:

settings

Luego, cuando se marca un mensaje como eliminado y borrar según this answer será movido a la papelera, eliminado de forma permanente, o archivados a "Todos", en función de qué configuración seleccionaste

+1

He tratado su enfoque, pero cuando elimino un mensaje, el mensaje tendrá una etiqueta INBOX, mientras que si eliminamos de gmail, el mensaje no tendrá ninguna etiqueta. –

+2

Sé que este es un hilo muy viejo, pero para ayudar a cualquier otra persona con el problema anterior de Rahul, solo necesita quitar primero la "etiqueta de la bandeja de entrada" antes de agregar la etiqueta de la papelera. es decir 'imap.store (num, '-X-GM-LABELS', '\\ Inbox')' – Shogan

12

se mueve todo el correo en una etiqueta de Gmail dado a la Papelera 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 

Recuerde que actualizar la interfaz de Gmail causa que tiene caché

+0

Excelente sugerencia. ¿Dónde están los documentos sobre este uso de m.store()? – jml

+0

@jml: citando de [IMAP spec, RFC 3501] (https://tools.ietf.org/html/rfc3501): '* representa el número más grande en uso – ckhan

0

Aquí está uno que funciona con Gmail y lo hace muy rápidamente (sin almacenar en un ciclo for). Medida esta como desee, pero la idea es todo lo que hay sobre el uso de selección/búsqueda y luego realizar una tienda, o simplemente seleccionar por sí mismo 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('[email protected]_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." 
Cuestiones relacionadas