- Shipped
- September 11, 2026 at 11:07 PM UTC
- Author
- Kamo
- Commit
- cd006ed
Recorded in EmailSmtpService at the one place mail reaches the relay, and decided by the From address, so transactional templates, campaigns and article shares are all covered without opting in. Refusals are recorded with the relay's reason and still rethrown. The write runs in its own transaction and never throws: a failed audit row cannot fail or roll back a send. GET /api/email/noreply-outbound lists the ledger (search, status filter, paging, bodies excluded); /{id} returns one message with its body. Both require GD on the session and nothing else: the ledger spans every organization, so no org-scoped right can open it. The table is created on startup by NoReplyOutboundSchema, as the article-share ledger's is.