Self-hosted email platform built on Amazon SES.
Run it on your own server, connect your AWS account, and get an email API and dashboard.
Docs · Install · First email · API
- Send email through a REST API or the Python SDK
- Verify senders — email addresses and domains, with the DNS records to add
- Delivery events — see whether each message was delivered, bounced, opened or clicked
- Webhooks — get notified when something happens to a message
- Receive email — mail sent to a domain you choose is stored, shown in an Inbox, readable through the API, and announced by webhook
- Suppression list — bounced and unsubscribed addresses are never sent to again
- Dashboard — send a test message, watch deliveries, manage everything
- Request SES production access from the dashboard
You need Docker.
curl -fsSL https://otitodev.github.io/seskit/install.sh | shOpen http://<your-server>:8000, create your account, and paste in an AWS
access key. Put a TLS proxy in front before sending real mail.
To try it locally without an AWS account, mail is captured by Mailpit:
git clone https://github.com/Otitodev/seskit.git && cd seskit
cp .env.example .env
docker compose upCreate an API key in the dashboard, then:
curl -X POST http://localhost:8000/v1/emails \
-H "Authorization: Bearer sk_..." \
-H "Content-Type: application/json" \
-d '{"from":"hello@example.com","to":["you@example.com"],
"subject":"Hello","html":"<h1>It works</h1>"}'Or with Python (pip install seskit):
from seskit import SesKit
client = SesKit(api_key="sk_...", base_url="http://localhost:8000")
client.emails.send(
from_="hello@example.com",
to="you@example.com",
subject="Hello",
html="<h1>It works</h1>",
)Three changes that show how this project is maintained:
- PR #7: the API reference is generated from the OpenAPI schema, and CI runs the same script with
--check, so the docs cannot drift from the routes. - PR #8:
llms.txtandllms-full.txtare generated at build time, so AI agents can read the docs without crawling the site. - PR #51: a proof only PR (closed, never merged) that shows the new security tests fail against the old behaviour, so the tests are known to catch the bug.
See CONTRIBUTING.md. Report security issues through SECURITY.md.