Free and open source · MIT licensed · self-hosted
Transactional email you run yourself
Posta sends and receives email for your applications. SMTP and an HTTP API for sending, routes for inbound mail, DKIM-signed delivery, and a full history of every message, all on your own servers.
No message caps, no licence key, no phone-home.
- POST /api/v1/sendaccepted8ms
- Queued → picked upnotified5ms
- gmail-smtp-in.l.google.compooled connection0ms
- MAIL · RCPT · DATApipelined81ms
Everything an email platform needs
Sending, receiving and the deliverability work in between, in one open source package you can read, change and run anywhere.
Sending
SMTP and HTTP API
Point any mail library at the SMTP server, or POST JSON or a raw message to the send API. Every server has its own credentials.
IP pools and rules
Choose which addresses each server sends from, and add rules that pick a pool by sender or recipient.
Send limits
Cap what each server can send, so one noisy app cannot spend the reputation the others depend on.
Receiving
Inbound routing
Accept mail for your domains and hand it to an HTTP endpoint or forward it over SMTP. Routes decide what happens to each address.
Spam and virus checks
Score inbound mail with Rspamd or SpamAssassin and scan attachments with ClamAV.
Deliverability
SPF, DKIM and MX verification
Posta generates the records for each domain, signs outgoing mail with DKIM, and checks the DNS until it resolves.
Automatic suppression
A hard bounce adds the address to the suppression list, and later sends to it stop before they leave.
Open and click tracking
Optional, per domain, served from a tracking domain of your own.
Visibility
Full delivery history
Every attempt, the remote server’s response and the bounce reason, not just a status word.
Held messages and retries
Release held mail or retry a failed delivery from the dashboard or the API.
Signed webhooks
MessageSent, MessageDelayed, MessageDeliveryFailed and MessageHeld, signed and retried with backoff.
Running it
Organisations and servers
One organisation per product or customer, each with as many mail servers as it needs.
Your team, your rules
The first account is the administrator. Nobody else gets in until an administrator adds them.
A closer look
Verification you can watch happen
Posta generates the SPF, DKIM and MX records for each domain and checks them until they resolve. Propagation is not instant and the dashboard says so, rather than leaving you guessing whether it worked.
- SPFv=spf1 include:posta.dev ~allChecking
- DKIMv=DKIM1; k=rsa; p=MIIBIjAN…Checking
- MX10 mx.posta.devChecking
Bounces protect you automatically
A hard bounce suppresses the address on the spot, and the next send to it is stopped before it leaves. Continuing to mail dead addresses is the fastest way to lose a sending reputation, so nothing about it is left manual.
550 5.1.1 No such user here
Webhooks that survive your bad day
Every delivery event is posted to your endpoint and retried with backoff when it fails. An outage on your side does not cost you the events.
Set up Posta
From a fresh clone to your first sent message. The setup wizard in the dashboard handles the email side and saves as you go, so you can stop at the DNS step and come back once the records resolve.
- 1
Get the code
Clone the repository and install its dependencies.
git clone https://github.com/ChxisB/posta.git cd posta bun install - 2
Start PostgreSQL
Or use a PostgreSQL 16 you already run, and point
POSTA_MAIN_DB_URLat it.docker compose up -d postgres - 3
Add your Clerk keys
Create a free application at dashboard.clerk.com and copy its publishable and secret keys into
.env. No webhook is needed.cp .env.example .env # then set NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY - 4
Start Posta
The first command runs the API, the SMTP server and the delivery worker, and creates the database tables. The second runs the dashboard on port 3000.
bun run start # in a second terminal bun run start:frontend - 5
Create the admin account
Open
http://localhost:3000. A fresh installation opens on its setup screen, which checks it can reach the API and database, then has you create the admin account. The setup wizard takes it from there: your organisation, a mail server, your domain and its DNS records, and credentials. - 6
Send your first email
Create an API credential in the wizard, then send over HTTP, or use the SMTP credentials with any mail library.
curl -X POST http://localhost:5001/api/v1/send/message \ -H "X-Server-API-Key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "you@example.com", "from": "hello@yourdomain.com", "subject": "Hello from Posta", "plain_body": "It works." }'
Send your first message today
Clone it, start it, and the setup screen takes it from there: admin account, organisation, server, domain, DNS and credentials. No message caps and no licence key.