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
@@ -6,6 +6,7 @@ import {
Images,
BellRing,
MessageSquare,
Mailbox,
CalendarDays,
FileSignature,
ScrollText,
@@ -162,6 +163,21 @@ export const FeaturesTab: React.FC = () => {
onToggle={(next) => setFlag('reminderEmails', next)}
/>
<FeatureCard
icon={Mailbox}
title={t('settings.features.incomingMail.title', 'Incoming mail')}
description={t(
'settings.features.incomingMail.description',
'Poll a dedicated mailbox (IMAP) every minute and drop invoice attachments into Accounting → Incoming invoices. Configure the mailbox under Settings → Email.',
)}
status="new"
statusLabel={statusLabel('new')}
sidebarHidden
sidebarHiddenLabel={sidebarHiddenLabel}
enabled={staged.incomingMail}
onToggle={(next) => setFlag('incomingMail', next)}
/>
<FeatureCard
icon={MessageSquare}
title={t('settings.features.messaging.title', 'Messaging')}