feat(email): incoming mail UI - IMAP config block + Received emails tab

Frontend for the incoming-mail feature.

- Settings -> Email: an "Incoming mail (IMAP)" block under the outgoing SMTP
  settings (same field shape: host/port/security/user/pass/folder), shown only
  when the incomingMail flag is on (IncomingMailConfigCard, self-contained
  load/save).
- A "Received emails" tab next to "Sent emails" (ReceivedEmailsPanel) listing
  the received_emails log with from/subject/received/status + attachment count
  and a link to the incoming-invoices inbox.
- `incomingMail` flag in the frontend (type + context default, standalone) +
  a Communication-section Features card.
- email.service: getIncomingConfig / updateIncomingConfig / listReceived.
- i18n: settings.features.incomingMail, email.incoming, email.received (EN+DE).

Verified: tsc --noEmit clean (0 errors); en/de JSON valid; npm run build green.
This commit is contained in:
Luca
2026-06-11 16:19:55 +02:00
parent 5645c304ab
commit 31280e1f7a
9 changed files with 287 additions and 1 deletions
+32
View File
@@ -1603,6 +1603,10 @@
"description": "Der Kern von PicPeak. Immer verfügbar.",
"locked": "Galerien sind die Grundlage von PicPeak und können nicht deaktiviert werden."
},
"incomingMail": {
"title": "Eingehende E-Mails",
"description": "Ruft ein dediziertes Postfach (IMAP) jede Minute ab und legt Rechnungsanhänge in Buchhaltung → Eingangsrechnungen ab. Postfach unter Einstellungen → E-Mail konfigurieren."
},
"reminderEmails": {
"title": "Erinnerungs-E-Mails",
"description": "Automatische Vor-Event-Erinnerung an Kunden N Tage vor dem Eventdatum. Vorlagen pro Kategorie (Konzert, Firma, Hochzeit, …) unter Einstellungen → Erinnerungsvorlagen; Übersteuerung pro Event auf der Event-Detailseite."
@@ -2471,6 +2475,34 @@
"success": "Warteschlange geleert {{sent}} gesendet, {{failed}} fehlgeschlagen",
"empty": "Keine ausstehenden E-Mails zum Senden"
},
"incoming": {
"title": "Eingehende E-Mails (IMAP)",
"subtitle": "Ein dediziertes Postfach, jede Minute abgerufen; Anhänge landen in Buchhaltung → Eingangsrechnungen.",
"host": "IMAP-Host",
"port": "Port",
"security": "Sicherheit",
"ssl": "SSL/TLS (993)",
"plain": "Keine / STARTTLS (143)",
"user": "Benutzername",
"pass": "Passwort",
"folder": "Ordner",
"savedToast": "Einstellungen für eingehende E-Mails gespeichert."
},
"received": {
"tab": "Empfangene E-Mails",
"from": "Von",
"subject": "Betreff",
"received": "Empfangen",
"status": "Status",
"empty": "Noch keine empfangenen E-Mails. Eingehende E-Mails aktivieren und Postfach konfigurieren.",
"inbox": "Eingang",
"statusValue": {
"ingested": "Erfasst",
"no_attachment": "Kein Anhang",
"duplicate": "Duplikat",
"error": "Fehler"
}
},
"sentEmails": {
"tab": "Gesendete E-Mails",
"title": "Gesendete E-Mails",
+32
View File
@@ -1161,6 +1161,10 @@
"description": "The core PicPeak surface. Always available.",
"locked": "Galleries are the foundation of PicPeak and can't be turned off."
},
"incomingMail": {
"title": "Incoming mail",
"description": "Poll a dedicated mailbox (IMAP) every minute and drop invoice attachments into Accounting → Incoming invoices. Configure the mailbox under Settings → Email."
},
"reminderEmails": {
"title": "Reminder Emails",
"description": "Automatic pre-event nudge to customers N days before their event date. Per-category templates (concert, corporate, wedding, …) editable in Settings → Reminder templates; per-event override on the event detail page."
@@ -2044,6 +2048,34 @@
"success": "Email queue flushed — {{sent}} sent, {{failed}} failed",
"empty": "No pending emails to send"
},
"incoming": {
"title": "Incoming mail (IMAP)",
"subtitle": "A dedicated mailbox polled every minute; attachments land in Accounting → Incoming invoices.",
"host": "IMAP host",
"port": "Port",
"security": "Security",
"ssl": "SSL/TLS (993)",
"plain": "None / STARTTLS (143)",
"user": "Username",
"pass": "Password",
"folder": "Folder",
"savedToast": "Incoming mail settings saved."
},
"received": {
"tab": "Received emails",
"from": "From",
"subject": "Subject",
"received": "Received",
"status": "Status",
"empty": "No received emails yet. Enable incoming mail and configure the mailbox.",
"inbox": "inbox",
"statusValue": {
"ingested": "Ingested",
"no_attachment": "No attachment",
"duplicate": "Duplicate",
"error": "Error"
}
},
"sentEmails": {
"tab": "Sent emails",
"title": "Sent emails",