Mail · 14 domains
Stalwart on the engine; orbit-mail UI on the shell. Per-tenant DKIM with Tier-C ceremony for rotation. SPF / DMARC / MTA-STS / TLS-RPT enforced via policy.
Domains
Each domain has its own DKIM selector, SPF, DMARC report-to address. orbit-mail manages records via orbit-dns when both products serve the same tenant.
| Domain | Tenant | MX | SPF | DKIM | DMARC | Mailboxes |
|---|---|---|---|---|---|---|
| orbit.zuerich | Orbit AG | 10 mail.orbit.zuerich. | ok | signing | p=quarantine | 14 |
| orbit.ch | Orbit AG | 10 mail.orbit.zuerich. | ok | signing | p=reject | 4 |
| walzpunkt.ch | Walzpunkt v2 | 10 mail.orbit.zuerich. | ok | signing | p=quarantine | 8 |
| heinrich-graf.ch | Heinrich Graf | — | missing | ceremony pending | none | 0 |
| brain-melt.zone | Brain-Melt Lab | 10 mail.orbit.zuerich. | ok | signing | p=none | 5 |
| juniorforge.ch | Junior Forge | 10 mail.orbit.zuerich. | ok | signing | p=quarantine | 2 |
Mailboxes
IMAP / JMAP behind Stalwart. Per-mailbox quota; messages stored encrypted with per-mailbox keys in KeyVault Tier B.
| Address | Tenant | Quota | Aliases | Sieve | Last login |
|---|---|---|---|---|---|
operator.tobi@orbit.zuerich | Orbit AG | 7.4 / 25 GB | 3 | enabled | 2m ago |
ops@orbit.zuerich | Orbit AG | 12 / 50 GB | 8 | enabled | live |
dmarc@orbit.zuerich | Orbit AG | 4.1 / 10 GB | 0 | enabled | automated |
heinrich@walzpunkt.ch | Walzpunkt v2 | 22.4 / 25 GB | 2 | enabled | 1h ago |
support@brain-melt.zone | Brain-Melt Lab | 8.2 / 50 GB | 12 | enabled | 14m ago |
Aliases
Catch-all per domain, plus explicit forwards. Aliases resolve before Sieve fires.
| From | To | Tenant | Type | Activated |
|---|---|---|---|---|
| contact@orbit.zuerich | ops@orbit.zuerich, +sales | Orbit AG | forward | 2024-09-12 |
| info@orbit.zuerich | ops@orbit.zuerich | Orbit AG | forward | 2024-09-12 |
| dmarc-reports@orbit.zuerich | dmarc@orbit.zuerich | Orbit AG | automated | 2024-09-15 |
| *@walzpunkt.ch | heinrich@walzpunkt.ch | Walzpunkt v2 | catch-all | 2025-09-13 |
| support@brain-melt.zone | support@brain-melt.zone (shared) | Brain-Melt | forward | 2025-02-04 |
Sieve
Server-side mail filtering. Edits validated before save; activation atomic per mailbox.
# Sieve · ops@orbit.zuerich · v2026.05.28 require ["fileinto", "imap4flags", "regex", "envelope"]; # Trajectory webhook → ticket-mail folder if header :is "X-Orbit-Source" "trajectory" { fileinto "ticket-mail"; stop; } # GitHub-style webhook deliveries if header :matches "From" "*@noreply.orbit.zuerich" { fileinto "automation"; setflag "\\Seen"; } # DMARC aggregate reports if header :contains "Subject" "DMARC Aggregate" { fileinto "dmarc-reports"; } # swissmail invoices → Finance if allof ( header :contains "From" "@switch.ch", header :contains "Subject" "Rechnung" ) { fileinto "finance"; } keep;
Policy
SPF · DKIM · DMARC · MTA-STS · TLS-RPT. Posture is global with per-domain overrides; each toggle emits a policy_changed audit event.
DKIM rotation
A DKIM rotation publishes the new public key in DNS, waits for propagation, then flips the signing selector. The private half lives in KeyVault Tier C; rotation requires the NFC admin card.
Inspect message
Look up a specific delivery — see envelope, headers, SPF / DKIM / DMARC verdict, route, sieve fire, recipient state.
Envelope
deliveredAuth verdict
passAudit
Per-mailbox / per-domain mutations + DKIM rotations + policy changes.
| Time | Event | Subject | Actor |
|---|---|---|---|
| 17:42 | mailbox_created | heinrich@walzpunkt.ch | operator.tobi |
| 17:30 | policy_changed | orbit.zuerich · dmarc p=quarantine→p=reject | operator.tobi |
| 17:14 | dkim_rotation_started | heinrich-graf.ch · q2 ceremony | operator.tobi |
| 12:00 | alias_created | contact@orbit.zuerich | operator.tobi |