Skip to content

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.

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.

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.

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. 1

    Get the code

    Clone the repository and install its dependencies.

    git clone https://github.com/ChxisB/posta.git
    cd posta
    bun install
  2. 2

    Start PostgreSQL

    Or use a PostgreSQL 16 you already run, and point POSTA_MAIN_DB_URL at it.

    docker compose up -d postgres
  3. 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. 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. 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. 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.