d360c9a5ba
- Systemauslastungs-Sektion wird immer gerendert (nicht nur bei Erfolg) - Fehlermeldung wenn /api/admin/system/stats nicht erreichbar ist - Feature-Status auf In Review gesetzt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
148 lines
5.4 KiB
Markdown
148 lines
5.4 KiB
Markdown
# PROJ-14: E-Mail-Import: POP3-Verbindung
|
||
|
||
## Status: In Progress
|
||
**Created:** 2026-03-13
|
||
**Last Updated:** 2026-03-13
|
||
|
||
## Dependencies
|
||
- Requires: PROJ-1 (Authentifizierung) – nur Admins verwalten POP3-Verbindungen
|
||
- Requires: PROJ-5 (Speicherung & Indexierung) – importierte E-Mails werden gespeichert
|
||
|
||
## Hinweis
|
||
POP3 kennt keine Ordnerstruktur – es gibt nur eine Inbox. Alle Mails werden importiert. Da POP3 keine UID-basierte Synchronisation unterstützt, ist nur ein einmaliger Initial-Import sinnvoll (kein regelmäßiger Sync wie bei IMAP).
|
||
|
||
## User Stories
|
||
- Als Admin möchte ich einen POP3-Server konfigurieren (Host, Port, Zugangsdaten), damit ich E-Mails von dort importieren kann.
|
||
- Als System möchte ich alle vorhandenen E-Mails vom POP3-Server herunterladen und archivieren.
|
||
- Als Admin möchte ich den Verbindungsstatus und Importfortschritt sehen.
|
||
- Als System möchte ich Duplikate (gleiche Message-ID) überspringen.
|
||
|
||
## Acceptance Criteria
|
||
- [ ] Konfigurationsformular: Host, Port, Verbindungsmodus (SSL/TLS, STARTTLS, None), Benutzername, Passwort
|
||
- [ ] **Verbindungsmodi:**
|
||
- `SSL/TLS` – direkte TLS-Verbindung (Port 995)
|
||
- `STARTTLS` – startet unverschlüsselt, wird auf TLS hochgestuft (Port 110)
|
||
- `None` – unverschlüsselt, nur für lokale/Testumgebungen
|
||
- [ ] Verbindungstest vor dem Speichern (Timeout: 10 Sekunden)
|
||
- [ ] Passwörter AES-256-GCM verschlüsselt in der DB gespeichert
|
||
- [ ] Import: alle Mails vom Server herunterladen
|
||
- [ ] Duplikate (Message-ID) werden übersprungen
|
||
- [ ] Fortschrittsanzeige während Import (X von Y Mails)
|
||
- [ ] Abschlussbericht: importiert / übersprungen / Fehler
|
||
- [ ] Mails bleiben nach dem Import auf dem POP3-Server (kein DELE-Befehl)
|
||
|
||
## Edge Cases
|
||
- POP3-Server nicht erreichbar → Fehlermeldung mit Retry-Option
|
||
- Falsche Zugangsdaten → klare Fehlermeldung
|
||
- Mail ohne Message-ID → synthetische ID generieren (SHA-256 des Inhalts)
|
||
- Verbindungsabbruch während Import → bei Neustart von vorne (POP3 hat keine UIDs zum Weiterführen)
|
||
- Sehr großes Postfach (10.000+ Mails) → sequenzielles Herunterladen, kein Speicher-Overflow
|
||
|
||
## Technical Requirements
|
||
- **Verbindungsmodi:** SSL/TLS (Port 995), STARTTLS (Port 110), None
|
||
- POP3 unterstützt keine Ordner – es gibt nur die Inbox, keine Ordner-Erkennung nötig
|
||
- Kein regelmäßiger Sync – nur manueller Import (POP3 bietet keine zuverlässige Duplikatserkennung über Sessions hinaus)
|
||
- Zugangsdaten AES-256-GCM verschlüsselt in der DB
|
||
|
||
---
|
||
## Tech Design (Solution Architect)
|
||
|
||
### Komponentenstruktur
|
||
|
||
**Next.js Frontend (Admin-Bereich):**
|
||
```
|
||
/admin/pop3
|
||
├── POP3-Verbindungsliste
|
||
│ └── VerbindungsCard
|
||
│ ├── Name, Host, Status
|
||
│ ├── Letzter Import + Anzahl
|
||
│ └── Aktionen: Bearbeiten / Löschen / Import starten
|
||
├── Verbindung-Formular
|
||
│ ├── Host, Port, Verbindungsmodus (SSL/TLS | STARTTLS | None)
|
||
│ ├── Benutzername, Passwort
|
||
│ └── [Verbindung testen] Button
|
||
└── Import-Fortschrittsanzeige
|
||
├── Fortschrittsbalken
|
||
└── Abschlussbericht
|
||
```
|
||
|
||
**Go Backend:**
|
||
```
|
||
POP3-Dienst
|
||
├── POST /api/admin/pop3 ← Verbindung anlegen
|
||
├── POST /api/admin/pop3/test ← Verbindung testen
|
||
├── GET /api/admin/pop3 ← auflisten
|
||
├── DELETE /api/admin/pop3/{id} ← löschen
|
||
│
|
||
├── POP3-Client
|
||
│ ├── SSL/TLS + STARTTLS Handler
|
||
│ ├── USER/PASS Login
|
||
│ ├── STAT → Anzahl Mails + Gesamtgröße
|
||
│ ├── LIST → Message-Nummern
|
||
│ └── RETR → Mail herunterladen (kein DELE)
|
||
│
|
||
└── Import-Worker (Hintergrund-Goroutine)
|
||
├── Sequenziell: RETR 1, RETR 2, ...
|
||
├── Duplikat-Check (Message-ID)
|
||
├── → Storage Coordinator (PROJ-5)
|
||
└── Fortschritt in DB
|
||
```
|
||
|
||
### Verbindungsmodus-Übersicht
|
||
|
||
| Modus | Port | Ablauf |
|
||
|-------|------|--------|
|
||
| `SSL/TLS` | 995 | TLS direkt beim Verbindungsaufbau |
|
||
| `STARTTLS` | 110 | Verbindung startet plain → STLS-Befehl → TLS |
|
||
| `None` | 110 | Unverschlüsselt (nur Testumgebung) |
|
||
|
||
### Importfluss
|
||
|
||
```
|
||
Admin klickt "Import starten"
|
||
│
|
||
▼
|
||
POP3-Client verbindet (SSL/TLS oder STARTTLS)
|
||
│
|
||
▼
|
||
STAT → Gesamtanzahl Mails (z.B. 3.842)
|
||
│
|
||
▼
|
||
LIST → Message-Nummern [1, 2, 3, ..., 3842]
|
||
│
|
||
▼
|
||
Für jede Message-Nummer:
|
||
RETR <n> → rohe Mail (RFC 2822)
|
||
Message-ID Duplikat? → überspringen
|
||
→ Storage Coordinator (PROJ-5)
|
||
Fortschritt: n / 3842
|
||
│
|
||
▼
|
||
Kein DELE → Mails bleiben auf dem Server
|
||
│
|
||
▼
|
||
QUIT → Verbindung trennen
|
||
Abschlussbericht speichern
|
||
```
|
||
|
||
### Technische Entscheidungen
|
||
|
||
| Entscheidung | Begründung |
|
||
|---|---|
|
||
| **Kein DELE** | Archiv löscht nichts vom Quellserver – nur lesen und archivieren |
|
||
| **Kein regelmäßiger Sync** | POP3 hat keine UIDs – es gibt keine zuverlässige Möglichkeit festzustellen welche Mails bereits importiert wurden |
|
||
| **Synthetische Message-ID bei Fehlen** | POP3-Mails ohne Message-ID bekommen SHA-256(Inhalt) als ID – Duplikatserkennung bleibt konsistent |
|
||
| **Gleiche Codebasis wie IMAP-Worker** | Import-Worker-Struktur identisch – nur POP3-Client statt IMAP-Client |
|
||
|
||
### Abhängigkeiten
|
||
|
||
| Paket | Zweck |
|
||
|---|---|
|
||
| `github.com/emersion/go-message` | POP3-Client mit TLS/STARTTLS |
|
||
|
||
## QA Test Results
|
||
_To be added by /qa_
|
||
|
||
## Deployment
|
||
_To be added by /deploy_
|