Ingest ok
Last report 6 hours ago. 14 kept, 0 parse failures this week.
Running, with warnings below.
Valid for another 78 day(s).
| Milter | State | Detail |
|---|---|---|
| OpenDKIM | ok | Listening |
| send-log | ok | Listening |
mail.example.org resolves to 203.0.113.10 and the reverse lookup points back at it.
INBOUND_RELAY_ENABLE is on. Port 25 accepts mail for 2 domains and forwards it upstream — not to local mailboxes.
One domain has no MX pointing at this server. Recipients are a list or any address at the domain. Open Inbound for the list, MX checks, upstream, and recipient maps.
Inbound domains| Resource | Usage | Detail |
|---|---|---|
| CPU | 4 cores · 4 threads | |
| Memory | 1.6 GiB used of 4.0 GiB. | |
| Network | ↓ 2.0 KiB/s ↑ 1.0 KiB/s |
eth0: 1.0 MiB in, 512.0 KiB out
|
| Program | State | Detail |
|---|---|---|
| opendkim | RUNNING | pid 21, uptime 3 days, 4:12:01 |
| panel | RUNNING | pid 18, uptime 3 days, 4:12:03 |
| postfix | RUNNING | pid 42, uptime 3 days, 4:11:58 |
| postfix-reload | STOPPED | Not started |
| cert-reload | STOPPED | Not started |
| logrotate | STOPPED | Not started |
Regenerates the OpenDKIM and Postfix configuration from the database and reloads both daemons. Use it if you edited the files by hand, restored a backup, or the running configuration looks out of step with the domain and application lists. It does not touch the mail queue or the TLS certificate, and it is safe to run at any time.
SelfPost 1.2.3 · © Mixeme · License (AGPL-3.0)
© Mixeme · License (AGPL-3.0)
This one-time link creates the single panel administrator. After you submit, the link stops working for good.
| Domain | DNS | Selector | Apps | |
|---|---|---|---|---|
| example.com | ok | 2 | Delete | |
| alerts.example.com | warn | 1 | Delete |
The DNS badge is the worst of DKIM, SPF and DMARC. Open a domain for details.
Shown once only and not stored. Copy it now.
p=none; rua points at SelfPost ingest.
Not required (rua= is on a domain SelfPost accepts).
DKIM
SPF
Open DMARC reports for this domain.
newsletter
Any address of the domain — *@example.com
Address mode
Trusted-IP override active
billing
Fixed list — invoices@example.com
DMARC reports
Level-2 rate limit active
Secret file — transfer securely, or encrypt as .spde.
You are about to delete example.com. This will:
This cannot be undone.
| Time | From | To | Subject | Status | |
|---|---|---|---|---|---|
| 2026-08-15 20:14:02 | billing@example.com | ada@example.net | Invoice #4412 | deferred | Details |
| 2026-08-15 20:11:40 | news@example.com | list-bounces@example.net | August digest | delivered | Details |
| 2026-08-15 19:02:11 | alerts@alerts.example.com | noreply@blocked.example | Disk 92% on web-3 | bounced | Details |
| 2026-08-15 18:44:09 | news@example.com | sam@example.org | August digest | delivered | Details |
Page 1 of 4 · Older →
billing@example.com → ada@example.net deferred
← Back to deliveries2026-08-15 20:14:02 UTC
accepted Received by the relay
SASL login billing, queued as 4C3A1E2F1A.
2026-08-15 20:14:08 UTC
deferred Receiving MX asked to try later
Postfix retries: first after 5 minutes, then with increasing gaps up to 1 hour 7 minutes, for up to 5 days. There is no fixed attempt count — a deferred message stays in the queue until it is delivered or that lifetime runs out.
not yet
delivery Waiting on the next retry
| Time | Message |
|---|---|
| 20:14:02 | postfix/smtpd[221]: 4C3A1E2F1A: client=203.0.113.40, sasl_username=billing |
| 20:14:02 | postfix/cleanup[224]: 4C3A1E2F1A: message-id=<4412@example.com> |
| 20:14:08 | postfix/smtp[230]: 4C3A1E2F1A: to=<ada@example.net>, relay=mx.example.net[198.51.100.20]:25, delay=6, status=deferred (450 4.2.1 mailbox busy) |
20:14:08
status=deferred (450 4.2.1 mailbox busy)20:14:02
client=203.0.113.40, sasl_username=billingThis Postfix’s policy, read once at panel start. There is no maximum attempt count — only time.
| Queue id | Age | From | To | Size |
|---|---|---|---|---|
| 4C3A1E2F1A | 18 min | billing@example.com | ada@example.net | 12 KiB |
| 4C3A1E3010 | 11 min | news@example.com | pat@slow.example | 48 KiB |
| 4C3A1E3102 | 4 min | billing@example.com | ada@example.net | 9 KiB |
Download a full backup of all persistent state — the database, every domain’s DKIM key and the application credentials. Restore into a container of the same SelfPost version, with the same data mount, before first start. TLS certificates and the mail queue are not included.
The backup file is a secret. Encrypting it is the simplest way to store it: the download is then a .spbk that only the password opens.
Keep this password: without it the file cannot be opened.
Move a single domain here from another SelfPost instance — plain .json or encrypted .spde. Its DKIM key and application passwords come across, so the published DNS record needs no change. The export file is a secret, like a full backup.
Needed for a .spde file. Leave empty for plain .json.
You are about to delete the panel user ops-alerts. A signed-in session for this user stops working immediately.
Level 1 is set in Compose; restart the container to change it. Domain and application ceilings live on each domain’s page.
Level 1 — per client IP
100 messages / 60 secondsRATE_LIMIT_MESSAGES_PER_IP / RATE_LIMIT_WINDOW_SECONDS. Hard ceiling for every connecting IP; the panel cannot raise a domain or application limit above this.
Level 2 — domain
Optional ceiling for all senders on a domain. When unset, only level 1 applies. Must be ≤ level 1.
Level 2 — application
Optional override for trusted IPs: a ceiling strictly above the domain limit (still ≤ level 1). Those IPs skip the domain check; everyone else stays under the domain (or level 1).
Backup-MX / forwarder. Accepts on port 25 only for listed domains. Recipients are either an allow-list or any address at that domain. Off by default in Compose.
| Domain | DNS | Upstream | Recipients | TLS | |
|---|---|---|---|---|---|
| lists.example.com | ok | 10.0.0.8:25 | 12 listed | required | Delete |
| backup.example.net | error | 192.0.2.20:25 | any | off | Delete |
The DNS badge is the MX check: at least one MX must point at this server. Results are cached for a few minutes; open a domain for the lookup and a Re-check button.
Cached a few minutes — use Re-check after publishing. Unlike outbound, inbound needs an MX pointing at this server.
An MX points at mail.example.org (this server). Other MX values are the domain’s own primaries — they are not an error.
Where accepted mail is handed off. Not a mailbox.
Add this MX so the internet delivers here. Keep any existing primary MX if this is backup-MX.
Who this domain accepts on port 25. Same idea as an application’s address mode: a list, or any address at the domain.
Unknown recipients are rejected at RCPT so this relay does not generate backscatter.
Every address at this domain is accepted and forwarded. Prefer a list unless the upstream rejects unknowns — otherwise this relay may generate backscatter.
Stops accepting mail for this domain. Does not touch outbound sending domains.
Delete inbound domainCached a few minutes — use Re-check after publishing. Unlike outbound, inbound needs an MX pointing at this server.
No MX points at mail.example.org (this server). Publish the record below, or wait for DNS to propagate and Re-check.
Where accepted mail is handed off. Not a mailbox.
Add this MX so the internet delivers here. Keep any existing primary MX if this is backup-MX.
Who this domain accepts on port 25. Same idea as an application’s address mode: a list, or any address at the domain.
Unknown recipients are rejected at RCPT so this relay does not generate backscatter.
Every address at this domain is accepted and forwarded. Prefer a list unless the upstream rejects unknowns — otherwise this relay may generate backscatter.
Stops accepting mail for this domain. Does not touch outbound sending domains.
Delete inbound domainYou are about to stop accepting inbound mail for lists.example.com. This will:
relay_domains and the recipient map;This cannot be undone from a backup of inbound maps alone unless you restore one. Remove the MX if you do not plan to re-add the domain.
Aggregate reports SelfPost accepted for rua=. Forensic (ruf=) is out of scope.
Last report 6 hours ago. 14 kept, 0 parse failures this week.
98% aligned last 7 days. Tightening p= looks reasonable.
A third-party sender is not in SPF/DKIM. See sources.
| Domain | Source | Pass | Fail | Disposition |
|---|---|---|---|---|
| example.com | 203.0.113.10 (this relay) | 412 | 2 | none |
| example.com | google.com / 66.102.0.0/20 | 0 | 6 | none |
| alerts.example.com | 203.0.113.10 (this relay) | 88 | 0 | none |
| alerts.example.com | unknown / 198.51.100.80 | 0 | 19 | none |
Short operator notes inside the panel — not a second copy of the full guide. Seeded from the Status explanations that do not belong on the cards (what a kernel counter is, why PTR is set at the host, what Reload does not touch). The cards themselves keep their readings, Detail columns, and the Configuration control.
The same texts open in the drawer from Status’s «?» — so a card can stay a reading, not a paragraph, without throwing the reading away.
CPU and memory are the container’s own readings, not the host’s spare capacity. Network is a short window, not a daily total. High CPU with an empty queue usually means something else on the box — not SelfPost “being slow to send”.
Port 465 presents the certificate the reverse proxy (or the image) mounted. The panel does not issue certificates. A warn here is “expires soon”; an error is “missing or unreadable”, and clients will refuse submission.
Forward-confirmed reverse DNS: the A/AAAA for SELFPOST_HOSTNAME must reverse to that same name. PTR is set at the hosting provider, not in this panel. Receiving networks use this pair as a cheap reputation check.