Skip to main content
This page is the operator companion to the SMTP architecture page: the ports to open, the [smtp] configuration, the queue you manage, and the workflows around sending domains. The first-boot wizard writes a working baseline for all of it.

Listeners and ports

Inbound (25) and submission (587/465) are separate code paths with different rules — untrusted mail is authenticated and scored, user mail is identity-validated and queued. Never proxy these ports; they bind directly even behind a reverse proxy.

Sending domains and DKIM keys

Each domain the server sends for has its own signing key, declared as an array entry:
Adding a sending domain is a three-step ritual: generate the key (oximail setup dkim --domain <d>), add the block above, and publish the DNS record — a key without its published TXT record signs mail that receivers reject. oximail check-dns --domain <d> confirms the full record set; the email authentication page explains each record. Submission validates both the envelope MAIL FROM and the body From: against the authenticated account’s identities — users cannot send as addresses they do not own, and additional sendable addresses are managed as aliases (oximail alias, ADR-089).

Routing outbound: transport maps

By default, outbound mail resolves the destination’s MX and delivers directly. [[smtp.transport_maps]] overrides routing per destination pattern — the mechanism behind relay/smarthost sending:
An authenticated route is TLS-mandatory by construction. Delivery through a route still runs the same extension mediation as direct delivery.

The outbound queue

Every submission lands in the persistent delivery queue; a worker retries with exponential backoff (1 min → 24 h) until the 5-day give-up window expires, then bounces with an RFC 3464 DSN. Manage it with:
A queue that grows without draining almost always means a DNS, reverse-DNS, or reputation problem on your side — start with oximail check-dns and the remote server’s reply recorded on the queue entry. Note that an account erasure deliberately refuses to run while that account still has undelivered queue entries; cancelling them via the queue surface unblocks it.

Rate limits

[rate_limit] smtp_outbound_per_hour caps per-account outbound volume, and the [rate_limit.destination_domains] table shapes per-destination behaviour to stay polite with large receivers. Both are runtime-overridable (configuration).

Backup MX

A second box with [mode] role = "backup" accepts mail for your domains when the primary is down, in one of two modes (queue or synchronous proxy — see the SMTP layer). The wizard has a dedicated Backup MX flow; publish it as MX priority 20. A backup MX must know the valid recipients or stay in proxy mode — a backup that accepts everything is a backscatter source.

Where the rest lives