Lightweight HTTP email service
Stop email chaos. Spin up in minutes — no boilerplate, no SDKs.
One HTTP endpoint, per‑recipient tracking, production‑ready from day one.
Open source, deploy anywhere.
The pain today
SDK juggling, partial successes, inconsistent errors once you hit production.
A single endpoint
Deploy as a Go binary or Docker and call via HTTP from any service.
Per‑recipient clarity
Know exactly which recipients succeeded or failed with messageId and error.
Scalable
Built with Go for performance and concurrency.
Postgres logs
Track requests, responses, and errors end‑to‑end.
Multiple providers
SES today, easy to extend as you grow.
Own your email infrastructure
Mail Jack is open source (MIT License). No vendor lock-in, no hidden costs. Audit the code, modify it, deploy it anywhere you want. Full control of your data.
The problem we’re solving
Without Mail Jack
- Direct SES SDKs are verbose and environment‑sensitive
- Hard to correlate per‑recipient success vs. failure
- Inconsistent error shapes across libraries
- Boilerplate for retry, logging, and auth on every service
With Mail Jack (Open Source)
- One HTTP endpoint with a stable schema
- Per‑recipient results (status, messageId, error)
- JSON errors with proper HTTP status codes
- Drop‑in: Go binary or Docker, ready for CI/CD
- Open source – own your code, no vendor lock-in
Getting Started
Requirements: Go 1.22+, AWS SES (verified sender/domain), PostgreSQL connection string.
Run locally
Export envs → go run ./cmd. You’re live on http://localhost:8080.
Docker
docker build -t mail-jack .
docker run -p 8080:8080 --env-file .env mail-jack
Auth
Send X-API-KEY (must match MAIL_JACK_API_KEY). Try the curl in API.
API
curl -X POST http://localhost:8080/send-email \
-H "Content-Type: application/json" \
-H "X-API-KEY: $MAIL_JACK_API_KEY" \
-d '{
"from":"sender@example.com",
"to":["user@example.com"],
"subject":"Hello",
"body":"Plain text body",
"html":"HTML body
"
}'
How it makes life easier
Less boilerplate
- One HTTP call — no SDK juggling
- Clear JSON errors with proper codes
Save ~1–2 days per integration
Better visibility
- Per‑recipient status + messageId
- Easy to search, alert, and debug
Lower MTTR during incidents
User stories
Growth team launch
“Replaced ad‑hoc SES scripts in an afternoon. Experiments hit one endpoint; failures are instantly visible.”
On‑call visibility
“Per‑recipient results isolate domain‑specific bounces without hop‑scotching logs across services.”
Platform standardization
“Standardized outbound email. No SDK drift between services; onboarding a new team takes minutes.”