Transactional email.
Nothing else.

Receipts, password resets, magic links, alerts — the mail your product must send. No marketing suite, no campaign builder, no bloat.

That's the whole integration.

# A JSON API and an SMTP port, backed by one Rust binary and one PostgreSQL.
curl -X POST https://mail.yourdomain.com/api/v2/server/messages \
  -H "X-Server-API-Key: $KEY" -H "Content-Type: application/json" \
  -d '{
    "from": "billing@yourdomain.com",
    "to": ["customer@example.com"],
    "template": "payment-receipt",
    "template_model": {"amount": "49.00", "invoice": "INV-1042" }
  }'

Product

Everything your product needs. Nothing your marketing team wants.

{
  "status": "success",
  "time": 0.004,
  "data": {
    "messages": {
      "customer@example.com": {
        "id": 1042,
        "token": "wYcpYAtIiG7R"
      }
    }
  }
}

API

One call, one receipt

A stable JSON envelope with stable error codes. Send with a template or raw HTML, query messages and deliveries, read stats — 73 endpoints, one OpenAPI spec.

220 mx.camelmailer.com ESMTP
EHLO app.example.com
250-STARTTLS
MAIL FROM:<billing@yourdomain.com>
250 OK
RCPT TO:<customer@example.com>
250 OK

SMTP

Or just point your framework at port 25

Everything the HTTP API accepts you can hand over via SMTP with STARTTLS — same pipeline, same tracking. Useful for frameworks that already speak SMTP.

welcomemagic-linkpassword-resettwo-factor-codeorder-confirmationpayment-receiptpayment-failedteam-invitationtrial-endingshipping-notificationdata-export-readynew-device-login

Templates

20 templates, ready to clone

Responsive HTML with plain-text twins for the mail every product sends. Import with one command, edit in the dashboard.

camelmailer (one Rust binary)
PostgreSQL (all the state)

That's the entire production deployment.

Operations

A stack you can reason about

No queue cluster, no microservices. Back up one database and you have backed up everything.

-- every query runs inside a tenant context
SELECT set_config(
  'camelmailer.server_id', $1, true
);
-- row-level security does the filtering

Isolation

Tenant isolation in the database

Every mail server is a tenant, enforced with PostgreSQL row-level security — not with WHERE clauses someone can forget.

Run it your way

Self-host it today. Or let us run it for you — in the EU.

git clone https://github.com/camelmailer/camelmailer
cd camelmailer
docker compose up -d --build
curl localhost:5000/health
{"status":"ok"}

Self-hosted

Your infrastructure, your rules

docker compose up -d and you own the whole pipeline: unlimited everything, MIT licensed, no phone-home. If you can run Docker, you can run your own mail platform.

EU Cloud

The same code, on EU soil

The cloud runs the exact open-source code on EU infrastructure under EU jurisdiction. And the exit path is real: export your data, compose up on your own hardware, repoint DNS — done.