Ich will, dass Termine aus meinen E-Mails von selbst in meinem Kalender landen — aber ohne Google. Bau mir dafür ein kleines Werkzeug, das auf meinem Mac läuft, meine Post direkt vom Server holt und die Termine in den Kalender einträgt, den ich ohnehin benutze. Sag mir zuerst, ob das für mich überhaupt der richtige Weg ist. Wenn ich Gmail lese und meine Termine in Google Kalender führe, ist ein Skript auf Googles Plattform die bessere Lösung: Das läuft dort auch, wenn mein Rechner aus ist. Dieses Werkzeug hier lohnt sich, wenn meine Post woanders liegt oder wenn die Termine in meinen iCloud-Kalender sollen — dort kommt Google nämlich nicht hinein. Frag mich das offen und lass mich entscheiden, bevor wir anfangen. Dann frag mich aus — einzeln, nicht als Liste, und warte meine Antwort ab: 1. Bei welchem Anbieter mein Postfach liegt. Nenn mir dazu die IMAP-Adresse, die ich brauche, statt mich danach suchen zu lassen. 2. Welche Ordner durchsucht werden sollen. Nur der Posteingang, oder auch abgelegte. 3. In welchen Kalender die Termine sollen. Mein Mac kennt meist mehrere — iCloud, lokale, eingebundene. Sag mir, wie ich die genauen Namen herausfinde, und frag nach, wenn mehrere in Frage kommen. 4. Wonach sortiert werden soll: nach Absenderadresse, nach Wörtern im Betreff, nach der Adresse, an die geschrieben wurde. Ich will einstellen können, welche Mails eingetragen werden und welche nicht. 5. Ob verschiedene Regeln in verschiedene Kalender schreiben sollen. 6. Bei welchen dieser Regeln auch dann ein Termin entstehen soll, wenn die Mail keinen Kalenderanhang hat und das Datum nur im Fließtext steht. 7. Wie weit zurück gesucht werden soll. Wenn ich eine Regel vage beschreibe, frag nach einer echten Mail aus meinem Postfach als Beispiel. „Alles von der Uni“ ist keine Regel, „Absender endet auf @hochschule.de“ ist eine. Frag mich nicht nach meinem Passwort und schreib es nirgends in den Code. Erklär mir stattdessen, wie ich ein App-Passwort erzeuge — bei aktivierter Zwei-Faktor-Anmeldung geht es ohnehin nur so — und wie ich es im Schlüsselbund oder in einer Umgebungsvariablen ablege, damit das Skript es dort abholt. Dann bau das Werkzeug. Die folgenden Anforderungen sind nicht verhandelbar. Jede davon ist ein Fehler, den man sonst macht: Öffne das Postfach ausdrücklich schreibgeschützt. Sonst markiert die Standardbibliothek beim Abholen jede gelesene Nachricht als gelesen, und mein Ungelesen-Zähler leert sich, ohne dass ich eine einzige Mail gesehen habe. Das merkt man erst, wenn es passiert ist, und rückgängig machen kann man es nicht. Merk dir die Nachrichten über ihre UID, nicht über die Sequenznummer. Sequenznummern verschieben sich, sobald eine Mail im Postfach gelöscht wird — eine damit geführte Liste zeigt danach auf die falschen Nachrichten, und du legst Termine doppelt an oder überspringst welche. Leg die Liste der verarbeiteten Nachrichten in einer Datei neben dem Skript ab und überspring bekannte sofort. Ohne das legt jeder Durchlauf dieselben Termine noch einmal an. Prüf zusätzlich gegen den Kalender selbst, ob ein Termin mit gleichem Titel und gleicher Anfangszeit schon existiert. Die eigene Liste allein reicht nicht: Wer sie zurücksetzt oder das Skript auf einem zweiten Rechner startet, bekommt sonst von allem Zwillinge. Das Werkzeug liest, mehr nicht. Es sendet nichts, löscht nichts, verschiebt nichts, ändert keine Markierungen. Schreib das auch als Kommentar in den Code, damit es beim späteren Erweitern nicht verlorengeht. Lizenz CC BY 4.0 · Vincent Weber · vwincenzo.com Bau einen Trockenlauf als eigene Funktion. Die protokolliert nur, was sie tun würde — welche Mail, welche Regel greift, welcher Kalender, welches Datum sie gelesen hat — und legt nichts an. Die läuft als Erstes und so lange, bis das Ergebnis stimmt. Bau eine zweite Funktion, die die gemerkten UIDs wieder löscht. Das ist der Notausgang, wenn beim Ausprobieren etwas schiefging. Zwei Wege, in dieser Reihenfolge. Hat die Mail einen Anhang, dessen Name auf .ics endet oder dessen Typ „calendar“ enthält, lies den Termin daraus — das ist immer genauer. Nur wenn kein solcher Anhang da ist, versuch das Datum aus Betreff und Text zu lesen, und das ausschließlich bei den Regeln, bei denen ich es ausdrücklich erlaubt habe. Ohne diese Einschränkung wird jeder Newsletter mit einer Jahreszahl zu einem Kalendereintrag. Beim Lesen der .ics-Datei entfaltest du zuerst die Zeilen. Das Format bricht lange Zeilen um und setzt sie mit einem führenden Leerzeichen oder Tabulator fort. Wer das nicht rückgängig macht, bekommt abgeschnittene Titel und halbe Beschreibungen. Ganztägige Termine: Das Enddatum im ICS ist exklusiv, es bezeichnet den Tag danach. Zieh einen Tag ab, sonst ist jeder ganztägige Termin bei mir einen Tag zu lang. Und ein Datum, das auf Z endet, ist UTC und muss umgerechnet werden — der Rest ist Ortszeit. Fürs Lesen aus dem Fließtext deckst du beide deutschen Schreibweisen ab: 25.06.2026 und „25. Juni 2026“, jeweils mit und ohne Uhrzeit, und die Uhrzeit sowohl als 14:30 als auch als „14 Uhr“. Findest du nur ein Datum und keine Uhrzeit, leg einen ganztägigen Termin an, statt eine Uhrzeit zu erfinden. Findest du gar kein Datum, schreib das ins Protokoll und leg nichts an. Sortier die Regeln so, dass die erste Übereinstimmung gewinnt, und schreib mir dazu, in welcher Reihenfolge sie geprüft werden. Bei überlappenden Regeln entscheidet die Reihenfolge, und das soll ich sehen können, ohne den Code zu lesen. Sag mir, welche Freigabe der Kalenderzugriff verlangt und wann macOS danach fragt. Das passiert beim ersten Lauf und nur, wenn ich angemeldet bin — läuft das Skript später im Hintergrund und die Freigabe fehlt, scheitert es lautlos. Für die Zeitsteuerung nimm launchd, nicht cron. Cron ist auf dem Mac ein Auslaufmodell und bekommt nicht den richtigen Sitzungskontext. Protokollier jeden angelegten Termin mit Kalender und Titel, und jeden Fehlschlag mit dem Grund. In eine Datei, damit ich auch nachsehen kann, was gestern passiert ist. Zum Schluss: Ein Befehl im Terminal ist eine Hürde. Bau mir einen Starter zum Anklicken, den ich statt eines Zeitplans auch von Hand auslösen kann. Auf dem Mac ist eine App nur ein Ordner mit fester Struktur — Info.plist, ein Shell-Skript, ein Symbol. Kein Xcode, keine Übersetzung. Sag mir dabei die zwei Dinge, die dabei schiefgehen: Der Finder vererbt den PATH der Kommandozeile nicht, ein blosses „python3“ greift also ins Leere; und ohne Ausführungsrecht weigert er sich, das Skript überhaupt zu starten. Gib mir das Ganze als einen Block zum Einfügen, nicht als drei Dateien zum Abtippen. Wenn du fertig bist, gib mir: ## Ist das der richtige Weg für mich ## Das Werkzeug ## Wie ich das App-Passwort hinterlege ## Wie ich es starte und wie ich es plane ## Was ich vor dem ersten echten Lauf prüfe ## Woran es scheitern wird Und zum Schluss: Sag mir in drei Sätzen, welche meiner Regeln du für zu weit gefasst hältst und welche Mails damit versehentlich im Kalender landen könnten.