Files
ics_mailimporter/README.md
T

231 lines
7.7 KiB
Markdown
Raw Normal View History

2026-05-31 09:16:04 +02:00
# ICS-Importer für mailbox.org unter Linux
2026-05-12 12:31:18 +02:00
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]
2026-05-31 09:16:04 +02:00
## Überblick
Der Importer ist für ein einfaches, robustes Linux-Setup gedacht:
2026-05-31 09:16:04 +02:00
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]
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Projektstruktur
2026-05-12 12:31:18 +02:00
```text
ics-importer/
├── ics_mail_importer_env_v2.py
2026-05-31 09:16:04 +02:00
├── .env.example
├── .env
2026-05-12 12:31:18 +02:00
├── imported_uids.txt
├── ics_importer.log
2026-05-31 09:16:04 +02:00
├── cron.log
└── README.md
2026-05-12 12:31:18 +02:00
```
## Voraussetzungen
2026-05-12 12:31:18 +02:00
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
2026-05-12 12:31:18 +02:00
```bash
2026-05-31 09:16:04 +02:00
mkdir -p ~/ics-importer
2026-05-12 12:31:18 +02:00
cd ~/ics-importer
2026-05-31 09:16:04 +02:00
pipenv install python-dotenv caldav icalendar
2026-05-12 12:31:18 +02:00
```
`python-dotenv` liest Schlüssel-Wert-Paare aus einer `.env`-Datei und stellt sie dem Skript als Umgebungsvariablen bereit.[cite:162][cite:164]
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Konfiguration mit `.env`
2026-05-12 12:31:18 +02:00
Beispiel für `.env.example`:
2026-05-31 09:16:04 +02:00
```dotenv
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
2026-05-31 09:16:04 +02:00
CALDAV_URL=https://dav.mailbox.org/caldav/IHR_KALENDER_ID
CALDAV_USERNAME=ihr-name@mailbox.org
CALDAV_PASSWORD=IHR_PASSWORT_ODER_APP_PASSWORT
2026-05-12 12:31:18 +02:00
```
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]
2026-05-12 12:31:18 +02:00
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]
2026-05-12 12:31:18 +02:00
Datei anlegen und schützen:
2026-05-12 12:31:18 +02:00
```bash
2026-05-31 09:16:04 +02:00
cp .env.example .env
chmod 600 .env
nano .env
2026-05-12 12:31:18 +02:00
```
2026-05-31 09:16:04 +02:00
## Bedeutung der Variablen
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
| Variable | Bedeutung |
|---|---|
| `IMAP_HOST` | mailbox.org IMAP-Server, normalerweise `imap.mailbox.org`.[cite:55] |
| `IMAP_PORT` | IMAP über SSL/TLS, normalerweise `993`.[cite:55] |
2026-05-31 09:16:04 +02:00
| `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. |
2026-05-31 09:16:04 +02:00
| `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]
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Python-Skript
2026-05-12 12:31:18 +02:00
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]
2026-05-12 12:31:18 +02:00
Beispielstart:
2026-05-12 12:31:18 +02:00
```bash
cd ~/ics-importer
pipenv run python3 ics_mail_importer_env_v2.py
2026-05-12 12:31:18 +02:00
```
2026-05-31 09:16:04 +02:00
## Erster Testlauf
2026-05-12 12:31:18 +02:00
Vor dem Einsatz mit Cron sollte das Skript immer einmal manuell getestet werden:
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
```bash
pipenv run python3 ics_mail_importer_env_v2.py
2026-05-12 12:31:18 +02:00
```
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
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Cron-Einrichtung
2026-05-12 12:31:18 +02:00
Interpreter-Pfad aus `pipenv` ermitteln:
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
```bash
cd ~/ics-importer
pipenv --py
2026-05-12 12:31:18 +02:00
```
Beispiel für stündliche Ausführung:
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
```cron
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
2026-05-31 09:16:04 +02:00
```
2026-05-12 12:31:18 +02:00
Die User-Crontab wird mit `crontab -e` gepflegt. Für stündliche Jobs sind `0 * * * *` oder `@hourly` die üblichen Varianten.
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Logrotation
2026-05-12 12:31:18 +02:00
Wenn `cron.log` verwendet wird, sollte die Datei per `logrotate` rotiert werden. Beispiel für `/etc/logrotate.d/ics-importer`:
2026-05-12 12:31:18 +02:00
```conf
/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.
2026-05-12 12:31:18 +02:00
## Thunderbird und mailbox.org
2026-05-12 12:31:18 +02:00
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]
2026-05-31 09:16:04 +02:00
### IMAP in Thunderbird
Thunderbird erkennt mailbox.org häufig automatisch; IMAP ist der empfohlene Modus.[cite:55]
2026-05-31 09:16:04 +02:00
### CalDAV in Thunderbird
2026-05-12 12:31:18 +02:00
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]
2026-05-12 12:31:18 +02:00
Falls erforderlich, kann in Thunderbird zusätzlich `calendar.network.multirealm=true` gesetzt werden, um Authentifizierungsprobleme zu vermeiden.[cite:45][cite:64]
2026-05-12 12:31:18 +02:00
2026-05-31 09:16:04 +02:00
## Sicherheit
2026-05-12 12:31:18 +02:00
`.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]
2026-05-31 09:16:04 +02:00
Empfehlungen:
- `.env` nur lokal speichern
- `chmod 600 .env` setzen
- `.env` in `.gitignore` eintragen
- bei aktiver 2FA App-/Applikationspasswörter verwenden.[cite:45][cite:55]
2026-05-12 12:31:18 +02:00
## Fehlersuche
2026-05-31 09:16:04 +02:00
### 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]
2026-05-31 09:16:04 +02:00
### 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]
2026-05-31 09:16:04 +02:00
### Mail wird zu früh als gelesen markiert
2026-05-31 09:16:04 +02:00
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]
2026-05-12 12:31:18 +02:00
## 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.