2010-10-21 7 views
5

Ich versuche, die Nachricht aus dem Posteingang Ordner und alles in Ordnung zu entfernen, aber wenn ich in den Ordner "Alle Mail" wechselte, funktioniert das Entfernen nicht. expunge() Methode gibt ('OK', [None]) und Nachricht nicht entfernt wurde:Problem beim Löschen von E-Mails in Google Mail mit 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]) 

Antwort

7

Wie heißt es auf der gmail blog site, Google-Implementierung von IMAP ist ein bisschen anders. Wenn Sie den Anweisungen für eine gebräuchlichere Semantik folgen, hilft das?

Es gibt auch einige Unbekannten Optionen für diejenigen, die auf wollen Google Mail-IMAP-Arbeit mehr wie traditionellen IMAP-Anbieter machen: Sie können ausschalten Auto-expunge oder Müll Nachrichten, wenn sie nicht sind länger sichtbar über IMAP.

Das IMAP-Protokoll erlaubt es, Nachrichten zu zum Löschen markiert werden, eine Art Schwebe Zustand, in dem eine Nachricht noch in dem Ordner ist aber geplant, um zu sein löschte das nächste Mal, wenn der Ordner ausgelöscht wird. In unserer IMAP-Standardimplementierung , wenn Sie eine Nachricht als gelöscht markieren, lässt Google Mail es nicht in diesem Zustand verweilen - es löscht (oder Auto-löscht es) aus dem Ordner sofort. Wenn Sie den zweistufigen Löschvorgang möchten, nachdem Sie dieses Lab aktiviert haben, wählen Sie einfach "Do not automatisch lösche Nachrichten" unter die Registerkarte "Weiterleitung und POP/IMAP" in Einstellungen.

ähnlich die meisten IMAP-Systeme nicht Aktie Gmail Konzept der Archivierung Nachrichten (Nachrichten an den [Google Mail]/Allen Mail-Ordner anstatt [Google Mail]/Papierkorb senden). Wenn Sie möchten, dass gelöschte Nachrichten nicht in einem anderen anderen sichtbaren IMAP-Ordner werden an [Gmail]/Papierkorb stattdessen, Advanced IMAP Controls können Sie Ihre Einstellungen auf diese Weise festlegen. Suchen Sie im Bereich "IMAP-Zugriff:" auf der Registerkarte "Weiterleitung" und " POP/IMAP" die Meldung "Wenn eine Nachricht aus der letzten sichtbaren IMAP-Ordneroption" : gelöscht wird. Wählen Sie 'Verschieben Sie die Nachricht in den Google Mail-Papierkorb.' Wenn Sie einen Schritt weiter gehen wollen, können Sie wählen "sofort löschen Sie die Nachricht für immer."

6

Mit Gmail advanced IMAP controls können Sie festlegen, was mit Nachrichten passiert, wenn Sie sie über IMAP löschen.

Aktivieren Sie einfach "Erweiterte IMAP-Steuerelemente" in Gmail Labs. Die Einstellungsseite wird wie folgt aussehen:

settings

Dann, wenn Sie eine Nachricht markieren als gelöscht und tilgt gemäß this answer wird es in den Papierkorb verschoben werden, endgültig gelöscht oder auf „All Mail“ archiviert je nach Welche Einstellung hast du ausgewählt?

+1

ich versucht habe, Ihr Ansatz, aber wenn ich eine Nachricht lösche, wird die Nachricht ein INBOX-Label haben, während, wenn wir aus Google Mail selbst löschen, die Nachricht kein Label haben wird. –

+2

Ich weiß, dass dies ein wirklich alter Thread ist, aber um anderen mit Rahuls Problem zu helfen, müssen Sie zuerst das "Inbox Label" entfernen, bevor Sie das Trash Label hinzufügen. d. h. 'imap.store (num, '-X-GM-LABELS', '\\ Inbox')' – Shogan

12

es bewegt sich alle E-Mails in einem bestimmten gmail-Label auf den gmail Trash

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

Denken Sie daran, Ihre gmail-Schnittstelle zu aktualisieren Ursache es Cache

+0

Großer Vorschlag. Wo sind die Dokumente für diese Verwendung von m.store()? – jml

+0

@jml: Zitat aus der [IMAP-Spezifikation, RFC 3501] (https://tools.ietf.org/html/rfc3501): '* stellt die größte verwendete Nummer dar – ckhan

0

Hier hat, ist eine, die mit Google Mail funktioniert und tut es sehr schnell (ohne Speicherung in einer for-Schleife). Tailor dies, wie Sie wollen, aber die Idee ist alles da, wie select/Suche verwenden und dann einen Laden führen, oder wählen Sie einfach auf eigene für alle Artikel mit einem bestimmten Label/Ordner:

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