2012-03-27 12 views
1

Ich weiß, dass es eine Reihe von Bibliotheken für den Zugriff auf IMAP gibt, von Java, Python usw. Aber was ich machen möchte, ist sehr spezifisch und widerspricht den meisten Imap-Beispielen.IMAP "Over Quota" spezifisches Scripting

Die leichten Teile:

  • ein IMAP-Server, Login und spezifische Ordnernamen
  • Nuke alle Nachrichten in diesem Ordner (? Oder Nuke den Ordner, wenn die einfache oder effiziente) Da

Die atypischen Teile:

  • ein expunge Sie nach jedem N
  • löscht
  • Fügen Sie einige Wiederholungs- und Stapelgrößenlogik hinzu, so dass ausgelastete Server - sogar das Löschen und Löschen von 100 Nachrichten pro Sitzung - eine Hilfe sein könnten.
  • Laden Sie nicht alle Header herunter!

Dieser letzte Punkt ist ein Problem. Jeder E-Mail-Client, den ich versucht habe, erstickt beim Herunterladen der 20.000 E-Mail-Header - die ich nicht sehen muss.

Mit POP3 Scripting ich sequentielle IDs gerade gegeben habe, 1, 2, 3 ...

Aber jedes IMAP-Beispiel, das ich gesehen habe, scheint einiges Feld zu verwenden, dass es aus den Headern bekam. Vielleicht erfordert das Löschen von IMAP-Nachrichten eine ID, die Sie nicht erraten können? (und kann nur durch eine Abfrage erhalten?)

Wenn ich Header bekommen musste, kann dies zumindest so kompakt wie möglich gemacht werden? Oder lassen Sie mich nur 100 auf einmal machen?

Alternativ habe ich versucht, einen gesamten Ordner über E-Mail-Client-Benutzeroberflächen zu löschen, aber das scheint nicht zu funktionieren. Ich denke, es versucht, alle Header zuerst in den Papierkorb zu verschieben, und scheitert daran, also kommt nie zum Löschen-Teil. Ich bin mir also nicht sicher, ob das Löschen eines Ordners tatsächlich effizienter ist als das Löschen seines Inhalts.

Alle Gedanken geschätzt. Ich arbeite normalerweise in Java oder Python, aber ich bin flexibel. Ich denke, das ist ein Protokollproblem, kein Bibliotheksproblem.

Antwort

2

Angenommen, Sie sind nicht einen atypischen Server (wie gmail, die ganz untypisch ist) verwenden Sie diese Befehle tun, nach dem LOGIN, und wählen Sie [Ordner]:

A001 STORE 1:N +FLAGS (\Deleted) 
A002 EXPUNGE 
A003 STORE 1:N +FLAGS (\Deleted) 
A004 EXPUNGE 

Und so weiter, wo Sie ersetzen N mit Ihrer Stapelgröße. Dadurch wird der Papierkorbordner nicht verwendet (es sei denn, Ihr IMAP-Server verfügt über eine spezielle Logik, z. B. Google Mail: Optimieren Sie für Google Mail Ihre IMAP-Zugriffseinstellungen).

Sie sollten in der Lage sein, dies zu tun:

A001 STORE 1:* +FLAGS (\Deleted) 
A002 EXPUNGE 

, dass, obwohl eine Weile dauern kann.

In der Tat können Sie ein Tool wie socat verwenden, um das Protokoll selbst anmelden und sprechen:

socat READLINE: OPENSSL:[server]:993,noverify,crlf 
a LOGIN [user] "[password]" 
b SELECT [folder] 

Und dann den Laden und tilgen Befehle von oben.

0

Die IMAP specification bietet eine DELETE command, die eine gesamte Mailbox zerstören kann.

+0

Dank @sarnold gute Info, ABER ich bin mir nicht sicher, dass es behebt. Nehmen wir an, "junk_folder" enthält 100.000 Nachrichten und ich verwende den Befehl DELETE. Ich vermute, dass dies für viele Implementierungen problematisch sein wird. Von dem, was ich gesehen habe, denke ich, dass der IMAP-Server 100.000 Kopierbefehle in den Papierkorb starten wird und die gelöschten Flags auf die ursprünglichen 100.000 Nachrichten setzen werden, so dass Sie jetzt 200.000 Nachrichten haben und für eine Weile mehr Kontingent haben. Nur wenn alles getan ist, wird es den Raum leeren und zurückerobern und wird stattdessen wahrscheinlich ersticken. Gedanken?? (Abhängig von der Implementierung des Kurses) –

+0

Sofern Ihre Implementierung nicht besonders fehlerhaft ist, sollte DELETE [folder] nicht dazu führen, dass alle Nachrichten in den Papierkorb verschoben werden. "Trash" -Ordner sind nicht Teil der Spezifikation und sind meist nur ein Gentleman-Vertrag von Kunden. Google ist eine Ausnahme: Sie arbeiten viel im Hintergrund, aber Sie können die zu löschenden Einstellungen sofort ändern. – Max

+0

@Max: Danke für die zusätzlichen Details. – sarnold