Self-hosted SMTP server for transactional + bulk email. Replaces SendGrid / Mailgun / Postmark. Other PMA services route outbound mail through Postal; Postal handles DKIM signing, bounce processing, delivery analytics.
| Field | Value |
|---|---|
| Containers | ${CONTAINER_PREFIX}postal (web + worker + smtp + cron) |
| Image | ghcr.io/postalserver/postal |
| Internal ports | 80 (web), 25 (SMTP) |
| External port | ${POSTAL_PORT} (web; default 8090). SMTP needs port 25 publicly. |
| Database | MariaDB + RabbitMQ + Redis |
| Storage | postal-data + postal-mariadb + postal-rabbitmq + postal-redis |
| Backup type | database + volume |
| Classification | enterprise |
| Profiles | enterprise, data, full |
| Default SSO | oauth |
PMA services configure their outbound SMTP to point at Postal's internal SMTP
endpoint. Postal handles the actual delivery to recipient mail servers.
| Recipe | What it does |
|---|---|
just postal-status / -logs / -restart |
Lifecycle |
just postal-rails |
Rails console |
just postal-list-users |
List users |
just postal-create-user --email=… |
Create user (Postal-side admin) |
just postal-create-domain DOMAIN |
Set up a sending domain |
just postal-print-dns DOMAIN |
Print DKIM + SPF + DMARC records to add to DNS |
just postal-test-send TO |
Send a test email |
# 1. Add the domain in Postal
just postal-create-domain example.com
# 2. Get the DNS records to publish
just postal-print-dns example.com
# Prints:
# SPF: "v=spf1 include:postal.your-host.com ~all"
# DKIM: "v=DKIM1; k=rsa; p=MIIBI..." (for postal._domainkey.example.com)
# DMARC: "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
# 3. Add those records to example.com's DNS
# 4. Verify
# Postal UI → Domains → example.com → Verify
In the service's .env (e.g. Redmine):
REDMINE_SMTP_HOST=${CONTAINER_PREFIX}postal-smtp
REDMINE_SMTP_PORT=25
REDMINE_SMTP_USER=<postal-credential-user>
REDMINE_SMTP_PASSWORD=<postal-credential-password>
REDMINE_FROM_EMAIL=noreply@example.com
Credentials come from Postal UI → Servers → Credentials.
Postal UI → Servers → <server> → Message Queue / Held / Bounced
For each message: SMTP transaction log, recipient response, bounce reason. If
deliverability tanks (Gmail starts marking as spam), this is where you
diagnose.
just backup postal # DB + RabbitMQ + Redis state
Note: in-flight messages in RabbitMQ are NOT backed up (transient). Don't run
the backup mid-bulk-send.
sso.type: oauthjust sso-check postal
just sso-fix postal
Postal admin users authenticate via Authentik. Per-server credentials
(the username/password your PMA services use as SMTP creds) are managed
inside Postal independently of SSO.
Port 25 inbound + outbound. Postal needs to send mail (outbound 25) and
receive bounces / replies (inbound 25). Some hosting providers block port
25 by default — verify before deploying.
Reverse DNS matters. Your sending IP needs PTR record matching the
HELO domain. Many recipient servers reject mail from IPs without proper
rDNS. Configure with your hosting provider.
SPF, DKIM, DMARC are non-negotiable. Gmail / Outlook reject or
spam-folder mail without proper authentication. just postal-print-dns
generates the records; publishing them is on you.
RabbitMQ memory pressure. Bulk sends queue up in RabbitMQ. Default
config can OOM under heavy load — tune rabbitmq.conf if you do regular
bulk campaigns (Mautic newsletters etc.).
Webhook signature validation. When PMA services subscribe to Postal
webhooks (delivered / bounced / opened), validate the HMAC signature
Postal includes in the request — accept-anything is a vulnerability.
The web UI is rails-classic. Postal is a Ruby on Rails app; its admin
UI is functional but doesn't feel modern. The data + delivery layer is
solid.
| Symptom | First check |
|---|---|
| Mail not sending | Postal-side: check Message Queue. Service-side: check SMTP creds. |
| Mail goes to spam | DNS records (SPF/DKIM/DMARC) + reverse DNS |
| Bounces not appearing in service | Postal webhook subscription + signature |
| RabbitMQ container restarting | Memory limit; see Postal docs for tuning |
| Login to Postal admin fails | just sso-check postal |
/pma/services/mautic — marketing automation, the heaviest Postal user.tpl.env per service — see each service's package.