179 lines
5.4 KiB
Markdown
179 lines
5.4 KiB
Markdown
# IMAP Mail Filter Service
|
|
|
|
Ein Docker-basierter Service, der E-Mail-Filterregeln unabhängig vom Mail-Client ausführt. Egal ob du Evolution, Thunderbird oder einen anderen Client nutzt — die Filter laufen einfach weiter.
|
|
|
|
## Features
|
|
|
|
- **Mehrere IMAP-Konten** verwalten
|
|
- **Filterregeln** mit flexiblen Bedingungen (Von, An, Betreff, Text)
|
|
- **Matching**: enthält, exakt, Regex — jeweils mit Negierung
|
|
- **Aktionen**: Verschieben, Weiterleiten, Löschen, Als gelesen markieren
|
|
- **Web-UI** zur Verwaltung von Konten und Regeln
|
|
- **YAML Import/Export** für portable Konfiguration
|
|
- **Passwort-Verschlüsselung** mit Fernet
|
|
- **Konfigurierbares Polling-Intervall** pro Konto
|
|
|
|
## Schnellstart
|
|
|
|
### 1. `.env` erstellen
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
```
|
|
|
|
Encryption-Key generieren und in die `.env` eintragen:
|
|
|
|
```bash
|
|
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
```
|
|
|
|
Falls `cryptography` noch nicht installiert ist:
|
|
|
|
```bash
|
|
pip install cryptography
|
|
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
|
```
|
|
|
|
Den ausgegebenen Key in die `.env` eintragen:
|
|
|
|
```
|
|
ENCRYPTION_KEY=dein-generierter-key-hier
|
|
```
|
|
|
|
### 2. Mit Docker starten
|
|
|
|
```bash
|
|
docker-compose up --build
|
|
```
|
|
|
|
Der Service ist dann unter **http://localhost:8080** erreichbar.
|
|
|
|
### 3. Ohne Docker (lokal)
|
|
|
|
```bash
|
|
python3 -m venv .venv
|
|
source .venv/bin/activate
|
|
pip install -r requirements.txt
|
|
uvicorn app.main:app --reload
|
|
```
|
|
|
|
Erreichbar unter **http://localhost:8000**.
|
|
|
|
## Benutzung
|
|
|
|
### Web-UI
|
|
|
|
- **Dashboard** (`/`) — Übersicht aller Konten mit Status und Quick-Actions
|
|
- **Konten** (`/accounts`) — IMAP-Konten anlegen, bearbeiten, Verbindungstest
|
|
- **Filter** (`/filters`) — Filterregeln pro Konto erstellen und verwalten
|
|
- **YAML** (`/yaml`) — Konfiguration exportieren und importieren
|
|
|
|
### REST-API
|
|
|
|
| Endpunkt | Beschreibung |
|
|
|---|---|
|
|
| `GET /api/accounts/` | Alle Konten auflisten |
|
|
| `POST /api/accounts/` | Neues Konto anlegen |
|
|
| `PUT /api/accounts/{id}` | Konto bearbeiten |
|
|
| `DELETE /api/accounts/{id}` | Konto löschen |
|
|
| `POST /api/accounts/{id}/test` | IMAP-Verbindungstest |
|
|
| `POST /api/accounts/{id}/poll-now` | Sofort nach neuen Mails prüfen |
|
|
| `GET /api/filters/account/{id}` | Filterregeln eines Kontos |
|
|
| `POST /api/filters/` | Neue Filterregel |
|
|
| `PUT /api/filters/{id}` | Filterregel bearbeiten |
|
|
| `DELETE /api/filters/{id}` | Filterregel löschen |
|
|
| `GET /api/yaml/export` | Konfiguration als YAML |
|
|
| `POST /api/yaml/import` | YAML-Datei importieren |
|
|
|
|
### YAML-Konfiguration
|
|
|
|
Filterregeln können auch direkt als YAML definiert werden. Passwörter lassen sich als Umgebungsvariablen referenzieren:
|
|
|
|
```yaml
|
|
accounts:
|
|
- name: "Arbeit"
|
|
imap_host: "imap.example.com"
|
|
imap_port: 993
|
|
use_ssl: true
|
|
username: "user@example.com"
|
|
password: "${WORK_IMAP_PW}"
|
|
poll_interval_seconds: 120
|
|
filters:
|
|
- name: "Newsletter sortieren"
|
|
priority: 10
|
|
source_folder: "INBOX"
|
|
stop_processing: true
|
|
conditions:
|
|
- field: "from"
|
|
match_type: "contains"
|
|
value: "newsletter@"
|
|
actions:
|
|
- action_type: "move"
|
|
parameter: "Newsletter"
|
|
```
|
|
|
|
Beim Start wird `config/filters.yaml` automatisch importiert (konfigurierbar via `YAML_SYNC_ON_STARTUP`).
|
|
|
|
## Umgebungsvariablen
|
|
|
|
| Variable | Standard | Beschreibung |
|
|
|---|---|---|
|
|
| `ENCRYPTION_KEY` | *(leer)* | Fernet-Key für Passwort-Verschlüsselung |
|
|
| `LOG_LEVEL` | `INFO` | Log-Level (DEBUG, INFO, WARNING, ERROR) |
|
|
| `YAML_SYNC_ON_STARTUP` | `true` | YAML-Datei beim Start importieren |
|
|
| `DATABASE_URL` | `sqlite:///data/mailfilter.db` | Datenbank-Pfad |
|
|
|
|
## Datenbank-Migrationen
|
|
|
|
Die Datenbank wird automatisch beim Start per **Alembic** migriert — Konten und Filterregeln bleiben bei Updates erhalten.
|
|
|
|
Falls du lokal entwickelst und das Schema änderst:
|
|
|
|
```bash
|
|
# Neue Migration erstellen (nach Änderung an db_models.py)
|
|
.venv/bin/alembic revision --autogenerate -m "beschreibung der änderung"
|
|
|
|
# Migration anwenden
|
|
.venv/bin/alembic upgrade head
|
|
|
|
# Migrationsstatus prüfen
|
|
.venv/bin/alembic current
|
|
```
|
|
|
|
Im Docker passiert das automatisch beim Container-Start.
|
|
|
|
## Projektstruktur
|
|
|
|
```
|
|
├── app/
|
|
│ ├── main.py # FastAPI App + Web-Routen
|
|
│ ├── config.py # Konfiguration via Umgebungsvariablen
|
|
│ ├── database.py # SQLAlchemy Setup
|
|
│ ├── models/db_models.py # Datenbank-Modelle
|
|
│ ├── schemas/schemas.py # API Request/Response Schemas
|
|
│ ├── routers/ # REST-API Endpunkte
|
|
│ ├── services/
|
|
│ │ ├── imap_client.py # IMAP-Verbindung und Mail-Aktionen
|
|
│ │ ├── filter_engine.py # Regelauswertung
|
|
│ │ ├── scheduler.py # Polling-Scheduler
|
|
│ │ ├── yaml_service.py # YAML Import/Export
|
|
│ │ └── encryption.py # Passwort-Verschlüsselung
|
|
│ ├── templates/ # Jinja2 HTML-Templates
|
|
│ └── static/ # CSS + JS
|
|
├── alembic/ # Datenbank-Migrationen
|
|
│ ├── env.py
|
|
│ └── versions/ # Migrations-Skripte
|
|
├── config/filters.yaml # YAML-Filterkonfiguration
|
|
├── data/ # SQLite-Datenbank (Docker Volume)
|
|
├── docker-compose.yml
|
|
├── Dockerfile
|
|
└── requirements.txt
|
|
```
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
source .venv/bin/activate
|
|
python -m pytest tests/ -v
|
|
```
|