7.2 KiB
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:55][cite:45]
Überblick
Der technische Ablauf ist bewusst einfach gehalten:
- Das Python-Skript verbindet sich per IMAP mit mailbox.org und durchsucht einen Ordner, standardmäßig
INBOX.[cite:56][cite:55] - Es erkennt
.ics-Anhänge, berechnet einen Hash als Duplikat-Schutz und verarbeitet nur neue Anhänge. - Die Termine werden per CalDAV in den gewünschten mailbox.org-Kalender geschrieben, dessen URL in mailbox.org über die Kalendereigenschaften ermittelt wird.[cite:45][cite:51]
- Die Ausführung erfolgt manuell oder stündlich per Cron.
Voraussetzungen
Benötigt werden:
- Linux
- Python 3
pipenv- Ein mailbox.org-Konto
- Zugriff auf IMAP und CalDAV
- Bei aktiver Zwei-Faktor-Authentifizierung ein App- bzw. Applikationspasswort für externe Anwendungen.[cite:63][cite:45]
Projektstruktur
ics-importer/
├── ics_mail_importer_env.py
├── .env.example
├── .env
├── imported_uids.txt
├── ics_importer.log
├── cron.log
└── README.md
Installation
Projektverzeichnis anlegen und Abhängigkeiten installieren:
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 als Umgebungsvariablen bereit.[cite:162][cite:164]
Konfiguration mit .env
Eine .env.example kann als Vorlage verwendet werden:
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=false
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, Port 993, SSL/TLS und die vollständige E-Mail-Adresse als Benutzername.[cite:56][cite:55]
Die vollständige CalDAV-URL des Zielkalenders wird in mailbox.org im Kalender über Eigenschaften angezeigt; für Thunderbird und andere Clients wird https://dav.mailbox.org/caldav/XXX verwendet, wobei XXX die individuelle Kalender-ID ist.[cite:45][cite:51]
.env lokal 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:56] |
IMAP_PORT |
IMAP-SSL-Port, normalerweise 993.[cite:56] |
IMAP_USERNAME |
mailbox.org-E-Mail-Adresse.[cite:55] |
IMAP_PASSWORD |
Passwort oder E-Mail-App-Passwort bei aktiver 2FA.[cite:63] |
IMAP_FOLDER |
Zu durchsuchender Ordner, meist INBOX. |
IMAP_UNSEEN_ONLY |
Wenn true, werden nur ungelesene Mails geprüft. |
IMAP_MARK_AS_READ |
Wenn true, werden verarbeitete 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 bei aktiver 2FA.[cite:63][cite:45] |
Python-Skript
Das Skript ics_mail_importer_env.py nutzt python-dotenv, imaplib, email, icalendar und caldav. python-dotenv ist speziell dafür gedacht, Werte aus einer .env-Datei zu laden und als Umgebungsvariablen verfügbar zu machen.[cite:162][cite:164]
Beispielhafter Programmstart:
cd ~/ics-importer
pipenv run python3 ics_mail_importer_env.py
Das Skript erzeugt oder nutzt dabei unter anderem diese Dateien:
ics_importer.logfür die Programmausgabeimported_uids.txtfür den Duplikat-Schutz- optional
cron.log, wenn die Cron-Ausgabe dorthin umgeleitet wird
Erster Testlauf
Vor dem Cron-Einsatz sollte das Skript immer einmal manuell gestartet werden:
pipenv run python3 ics_mail_importer_env.py
Wenn die Zugangsdaten korrekt sind, verbindet sich das Skript mit IMAP, liest passende Anhänge und importiert neue Termine in den angegebenen CalDAV-Kalender.[cite:55][cite:45]
Cron-Einrichtung
Den Python-Pfad des Pipenv-Umfelds ermitteln:
cd ~/ics-importer
pipenv --py
Stündlicher Cron-Eintrag:
0 * * * * /home/hans/.local/share/virtualenvs/ics-importer-wOz4rK-o/bin/python /home/hans/ics-importer/ics_mail_importer_env.py >> /home/hans/ics-importer/cron.log 2>&1
Die User-Crontab wird mit crontab -e gepflegt; die direkte Bearbeitung der Crontab-Dateien ist nicht empfehlenswert. Für stündliche Jobs sind sowohl 0 * * * * als auch @hourly übliche Varianten.[cite:321][cite:55]
Logrotation
Wenn cron.log mitgeschrieben wird, sollte die Datei per logrotate rotiert werden. Eine typische Konfiguration unter /etc/logrotate.d/ics-importer sieht so aus:
/home/hans/ics-importer/cron.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 0644 hans hans
}
Damit wird das Log wöchentlich rotiert, vier Versionen bleiben erhalten und ältere Logs werden komprimiert.
mailbox.org in Thunderbird
Für das eigentliche Projekt ist Thunderbird nicht zwingend nötig, aber mailbox.org empfiehlt für E-Mail in Thunderbird IMAP und für Kalender CalDAV.[cite:55][cite:45]
IMAP in Thunderbird
Thunderbird erkennt mailbox.org in der Regel automatisch; empfohlen wird IMAP statt POP3.[cite:55][cite:63]
CalDAV in Thunderbird
Kalender lassen sich in Thunderbird über Datei → Neu → Kalender → Im Netzwerk → CalDAV einbinden. Als URL dient die vollständige mailbox.org-CalDAV-Adresse des Kalenders.[cite:45][cite:51]
In manchen Setups muss in Thunderbird zusätzlich calendar.network.multirealm auf true gesetzt werden, damit die Authentifizierung sauber funktioniert.[cite:45][cite:51]
Sicherheit
.env enthält Zugangsdaten im Klartext und darf nicht in ein öffentliches Repository eingecheckt werden. python-dotenv ist für lokale Konfigurationsdateien gedacht, ersetzt aber kein Secret-Management-System.[cite:162][cite:164]
Empfehlungen:
.envnur lokal speichernchmod 600 .envsetzen.envin.gitignoreeintragen- Bei aktiver 2FA App-/Applikationspasswörter statt des Hauptpassworts verwenden.[cite:63][cite:45]
Fehlersuche
IMAP funktioniert nicht
Prüfen:
IMAP_HOST=imap.mailbox.orgIMAP_PORT=993- vollständige E-Mail-Adresse als Benutzername
- korrektes Passwort oder App-Passwort bei aktiver 2FA.[cite:56][cite:63]
CalDAV funktioniert nicht
Prüfen:
- vollständige CalDAV-URL aus den Kalendereigenschaften in mailbox.org
- korrekter Benutzername
- korrektes Passwort bzw. Applikationspasswort bei aktiver 2FA.[cite:45][cite:51]
Cron führt das Skript nicht aus
Prüfen:
- absoluter Python-Pfad aus
pipenv --py - absoluter Skriptpfad
- Schreibrechte für
cron.log - manueller Testlauf funktioniert bereits
Empfohlener Betriebsmodus
Für die meisten Setups ist IMAP_UNSEEN_ONLY=true sinnvoll, damit nur neue bzw. ungelesene Mails geprüft werden. In Verbindung mit dem Hash-basierten Duplikat-Schutz verhindert das unnötige Doppelimporte und reduziert die Last auf dem Postfach.