2026-05-31 14:02:16 +02:00
2026-05-31 09:16:04 +02:00
2026-05-31 09:16:04 +02:00
2026-05-31 14:02:16 +02:00
2026-05-12 12:31:18 +02:00
2026-05-31 09:29:20 +02:00
2026-05-31 14:02:16 +02:00
2026-05-31 09:16:04 +02:00
2026-05-31 14:02:16 +02:00
2026-05-31 09:16:04 +02:00
2026-05-31 09:16:04 +02:00

ICS-Importer für mailbox.org unter Linux

Dieses Projekt durchsucht ein mailbox.org-Postfach per IMAP nach E-Mails mit .ics-Anhängen und importiert enthaltene Termine automatisch per CalDAV in einen mailbox.org-Kalender.[cite:45][cite:55]

Überblick

Der Importer ist für ein einfaches, robustes Linux-Setup gedacht:

  1. Das Skript verbindet sich per IMAP mit mailbox.org und durchsucht einen Ordner, standardmäßig INBOX.[cite:55][cite:338]
  2. Nachrichten werden mit BODY.PEEK[] gelesen, damit sie beim Abruf nicht automatisch als gelesen markiert werden.[cite:338][cite:350]
  3. .ics-Anhänge werden erkannt, per Hash gegen Doppelverarbeitung abgesichert und anschließend per CalDAV importiert.[cite:45][cite:162]
  4. Nur Mails mit mindestens einem erfolgreich importierten ICS-Anhang werden optional als gelesen markiert; fehlgeschlagene oder irrelevante Mails bleiben ungelesen.[cite:340][cite:357]

Projektstruktur

ics-importer/
├── ics_mail_importer_env_v2.py
├── .env.example
├── .env
├── imported_uids.txt
├── ics_importer.log
├── cron.log
└── README.md

Voraussetzungen

Benötigt werden:

  • Linux
  • Python 3
  • pipenv
  • Ein mailbox.org-Konto
  • IMAP- und CalDAV-Zugang
  • Bei aktiver Zwei-Faktor-Authentifizierung ein App- oder Applikationspasswort für externe Anwendungen.[cite:45][cite:55]

Installation

mkdir -p ~/ics-importer
cd ~/ics-importer
pipenv install python-dotenv caldav icalendar

python-dotenv liest Schlüssel-Wert-Paare aus einer .env-Datei und stellt sie dem Skript als Umgebungsvariablen bereit.[cite:162][cite:164]

Konfiguration mit .env

Beispiel für .env.example:

IMAP_HOST=imap.mailbox.org
IMAP_PORT=993
IMAP_USERNAME=ihr-name@mailbox.org
IMAP_PASSWORD=IHR_PASSWORT_ODER_APP_PASSWORT
IMAP_FOLDER=INBOX
IMAP_UNSEEN_ONLY=true
IMAP_MARK_AS_READ=true

CALDAV_URL=https://dav.mailbox.org/caldav/IHR_KALENDER_ID
CALDAV_USERNAME=ihr-name@mailbox.org
CALDAV_PASSWORD=IHR_PASSWORT_ODER_APP_PASSWORT

Die IMAP-Standardwerte für mailbox.org sind imap.mailbox.org und Port 993; die vollständige mailbox.org-E-Mail-Adresse wird als Benutzername verwendet.[cite:55]

Die vollständige CalDAV-URL des Zielkalenders wird in mailbox.org im Kalender über Eigenschaften angezeigt; mailbox.org verwendet dafür Adressen im Format https://dav.mailbox.org/caldav/XXX.[cite:45][cite:355]

Datei anlegen und schützen:

cp .env.example .env
chmod 600 .env
nano .env

Bedeutung der Variablen

Variable Bedeutung
IMAP_HOST mailbox.org IMAP-Server, normalerweise imap.mailbox.org.[cite:55]
IMAP_PORT IMAP über SSL/TLS, normalerweise 993.[cite:55]
IMAP_USERNAME mailbox.org-E-Mail-Adresse.[cite:55]
IMAP_PASSWORD Passwort oder App-Passwort.
IMAP_FOLDER Zu prüfender Ordner, meist INBOX.
IMAP_UNSEEN_ONLY Wenn true, werden nur ungelesene Nachrichten gesucht.
IMAP_MARK_AS_READ Wenn true, werden nur erfolgreich verarbeitete ICS-Mails als gelesen markiert.
CALDAV_URL Vollständige CalDAV-URL des Zielkalenders.[cite:45]
CALDAV_USERNAME mailbox.org-E-Mail-Adresse als CalDAV-Benutzername.[cite:45]
CALDAV_PASSWORD Passwort oder Applikationspasswort.

Verhalten beim Markieren als gelesen

Die aktuelle Skriptversion ist bewusst so gebaut, dass nicht alle geprüften Mails als gelesen markiert werden. Stattdessen gilt:

  • Mails ohne ICS-Anhang bleiben unverändert.
  • Mails mit ICS-Anhang bleiben ungelesen, wenn kein Termin erfolgreich importiert wurde.
  • Nur Mails mit mindestens einem erfolgreich importierten ICS-Inhalt werden per UID STORE mit \\Seen markiert, sofern IMAP_MARK_AS_READ=true gesetzt ist.[cite:353][cite:357][cite:340]

Das Abrufen über BODY.PEEK[] verhindert, dass der Fetch selbst schon den Seen-Status setzt.[cite:350][cite:338]

Python-Skript

Das Hauptskript heißt ics_mail_importer_env_v2.py. Es nutzt:

  • python-dotenv für .env
  • imaplib für IMAP
  • email zum Parsen von Nachrichten und Anhängen
  • icalendar zum Parsen von ICS-Dateien
  • caldav für den Kalendereintrag auf mailbox.org.[cite:162][cite:338]

Beispielstart:

cd ~/ics-importer
pipenv run python3 ics_mail_importer_env_v2.py

Erster Testlauf

Vor dem Einsatz mit Cron sollte das Skript immer einmal manuell getestet werden:

pipenv run python3 ics_mail_importer_env_v2.py

Dabei sollte geprüft werden:

  • IMAP-Anmeldung funktioniert
  • der richtige Ordner wird gelesen
  • ICS-Anhänge werden erkannt
  • Termine landen im gewünschten mailbox.org-Kalender
  • nur erfolgreich verarbeitete ICS-Mails werden als gelesen markiert

Cron-Einrichtung

Interpreter-Pfad aus pipenv ermitteln:

cd ~/ics-importer
pipenv --py

Beispiel für stündliche Ausführung:

0 * * * * /home/hans/.local/share/virtualenvs/ics-importer-wOz4rK-o/bin/python /home/hans/ics-importer/ics_mail_importer_env_v2.py >> /home/hans/ics-importer/cron.log 2>&1

Die User-Crontab wird mit crontab -e gepflegt. Für stündliche Jobs sind 0 * * * * oder @hourly die üblichen Varianten.

Logrotation

Wenn cron.log verwendet wird, sollte die Datei per logrotate rotiert werden. Beispiel für /etc/logrotate.d/ics-importer:

/home/hans/ics-importer/cron.log {
    weekly
    rotate 4
    compress
    delaycompress
    missingok
    notifempty
    create 0644 hans hans
}

Diese Konfiguration rotiert wöchentlich, hält vier alte Versionen vor und komprimiert ältere Logs.

Thunderbird und mailbox.org

Thunderbird ist für dieses Projekt nicht zwingend nötig, aber mailbox.org empfiehlt IMAP für Mail und CalDAV für Kalender.[cite:45][cite:55]

IMAP in Thunderbird

Thunderbird erkennt mailbox.org häufig automatisch; IMAP ist der empfohlene Modus.[cite:55]

CalDAV in Thunderbird

Kalender lassen sich in Thunderbird über Datei → Neu → Kalender → Im Netzwerk → CalDAV einbinden. Die vollständige CalDAV-Adresse ist in mailbox.org beim Kalender über Eigenschaften sichtbar.[cite:45][cite:355]

Falls erforderlich, kann in Thunderbird zusätzlich calendar.network.multirealm=true gesetzt werden, um Authentifizierungsprobleme zu vermeiden.[cite:45][cite:64]

Sicherheit

.env enthält Zugangsdaten im Klartext und darf nicht öffentlich geteilt oder in Git eingecheckt werden. python-dotenv ist für lokale Konfiguration gedacht, ersetzt aber kein zentrales Secret-Management.[cite:162][cite:164]

Empfehlungen:

  • .env nur lokal speichern
  • chmod 600 .env setzen
  • .env in .gitignore eintragen
  • bei aktiver 2FA App-/Applikationspasswörter verwenden.[cite:45][cite:55]

Fehlersuche

IMAP funktioniert nicht

Prüfen:

  • IMAP_HOST=imap.mailbox.org
  • IMAP_PORT=993
  • vollständige E-Mail-Adresse als Benutzername
  • App-Passwort bei aktiver 2FA
  • richtiger Ordner in IMAP_FOLDER.[cite:55]

CalDAV funktioniert nicht

Prüfen:

  • vollständige CalDAV-URL aus den Kalendereigenschaften
  • richtiger Benutzername
  • Passwort oder Applikationspasswort
  • Schreibrechte auf den Zielkalender.[cite:45][cite:355]

Mail wird zu früh als gelesen markiert

Die Version ics_mail_importer_env_v2.py verwendet BODY.PEEK[], damit das bloße Abrufen den Seen-Status nicht verändert. Das Lesen-Markieren erfolgt erst danach gezielt per UID STORE, und nur wenn der Import erfolgreich war.[cite:338][cite:350][cite:357]

Empfohlener Betriebsmodus

Für die meisten Setups ist diese Kombination sinnvoll:

  • IMAP_UNSEEN_ONLY=true
  • IMAP_MARK_AS_READ=true
  • stündliche Ausführung per Cron
  • Duplikat-Schutz über imported_uids.txt

Damit werden nur neue Nachrichten geprüft, unnötige Doppelimporte vermieden und nur tatsächlich erfolgreich verarbeitete ICS-Mails als gelesen markiert.

S
Description
Automatischer ICS-Importer für mailbox.org: Liest ICS-Anhänge aus einem IMAP-Postfach und importiert Termine per CalDAV in einen mailbox.org-Kalender. Konfiguration über .env, Ausführung per Cron unter Linux.
Readme 116 KiB
Languages
Python 100%