feat(mail-admin): unified inbox (#76) #3

Closed
eSlider wants to merge 1 commits from feat/unified-view#76 into main
Owner

Closes #76

Unified view of ALL mailboxes directly from the Maildir (no IMAP, no user passwords): read-only list + full message view (MIME unfolded) + admin UI page.

  • GET /admin/api/messages — unified inbox, newest first; filters ?mailbox= (full address or localpart), ?q= (subject/from, case-insensitive), ?limit= (default 100, max 500)
  • GET /admin/api/messages// — decoded headers + text/plain + text/html + attachments (filename/size/cid)
  • URL safety: mailbox validated (^[a-z0-9._-]+@[a-z0-9.-]+$), filename resolved against the real cur/new listing — no traversal, no symlink escape
  • UI: /admin/messages unified inbox (grouped by mailbox, client-side search), /admin/message// with text/html toggle, no external CDN
  • Tests offline vs testdata Maildir fixtures (simple + multipart): go vet ./... && go test -race ./... green
  • Verified against real data via container: counts info=13, postmaster=31, ano=1, andriy.oblivantsev=1, postman=0; "ano self-test 1334" body readable; filters and UI work
Closes #76 Unified view of ALL mailboxes directly from the Maildir (no IMAP, no user passwords): read-only list + full message view (MIME unfolded) + admin UI page. - GET /admin/api/messages — unified inbox, newest first; filters ?mailbox= (full address or localpart), ?q= (subject/from, case-insensitive), ?limit= (default 100, max 500) - GET /admin/api/messages/<mailbox>/<filename> — decoded headers + text/plain + text/html + attachments (filename/size/cid) - URL safety: mailbox validated (^[a-z0-9._-]+@[a-z0-9.-]+$), filename resolved against the real cur/new listing — no traversal, no symlink escape - UI: /admin/messages unified inbox (grouped by mailbox, client-side search), /admin/message/<mailbox>/<filename> with text/html toggle, no external CDN - Tests offline vs testdata Maildir fixtures (simple + multipart): go vet ./... && go test -race ./... green - Verified against real data via container: counts info=13, postmaster=31, ano=1, andriy.oblivantsev=1, postman=0; "ano self-test 1334" body readable; filters and UI work
eSlider added 1 commit 2026-09-01 15:21:36 +01:00
eSlider closed this pull request 2026-09-01 15:35:31 +01:00

Pull request closed

Please reopen this pull request to perform a merge.
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/mail-server#3