Files
archivmail/features/PROJ-89-adressfelder-from-to-cc-bcc-anzeigen.md
2026-10-22 00:56:11 +02:00

6.6 KiB

PROJ-89: From/To/CC/BCC vollständig auslesen und im Portal darstellen

Status: In Review

Created: 2026-10-22 Last Updated: 2026-10-22

Dependencies

  • Requires: PROJ-50 (cc_addr/bcc_addr im Index)
  • Berührt: PROJ-54/PROJ-88 (Sichtbarkeit Rolle user, mailBelongsToUser, AnyAddress), PROJ-87 (Zusatzadressen, BCC-Konsistenz)

Hintergrund

Der Parser liest From, To, CC und Zustelladressen, aber nicht den Bcc-Header. bcc_addr im Index bleibt deshalb leer. Die Detailansicht zeigt From, To und CC (CC nur wenn vorhanden), die Trefferliste zeigt From und To. Wer eine Mail als BCC, über Verteiler oder Weiterleitung erhalten hat, sieht in der Oberfläche nicht, an wen sie noch ging.

Entscheidungen (mit Nutzer geklärt, 2026-10-22)

  • Anzeige in Detailansicht UND Trefferliste.
  • BCC bestimmt auch die Sichtbarkeit für Rolle user: bcc_addr wird befüllt, mailBelongsToUser prüft BCC mit, Index-Filter und Detailprüfung bleiben gleich streng.

User Stories

  • Als User möchte ich in der Detailansicht Absender, alle Empfänger (To), CC und BCC sehen, um nachzuvollziehen, an wen die Mail ging.
  • Als User möchte ich in der Trefferliste neben Absender und To auch CC und BCC erkennen, damit ich Mails über einen Verteiler oder eine Weiterleitung zuordnen kann.
  • Als User möchte ich Mails sehen und öffnen, in denen meine Adresse nur im BCC der archivierten Kopie steht.
  • Als Compliance-Verantwortlicher möchte ich, dass Liste und Detailzugriff dieselbe Regel nutzen, auch für BCC.

Acceptance Criteria

  • Parser liest den Bcc-Header (net/mail, lowercase, dedupliziert, unparsbar → keine Adresse, fail-closed) und liefert ParsedMail.BCC.
  • Alle Stellen, die MailDocument bauen, befüllen BCC (IMAP, POP3, Upload, SMTP, Import-CLIs, Reindex, index-pending, fix-subjects).
  • mailBelongsToUser prüft zusätzlich BCC mit exaktem Vergleich; alle Aufrufer (Detail, Anhänge, Threads, OCR, Export, eDiscovery, IMAP-Rückholung) profitieren. Test: Liste und Detail liefern für BCC-only-Mails dasselbe Ergebnis.
  • API Mail-Detail liefert from, to, cc, bcc als vollständige Listen; Trefferliste liefert zusätzlich cc und bcc je Treffer.
  • Detailansicht zeigt From, To, CC, BCC; leere Felder werden ausgeblendet; lange Listen umbrechen oder sind einklappbar.
  • Trefferliste zeigt To wie bisher; CC und BCC als Zusatzinfo (breite Spalte oder Tooltip), ohne Layoutbruch auf schmalen Bildschirmen.
  • Bestandsmails: BCC erscheint in Detailansicht sofort (aus der gespeicherten Mail geparst); Sichtbarkeit und Listen-Anzeige über den Index erst nach archivmail reindex.
  • Tenant-Isolation und Fail-safe (leere Login-Adresse → total: 0) unverändert.
  • Tests mit synthetischen Daten: Parser (Bcc vorhanden, fehlend, ungültig, mehrere), mailBelongsToUser mit BCC, Konsistenz Liste/Detail.

Edge Cases

  • Archivierte Kopien tragen den Bcc-Header meist nur in der Sender-Kopie; Zustellkopien haben ihn nicht. Dann bleibt BCC leer, kein Fehler.
  • Ungültiger oder fremdkodierter Bcc-Header → keine Adresse, Mail bleibt sonst unverändert.
  • Sehr viele Empfänger → Anzeige gekürzt mit "+N weitere", vollständig im Detail.
  • BCC-Adressen sind für alle sichtbar, die die Mail öffnen dürfen (kein zusätzliches Rechtekonzept).

Technical Requirements

  • Security: BCC darf Sichtbarkeit nur über den exakten Adressvergleich gewähren (PROJ-88-Regel); keine Lockerung des Fail-safe.
  • Performance: kein zusätzlicher Index-Roundtrip; Parser-Mehraufwand vernachlässigbar.
  • Deployment: Reindex auf 132 nach Deploy (Freigabe des Users einholen).

Tech Design (Solution Architect)

Übersprungen: kleine Erweiterung (Parser-Feld, Indexfeld, Prüfung, Anzeige).

Implementation Notes

Backend (2026-10-22)

  • Parser (pkg/mailparser/bcc.go, parser.go): ParsedMail.BCC aus dem Bcc-Header (net/mail, lowercase, dedupliziert, unparsbar → nil). To/CC unverändert (nicht lowercased, wie bisher).
  • Index: alle MailDocument-Builder befüllen BCC (bcc_addr) mit demselben Trennzeichen wie CC am jeweiligen Ort: IMAP, POP3, Upload, submitToWorker, reindexTenant, reindex, index-pending, fix-subjects, import, archivmail-import. Keine Schemaänderung (Spalte existiert seit PROJ-50).
  • Sichtbarkeit: mailBelongsToUser prüft pm.BCC exakt wie CC; unabhängig von source_type (Bcc ist Mailinhalt, kein Zustellheader). AnyAddress matcht bcc_addr bereits; der exakte Nachcheck in handleSearch deckt BCC damit automatisch ab.
  • API: Detail (GET /api/mails/{id}) neu bcc (string, kommagetrennt, leer wenn keiner); from/to/cc unverändert. Trefferliste: je Hit neu cc und bcc (string, kommagetrennt, omitempty).
  • Tests: pkg/mailparser/bcc_test.go (fehlend, einzeln, mehrere/Displayname/Dedup/Case, ungültig, leer), internal/api/mail_ownership_test.go (BCC-only → true, fremde/Teil-Adressen → false, ungültiger Bcc → false, Konsistenz Index-BCC/Detail). Lokal kein Go-Toolchain: Build/Tests nicht ausgeführt.
  • Offen: v1-API, PDF-Export und eDiscovery geben BCC noch nicht aus. Bei Message-ID-Dedup stammt bcc_addr (wie To/CC) aus der eingehenden Kopie, die Detailansicht aus der gespeicherten; der exakte Nachcheck in der Liste verhindert Metadaten-Leaks. Bestandsmails: archivmail reindex nötig (Freigabe einholen).

Frontend (2026-10-22)

  • Typen (src/lib/api/mail.ts): MailDetail.bcc?, SearchHit.cc?/bcc? (optional, kommagetrennt).
  • src/components/mail/AddressList.tsx: AddressList zeigt bis 5 Adressen, darüber "+N weitere" per shadcn-Button (variant link, aria-expanded/aria-controls) auf-/zuklappbar. splitAddresses trennt nur an Kommas außerhalb von Anführungszeichen und <...> (Displaynamen wie "Muster, Max" bleiben ganz).
  • Detailansicht (MailHeaderGrid): An, CC und neu BCC über AddressList; CC/BCC nur wenn nicht leer.
  • Trefferliste (SearchResultsTable): Spalte "An" (ab lg) zeigt unter To kleine, abgeschwächte Zeilen "CC: …"/"BCC: …" (truncate, voller Text im title), nur wenn nicht leer; auf schmalen Bildschirmen weiterhin ausgeblendet.
  • Geprüft: npx tsc --noEmit, ESLint auf geänderten Dateien und npm run build lokal fehlerfrei; Splitter mit synthetischen Adressen (example.com) per Node-Skript geprüft. Kein Browser-Test.

QA Test Results

To be added by /qa

Deployment

  • 2026-10-22: Commit 833ff55 auf 132 deployed, Dienste und Health ok.
  • archivmail reindex auf 132: total=58741, indexed=58741, errors=0. BCC im Index: 57 Mails (global), 0 in Tenant 1 (BCC steht nur in Sender-Kopien).
  • Offen: Abnahme der Darstellung im Browser, v1-API/PDF-Export/eDiscovery geben BCC noch nicht aus.