Alte Mails automatisch löschen
Im vorletzten Artikel habe ich über das Aufräumen von Speicherplatz in GMail gesprochen. Es ging darum, Mail-Anhänge herunterzuladen und damit besonders große Speicherfresser loszuwerden. Der heutige Artikel wird primär aufräumen, weniger den Fokus auf Mailgröße.
Es geht im Detail darum, alte Mails loszuwerden, flexibel konfigurierbar. GMail selbst löscht Mails nur aus dem Papierkorb automatisch – Mails älter als 30 Tage werden dauerhaft gelöscht. Leider wird diese Funktionalität nicht für alle anderen Mails angeboten. Dies lässt sich jedoch nachrüsten, mit Google Apps Scripts, einer eigenen Programmiersprache von Google, ähnlich Javascript.
Ziel soll es sein, alte Mails bestimmter Labels automatisch nächtlich löschen zu lassen. Dabei lassen sich die Labels und die Anzahl der Tage für jedes Label beliebig einstellen. Die Reinigung kann entweder manuell oder eben täglich ausgeführt werden, wie es eben gerade gebraucht wird.
Das Skript und die Nutzung
🔶🔷 Das Skript könnt ihr hier öffnen 🔷🔶
Es basiert auf einem Skript von labnol.org, wurde von mir aber stark erweitert. Nachfolgende die Schritt-für-Schritt-Anleitung, wie ihr das Skript für euer GMail einrichtet:
- Wartet ein paar Sekunden, bis die Editor-Seite mit dem Skript fertig geladen ist.
- Erstellt euch in diesem Editor eine eigene Kopie des Skripts via: Datei -> Kopie erstellen bzw. File -> Make a copy. Dadurch wird in eurem Google Account, in eurem Speicherplatz eures Google Skript Editors eine Kopie erstellt.
Datenschutz-Disclaimer an dieser Stelle, obwohl hoffentlich eindeutig: Ich verarbeite keinerlei Daten von euch, ich erhalte in keinster Weise Zugriff auf euer GMail-Konto, ich kann nicht auf eure Skripte zugreifen, mit der Kopie des Codes ist das Skript in eurem privaten Bereich/Account. - Ihr könnt das Skript via File -> Make a Copy auch erst in euren Google Account kopieren und dann fortfahren. Das kann auch Probleme lösen, wenn Google meckert: „Die Anmeldung mit Google ist für diese App vorübergehend deaktiviert“ usw.
- Startet Run -> Run function -> Initialize: Hierbei wird ein Popup von euch die Berechtigungen erfragen („Review permissions“), die das Skript braucht. Es öffnet sich dann ein Popup, ihr wählt den gewünschten GMail Account aus -> setzt fort mit „Erweitert“/“Advanced“ -> Sicherheitshinweis bestätigen -> Rechte mit „Erlauben“/“Allow“ bewilligen, fertig eingerichtet.
Genau genommen wird das Bearbeiten eurer GMail Daten bewilligt, was zum automatischen Löschen eurer Mails nötig ist. Keine Sorge, hier passiert kein Mist, kein Datenscreening, der komplette Code ist unten oder im Skriptfenster selbst für euch einsehbar.
Die erteilten Berechtigungen könnt ihr jederzeit im Sicherheitscheck „Zugriff durch Drittanbieter-Apps“ nachsehen: - Folgende Funktionsweise:
Ganz oben die Variablen PURGE_LABELS und PURGE_CATEGORIES enthalten jeweils, Komma getrennt, alle Labels bzw. Kategorien jeweils mit der Anzahl an Tagen hinter dem Doppelpunkt, alles in einem paar geschweifte Klammern.
var PURGE_LABELS = { „Auto“: 2000, „Deals“: 365 }
würde demnach im Label Auto alle Mails, die älter sind als 2000 Tage und alle Mails innerhalb von Deals älter als 1 Jahr, löschen.
var PURGE_CATEGORIES = { „Social“: 1000, „Updates“: 2000, „Promotions“: 3000 } löscht Mails der Kategorien „Soziale Netzwerke“, „Benachrichtigungen“ und „Werbung“.
Mehr zum Thema Labels vs. Kategorien und wie die korrekten Namen der eigenen Labels aussehen, findet ihr unten im nächsten Absatz. - Die Zeile var TEST_PURGE = „yes“; bestimmt, ob die Ausführungen nur testen, also keine Mails tatsächlich löschen. Bei „yes“ wird ein Durchgang simuliert, über den Logger (STRG+Enter oder View->Logs) erhaltet ihr dann alle Infos der Ausführung. Wird hier ein beliebiger anderer Wert eingetragen, z.B. „no“, werden Mails auch gelöscht.
- Legt nun also los, schreibt die PURGE_LABELS / PURGE_CATEGORIES für eure Zwecke um (es geht auch nur 1 Element, ohne Komma am Ende dann), belasst TEST_PURGE erst einmal auf „yes“ und startet das Skript über Run -> Run functions -> purgeGmail.
Eine gelbe Infomeldung über dem Code zeigt euch, dass das Tool läuft, solange es läuft. Verschwindet die Info, könnt ihr euch im Logger (STRG+Enter oder View->Logs) die Ergebnisse anschauen. Enthalten sind Infos wieviele Konversationen pro Label gefunden wurden und wieviele Mails gelöscht worden wären. Es sind meist mehr Mails als Konversationen, da GMail Mails mit gleichem Betreff einer Konversation zuordnet. Mögliches Resultat im Logger:
Label, Kategorie, interne Namen, was ist was?
Die lesbaren Bezeichner „Posteingang“, „Gesendet“ usw. haben eigentlich andere interne Namen, die von meinem Skript korrekt angesprochen werden müssen. Das Skript unterscheidet in Labels und Kategorien und die internen Namen sind meist englisch oder anders formatiert. Das kann zuweilen etwas verwirrend sein. Daher hier eine schnelle Übersicht über die vordefinierten Elemente:
- Posteingang: Label „inbox“
- Markiert: Label „starred“
- Zurückgestellt: Label „snoozed“
- Wichtig: Label „important“
- Gesendet: Label „sent“
- Entwürfe: Label „draft“
- Alle E-Mails: Label „all“
- Soziale Netzwerke: Kategorie „social“
- Benachrichtigungen: Kategorie „updates“
- Foren: Kategorie „forums“
- Werbung: Kategorie „promotions“
Bei den eigenen Labels müsst ihr ein bisschen aufpassen, wie die interne Benennung tatsächlich lautet. Leerzeichen sowie einige Sonderzeichen werden intern durch ein Minus ersetzt, das Ausrufezeichen bleibt aber beispielsweise so:
- Eigenes Label „Invest & Mehr“: Label „invest—mehr“
- Eigenes Label „Wohnung!“: Label „wohnung!“
400 – Limit
Das Bild zeigt direkt die Schwäche des Skripts: Es kann pro Ausführung maximal 400 Konversationen löschen, welche jedoch beliebig viele E-Mails pro Konversation enthalten können. Das Limit ist technisch bedingt durch die API – bis 500 konnte ich gehen, aber ich wollte einen Sicherheitspuffer. Hier kann man mit „paged calls“ ansetzen, also mehrere Aufrufe nacheinander triggern, was jedoch in diesem Aufbau, in dem mehrere Labels bearbeitet werden, zu komplex ist.
In einem Label mit zigtausenden alten Mails, muss das Skript also erst mehrfach durchlaufen. Wenn ein Durchlauf in einem Label mehr als 400 Konversationen findet, wird eine weitere Suche nach der Bereinigung durchgeführt und die Restanzahl angezeigt. Ist diese erneut 400, sind es wohl noch mehr Konversationen und weitere Durchläufe sind nötig.
2 Möglichkeiten:
- Wenn ihr es eilig habt, dann könnt ihr einfach mehrfach nacheinander Run -> Run function -> purgeGmail ausführen. Jede Ausführung aber zu Ende arbeiten lassen, bis die gelbe Notification weg ist. Prüft ruhig nach jedem Durchlauf euer GMail parallel, dass dort die Anzahl der Mails weniger wird.
- Installiert das Skript einfach über Run function -> Install und lasst es in Ruhe. Nachts wird es ausgeführt und löscht 400 Konversationen. Das macht es nun jede Nacht und irgendwann sind dann alle Mails weg, egal wieviele es waren.
Code
Hier jetzt noch der Code – wenn es Fragen gibt, schreibt ein Kommentar oder mir eine Mail und wir klären das. Die API-Dokumentation von Google ist ein guter Anlaufpunkt bei Fragen zu den Google-basierten Funktionen.
Der Quelltext hier hier einsehbar: Code anzeigen
// Hint: Execution will generate logs for you to see whats going on - view logs with CTRL+Enter or View -> Logs at any time (while execution or after it, Logs are saved until the next run).
// format needed = { "Barketing": 800, "Auto & mehr": 365 } - would delete mails from label "Barketing" if older than 800 days and from "Auto & mehr" if older than 1 year.
// If you encounter problems detecting label mails: If your Label contains whitespace or other non-alphabetical characters, please go to GMail, open (click on) your label and look into the search bar.
// Here you will see your label name that you need to put in here. It might be "test-label" for "Test Label" or "car---more" for "Car & more". For me, both label naming types worked well but maybe it helps in special cases.
var PURGE_LABELS = { "Deals": 2000 }
// You also can purge predefined GMail categories like "Werbung", "Soziale Netzwerke", "Foren" and "Benachrichtigungen", but you have to you english keywords for these.
// Use it as with labels, but use these keywords, combined with a number of days: "Werbung"="Promotions"; "Foren"="Forums"; "Soziale Netzwerke"="Social"; "Benachrichtigungen"="Updates"
var PURGE_CATEGORIES = { "Social": 1000, "Updates": 2000, "Promotions": 3000 }
// set this to "yes" to run a purge without deleting emails. The function will just detect how many emails would be affected and print the count to Logger (CTRL+ENTER or View -> Logs)
// assign any other value to run a real purge.
var TEST_PURGE = "yes";
/*
For more details, please refer https://it-stack.de/15/08/2018/gmail-mails-aelter-als-x-tage-automatisch-loeschen
Original script from: http://labnol.org/?p=276053
Modified by: Hannes Schurig (Aug 2018 + Okt 2019), https://it-stack.de
T U T O R I A L
- - - - - - - -
Step 1. Update the values of fields PURGE_LABELS, PURGE_CATEGORIES and TEST_PURGE above.
Step 2. Go to Run -> Run function -> Initialize and authorize the script.
Step 3. Go to Run -> Run function -> Install to install the script. It will be executed every night.
Step 3.1 Or run it manually: Run -> Run function -> purgeGmail
Also, you may go to Run -> Uninstall to stop the purging script.
*/
function Intialize() {
return;
}
function Install() {
// start right after install, wait a minute to take effect, view Logs (CTRL+Enter) to look for execution
ScriptApp.newTrigger("purgeGmail")
.timeBased()
.at(new Date((new Date()).getTime() + 1000*10))
.create();
// install for daily execute (at night around 1am)
ScriptApp.newTrigger("purgeGmail")
.timeBased().everyDays(1).create();
}
function Uninstall() {
var triggers = ScriptApp.getScriptTriggers();
for (var i=0; i<triggers.length; i++) {
ScriptApp.deleteTrigger(triggers[i]);
}
}
function purgeGmail() {
for(var label in PURGE_LABELS) {
var purgeDays = PURGE_LABELS[label];
executePurge(label, purgeDays, "label");
}
for(var category in PURGE_CATEGORIES) {
var purgeDays = PURGE_CATEGORIES[category];
executePurge(category, purgeDays, "category");
}
}
function executePurge(elem, purgeDays, type) {
var count = 0,maxAge = new Date();
maxAge.setDate(maxAge.getDate() - purgeDays);
var purgeBefore = Utilities.formatDate(maxAge, Session.getScriptTimeZone(), "yyyy-MM-dd"),
search = type + ":" + elem + " before:" + purgeBefore;
Logger.log("Looking at " + type + " '" + elem + "' and purge mails older than " + purgeDays + " days (before " + purgeBefore + ")...");
if (TEST_PURGE === "yes") {
Logger.log("Test_purge active, no e-mails will be deleted. You can view the amount of affected mails in the Logger (CTRL+ENTER).")
}
try {
var threads = GmailApp.search(search, 0, 400);
Logger.log("Threads: "+threads.length);
if (threads.length == "400") {
Logger.log("Maximum threads (and possibly more applicable mails) for " + type + " '" + elem + "' and " + purgeDays + " days, run it multiple times to purge all.");
}
for (var i=0; i<threads.length; i++) {
var messages = GmailApp.getMessagesForThread(threads[i]);
for (var j=0; j<messages.length; j++) {
var email = messages[j];
if (email.getDate() < maxAge) {
if (TEST_PURGE !== "yes") {
email.moveToTrash();
}
count++;
}
}
}
Logger.log(type + " '" + elem + "' purged, deleted " + count + " mails.");
if (threads.length == 400) {
var threads2 = GmailApp.search(search, 0, 400);
Logger.log("Remaining threads after this purge: "+threads2.length);
if (threads2.length == "400") {
Logger.log("Maximum threads of 400 (and possibly more applicable mails) for " + type + " '" + elem + "' and " + purgeDays + " days even after this purge, run it multiple times to purge all.");
}
}
} catch (e) {
Logger.log("Error: " + e);
}
Logger.log("############################### " + elem + " done");
}