Skip to content

SESKit

A Python-native developer email platform built on Amazon SES. It makes SES feel as simple as Resend, without giving up ownership of your sending infrastructure — you run it on your own AWS account, and the mail, the recipients and the delivery history stay there.

Two halves, and only one of them is the product

SESKit ships two things under one name. Knowing which is which saves an hour.

their application                  their server
┌─────────────────────┐           ┌────────────────────────┐
│ pip install seskit  │  ─HTTP→   │ git clone + compose up │ ──→ Amazon SES
│ client.emails.send()│           │ API, dashboard, worker │
└─────────────────────┘           └────────────────────────┘
        the client                        the server

The repository is the server. You clone it and run docker compose up once, on whatever machine you run things on. That gives you the HTTP API, the dashboard, the background worker, Postgres and Redis. This is SESKit.

The package is a client. pip install seskit goes inside your own application — the one that wants to send mail — and makes HTTP calls to your running server. Usually a different machine, often a different codebase.

If that pairing feels familiar, it should: you install and run PostgreSQL, and separately your application installs a driver to talk to it. Nobody thinks of those as one installation done twice.

The client is optional. It is a thin wrapper over the same HTTP API curl reaches, so anything you can do with it you can do with an HTTP request. Business logic lives in the API and is never duplicated in a client, which is why a Python call and a curl command cannot drift apart.

from seskit import SesKit

client = SesKit(api_key="sk_live_...", base_url="https://seskit.example.com")
client.emails.send(
    from_="hello@example.com", to=["user@example.com"], subject="Welcome", html="<h1>Welcome!</h1>"
)

Sync and async, typed, with every refusal as a class you can catch. See the Python SDK — or keep using the HTTP API, which is what every guide here does.

Start here

You do not need AWS to try it

A brand-new AWS account cannot send to arbitrary recipients for roughly 24 hours — leaving the SES sandbox is a support review, and no amount of interface design removes that wait. So first success does not depend on it.

Out of the box, SESKit sends through a local Mailpit inbox. POST /v1/emails works immediately after docker compose up, and the message appears at http://localhost:8025. No AWS account, no sandbox, no verified domain.

Why it exists

Amazon SES is the cheapest reliable way to send transactional email, and one of the least pleasant to adopt. Identities, DKIM records, configuration sets, event destinations, SNS topics and sandbox limits all have to be understood before the first message arrives.

SESKit does that setup and gives you an API worth using, a dashboard that says what happened, and delivery events that reconcile back to the message that caused them. AWS handles the infrastructure; SESKit handles the developer experience.

The comparable products are hosted, or written in TypeScript end to end, or both. SESKit is self-hosted and Python throughout — a FastAPI backend for teams who would rather not run a Node toolchain to send email.