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:
- Das Skript verbindet sich per IMAP mit mailbox.org und durchsucht einen Ordner, standardmäßig
INBOX.[cite:55][cite:338] - Nachrichten werden mit
BODY.PEEK[]gelesen, damit sie beim Abruf nicht automatisch als gelesen markiert werden.[cite:338][cite:350] .ics-Anhänge werden erkannt, per Hash gegen Doppelverarbeitung abgesichert und anschließend per CalDAV importiert.[cite:45][cite:162]- 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 STOREmit\\Seenmarkiert, sofernIMAP_MARK_AS_READ=truegesetzt 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-dotenvfür.envimaplibfür IMAPemailzum Parsen von Nachrichten und Anhängenicalendarzum Parsen von ICS-Dateiencaldavfü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:
.envnur lokal speichernchmod 600 .envsetzen.envin.gitignoreeintragen- bei aktiver 2FA App-/Applikationspasswörter verwenden.[cite:45][cite:55]
Fehlersuche
IMAP funktioniert nicht
Prüfen:
IMAP_HOST=imap.mailbox.orgIMAP_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=trueIMAP_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.