GMail: Mails älter als X Tage automatisch löschen

gmail-mails-aelter-als-x-tage-automatisch-loeschen-labels-banner-nong-vang-427138-unsplash-s

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.

Anleitung

Dafür habe ich als Grundlage ein Skript von labnol.org genommen und erweitert. Das neue Skript könnt ihr hier öffnen und anschließend benutzen:

  1. Wartet ein paar Sekunden, bis die Seite mit dem Skript fertig geladen ist.
  2. 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:
    gmail-mails-aelter-als-x-tage-automatisch-loeschen-labels-permissions
  3. Folgende Funktionsweise:
    Ganz oben die Variable PURGE_SETTINGS enthält, Komma getrennt, alle Labels jeweils mit der Anzahl an Tagen hinter dem Doppelpunkt, alles in einem paar geschweifte Klammern.
    var PURGE_SETTINGS = { „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.
    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.
  4. Legt nun also los, schreibt die PURGE_SETTINGS für eure Labels um (es geht auch nur 1 Label, 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:
Zufälliger Artikel:  Excel: Dynamisch eingefärbte Diagrammbalken je nach Werten
gmail-mails-aelter-als-x-tage-automatisch-loeschen-labels-logger

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:

  1. 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.
  2. 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_SETTINGS = { "Barketing": 800, "Auto & mehr": 365, "versicherung---vorsorge": 50 }

// 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, 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), https://it-stack.de
  
  T U T O R I A L
  - - - - - - - - 
  
  Step 1. Update the values of fields PURGE_SETTINGS 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_SETTINGS) {
    var purgeDays = PURGE_SETTINGS[label],
        count = 0,
        maxAge = new Date();
    maxAge.setDate(maxAge.getDate() - purgeDays); 
    var purgeBefore  = Utilities.formatDate(maxAge, Session.getScriptTimeZone(), "yyyy-MM-dd"),
        search = "label:" + label + " before:" + purgeBefore;
    
    Logger.log("Looking at label '" + label + "' 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 label '" + label + "' 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("Label '" + label + "' 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 label '" + label + "' and " + purgeDays + " days even after this purge, run it multiple times to purge all.");
        }
      }
      
    } catch (e) {
      Logger.log("Error: " + e);
    }
    
    Logger.log("############################### Label done");
  }
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.