docs: mailserver in der app in anleitung und changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@@ -33,9 +33,9 @@ TZ=Europe/Berlin
|
|||||||
# Kostenlos anlegen: https://rebrickable.com/api/ (Konto -> Settings -> API)
|
# Kostenlos anlegen: https://rebrickable.com/api/ (Konto -> Settings -> API)
|
||||||
# REBRICKABLE_API_KEY=
|
# REBRICKABLE_API_KEY=
|
||||||
|
|
||||||
# Optional: Mailversand fuer Erinnerungen an Wunschlisten-Termine. Ohne
|
# Optional: Mailversand fuer Erinnerungen an Wunschlisten-Termine. Einfacher
|
||||||
# SMTP_HOST und SMTP_FROM sind Erinnerungen komplett aus - alles andere
|
# geht es in der App unter Mehr -> Erinnerungen -> Mailserver. Steht der
|
||||||
# funktioniert unveraendert.
|
# Server hier, hat die .env Vorrang und die App zeigt ihn nur an.
|
||||||
# SMTP_HOST=mail.example.de
|
# SMTP_HOST=mail.example.de
|
||||||
# SMTP_PORT=587
|
# SMTP_PORT=587
|
||||||
# SMTP_SECURE=false
|
# SMTP_SECURE=false
|
||||||
|
|||||||
@@ -7,8 +7,25 @@ die Versionierung [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
|
|
||||||
## [Unreleased]
|
## [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
|
### 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
|
- **Neue Navigation**: unten Start, Katalog, Sammlung, Wünsche und in der
|
||||||
Mitte ein +-Stein mit allen Wegen zu einem neuen Set (Scannen, aus Link,
|
Mitte ein +-Stein mit allen Wegen zu einem neuen Set (Scannen, aus Link,
|
||||||
Lego-Nummer, von Hand).
|
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
|
Standorte heran, obwohl sie diese pflegen dürfen: Der Eintrag
|
||||||
„Verwaltung" stand nur im Menü des Administrators.
|
„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
|
### Sicherheit
|
||||||
|
|
||||||
- Abrufe im Auftrag eines Nutzers gehen nur an öffentliche Adressen: Jede
|
- Abrufe im Auftrag eines Nutzers gehen nur an öffentliche Adressen: Jede
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ Bild-URLs, die der Nutzer selbst hinterlegt hat.
|
|||||||
| `src/lib/prices.ts` | Wertentwicklung aus notierten Preisen (rein) |
|
| `src/lib/prices.ts` | Wertentwicklung aus notierten Preisen (rein) |
|
||||||
| `src/lib/reminders.ts` | Regeln, wann eine Erinnerung faellig ist (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/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/export.ts` | Export und Import des gesamten Bestands |
|
||||||
| `src/lib/money.ts`, `src/lib/format.ts` | Cent-Umrechnung, dd.MM.yyyy |
|
| `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 |
|
| `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`.
|
5. Session-Cookies: `httpOnly`, `secure`, `sameSite=lax`.
|
||||||
Rate-Limiting auf den Login-Endpunkten.
|
Rate-Limiting auf den Login-Endpunkten.
|
||||||
6. Der Export enthaelt **keine** Konten, Passwoerter oder Passkeys - und
|
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.
|
Export.
|
||||||
7. Der Service Worker beantwortet nur GET-Anfragen aus dem Cache und niemals
|
7. Der Service Worker beantwortet nur GET-Anfragen aus dem Cache und niemals
|
||||||
`/api/auth`, `/api/export` oder den Healthcheck. Beim Abmelden wird der
|
`/api/auth`, `/api/export` oder den Healthcheck. Beim Abmelden wird der
|
||||||
|
|||||||
@@ -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
|
einmal pro Woche je Liste. Ist alles reserviert, bleibt es still: eine
|
||||||
Erinnerung ohne Handlungsbedarf ist nur Lärm.
|
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
|
Das Passwort wird verschlüsselt gespeichert und nie wieder angezeigt; zum
|
||||||
SMTP_HOST=mail.example.de
|
Ändern einfach ein neues eintragen. Es landet auch nicht im Export.
|
||||||
SMTP_PORT=587
|
|
||||||
SMTP_USER=bricktrack@example.de
|
|
||||||
SMTP_PASSWORD=…
|
|
||||||
SMTP_FROM=Bricktrack <bricktrack@example.de>
|
|
||||||
|
|
||||||
# Optional, Standard ist 14:
|
> Wer lieber mit der `.env` arbeitet, kann den Mailserver weiterhin dort
|
||||||
REMINDER_DAYS_BEFORE=14
|
> 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
|
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
|
Stunde zu warten. Dort steht auch, welche Listen einen Termin haben und wie
|
||||||
viel dort noch offen ist.
|
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.
|
unverändert.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 560 KiB After Width: | Height: | Size: 490 KiB |
|
Before Width: | Height: | Size: 497 KiB After Width: | Height: | Size: 497 KiB |
|
Before Width: | Height: | Size: 491 KiB After Width: | Height: | Size: 426 KiB |
|
Before Width: | Height: | Size: 498 KiB After Width: | Height: | Size: 498 KiB |
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 259 KiB |
|
Before Width: | Height: | Size: 234 KiB After Width: | Height: | Size: 345 KiB |