diff --git a/.env.example b/.env.example index 4369b77..0925be1 100644 --- a/.env.example +++ b/.env.example @@ -33,9 +33,9 @@ TZ=Europe/Berlin # Kostenlos anlegen: https://rebrickable.com/api/ (Konto -> Settings -> API) # REBRICKABLE_API_KEY= -# Optional: Mailversand fuer Erinnerungen an Wunschlisten-Termine. Ohne -# SMTP_HOST und SMTP_FROM sind Erinnerungen komplett aus - alles andere -# funktioniert unveraendert. +# Optional: Mailversand fuer Erinnerungen an Wunschlisten-Termine. Einfacher +# geht es in der App unter Mehr -> Erinnerungen -> Mailserver. Steht der +# Server hier, hat die .env Vorrang und die App zeigt ihn nur an. # SMTP_HOST=mail.example.de # SMTP_PORT=587 # SMTP_SECURE=false diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d01742..235859a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,25 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/). ## [Unreleased] +### Hinzugefügt + +- **Mailserver in der App einrichten**: Unter Mehr → Erinnerungen → Mailserver + lassen sich Server, Port, Verschlüsselung, Zugang und Absender eintragen – + ohne `.env` und ohne Neustart. Das Passwort wird verschlüsselt gespeichert + (AES-256-GCM, Schlüssel aus `BETTER_AUTH_SECRET`), nie wieder angezeigt und + nicht exportiert. Steht der Server in der `.env`, hat sie weiter Vorrang. +- **Set aus einem Link übernehmen**, für alle Hersteller: Amazon, idealo, + geizhals, Hersteller-Shops, Brickfact oder Merlins Bricks. Bricktrack liest + Produktdaten (schema.org, Open Graph, bei Amazon die Produktseite) und, wenn + die Seite blockt, den Link selbst. Lego wird über Rebrickable ergänzt, + BlueBrixx und Cobi über Merlins Bricks. Das Ergebnis füllt das Formular vor, + das Bild wird beim Speichern lokal abgelegt. + ### Geändert +- Der Zeitplan für Erinnerungen läuft immer und prüft bei jedem Durchlauf, ob + ein Mailserver eingerichtet ist. Vorher wurde er nur gestartet, wenn SMTP + schon beim Containerstart in der `.env` stand. - **Neue Navigation**: unten Start, Katalog, Sammlung, Wünsche und in der Mitte ein +-Stein mit allen Wegen zu einem neuen Set (Scannen, aus Link, Lego-Nummer, von Hand). @@ -25,15 +42,6 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/). Standorte heran, obwohl sie diese pflegen dürfen: Der Eintrag „Verwaltung" stand nur im Menü des Administrators. -### Hinzugefügt - -- **Set aus einem Link übernehmen**, für alle Hersteller: Amazon, idealo, - geizhals, Hersteller-Shops, Brickfact oder Merlins Bricks. Bricktrack liest - Produktdaten (schema.org, Open Graph, bei Amazon die Produktseite) und, wenn - die Seite blockt, den Link selbst. Lego wird über Rebrickable ergänzt, - BlueBrixx und Cobi über Merlins Bricks. Das Ergebnis füllt das Formular vor, - das Bild wird beim Speichern lokal abgelegt. - ### Sicherheit - Abrufe im Auftrag eines Nutzers gehen nur an öffentliche Adressen: Jede diff --git a/CLAUDE.md b/CLAUDE.md index 5639be8..2ea86b9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -61,6 +61,7 @@ Bild-URLs, die der Nutzer selbst hinterlegt hat. | `src/lib/prices.ts` | Wertentwicklung aus notierten Preisen (rein) | | `src/lib/reminders.ts` | Regeln, wann eine Erinnerung faellig ist (rein) | | `src/lib/reminder-job.ts`, `src/lib/mailer.ts` | Versand und Zeitplan | +| `src/lib/mail-settings.ts`, `src/lib/secret-box.ts` | SMTP aus .env oder App (`app_setting`), Passwort verschluesselt | | `src/lib/export.ts` | Export und Import des gesamten Bestands | | `src/lib/money.ts`, `src/lib/format.ts` | Cent-Umrechnung, dd.MM.yyyy | | `src/components/layout/more-items.ts` | Eintraege der Seite „Mehr" (Konto, Design, Stammdaten), auch Titel der Verwaltungsseiten | @@ -205,7 +206,7 @@ Session. 5. Session-Cookies: `httpOnly`, `secure`, `sameSite=lax`. Rate-Limiting auf den Login-Endpunkten. 6. Der Export enthaelt **keine** Konten, Passwoerter oder Passkeys - und - keine Reservierungen oder Teilen-Token. Das Backup ist `./data`, nicht der + keine Reservierungen, Teilen-Token oder `app_setting` (SMTP-Zugang). Das Backup ist `./data`, nicht der Export. 7. Der Service Worker beantwortet nur GET-Anfragen aus dem Cache und niemals `/api/auth`, `/api/export` oder den Healthcheck. Beim Abmelden wird der diff --git a/docs/ANLEITUNG.md b/docs/ANLEITUNG.md index 1fd0d59..130bb6f 100644 --- a/docs/ANLEITUNG.md +++ b/docs/ANLEITUNG.md @@ -538,25 +538,27 @@ schickt Bricktrack dir eine E-Mail – standardmäßig 14 Tage vorher, höchsten einmal pro Woche je Liste. Ist alles reserviert, bleibt es still: eine Erinnerung ohne Handlungsbedarf ist nur Lärm. -Dafür braucht es einen SMTP-Zugang in der `.env`: +Dafür braucht es einen Mailserver (SMTP). Den trägst du direkt in der App ein: +**Mehr → Erinnerungen → Mailserver**. Die Angaben – Server, Port, +Verschlüsselung, Benutzername, Passwort und Absender – findest du bei deinem +Mail-Anbieter unter „SMTP" oder „Postausgangsserver". Ein Neustart ist nicht +nötig. -```bash -SMTP_HOST=mail.example.de -SMTP_PORT=587 -SMTP_USER=bricktrack@example.de -SMTP_PASSWORD=… -SMTP_FROM=Bricktrack +Das Passwort wird verschlüsselt gespeichert und nie wieder angezeigt; zum +Ändern einfach ein neues eintragen. Es landet auch nicht im Export. -# Optional, Standard ist 14: -REMINDER_DAYS_BEFORE=14 -``` +> Wer lieber mit der `.env` arbeitet, kann den Mailserver weiterhin dort +> eintragen (`SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASSWORD`, +> `SMTP_FROM`). Dann hat die `.env` Vorrang, und die App zeigt die Werte nur +> an. Wie viele Tage vorher erinnert wird, steht in `REMINDER_DAYS_BEFORE` +> (Standard 14). -Unter **Mehr → Erinnerungen** kannst du die Verbindung prüfen, dir eine +Unter **Mehr → Erinnerungen** kannst du außerdem die Verbindung prüfen, dir eine Testnachricht schicken und die Prüfung sofort auslösen, statt auf die nächste Stunde zu warten. Dort steht auch, welche Listen einen Termin haben und wie viel dort noch offen ist. -Ohne SMTP-Zugang ist die Funktion vollständig aus – alles andere funktioniert +Ohne Mailserver ist die Funktion vollständig aus – alles andere funktioniert unverändert. --- diff --git a/docs/bilder/06-mehrfachauswahl.png b/docs/bilder/06-mehrfachauswahl.png index f4d08e1..8ab8f98 100644 Binary files a/docs/bilder/06-mehrfachauswahl.png and b/docs/bilder/06-mehrfachauswahl.png differ diff --git a/docs/bilder/07-wunschliste-dialog.png b/docs/bilder/07-wunschliste-dialog.png index 313ff7c..f64b467 100644 Binary files a/docs/bilder/07-wunschliste-dialog.png and b/docs/bilder/07-wunschliste-dialog.png differ diff --git a/docs/bilder/11-wunschliste-bearbeiten.png b/docs/bilder/11-wunschliste-bearbeiten.png index 0bafbd5..1ebb055 100644 Binary files a/docs/bilder/11-wunschliste-bearbeiten.png and b/docs/bilder/11-wunschliste-bearbeiten.png differ diff --git a/docs/bilder/13-reservieren.png b/docs/bilder/13-reservieren.png index ec62c46..26043cc 100644 Binary files a/docs/bilder/13-reservieren.png and b/docs/bilder/13-reservieren.png differ diff --git a/docs/bilder/15-wunschliste-reserviert.png b/docs/bilder/15-wunschliste-reserviert.png index 87e77bc..383ef49 100644 Binary files a/docs/bilder/15-wunschliste-reserviert.png and b/docs/bilder/15-wunschliste-reserviert.png differ diff --git a/docs/bilder/18-fehlteile.png b/docs/bilder/18-fehlteile.png index e99d02c..4846644 100644 Binary files a/docs/bilder/18-fehlteile.png and b/docs/bilder/18-fehlteile.png differ diff --git a/docs/bilder/19-einladungen.png b/docs/bilder/19-einladungen.png index 7bf49d1..176ae83 100644 Binary files a/docs/bilder/19-einladungen.png and b/docs/bilder/19-einladungen.png differ diff --git a/docs/bilder/24-erinnerungen.png b/docs/bilder/24-erinnerungen.png index efbde46..6fd3d3d 100644 Binary files a/docs/bilder/24-erinnerungen.png and b/docs/bilder/24-erinnerungen.png differ