# Run it
$ docker run -d --name inboxbuffer -p 1081:1081 -p 1082:1082 -p 1025:1025 \
-v ./data:/data denwwer/inboxbuffer
# Point your app at it
$ export SMTP_HOST=localhost SMTP_PORT=1025
# Watch emails arrive
$ open http://localhost:1081 # Run it
$ container run -d --name inboxbuffer -p 1081:1081 -p 1082:1082 -p 1025:1025 \
-v ./data:/data docker.io/denwwer/inboxbuffer
# Point your app at it
$ export SMTP_HOST=localhost SMTP_PORT=1025
# Watch emails arrive
$ open http://localhost:1081 # Download for your OS, extract, then run it
$ ./inboxbuffer
# Point your app at it
$ export SMTP_HOST=localhost SMTP_PORT=1025
# Run full stack with Rspamd and Authentik
$ curl -o docker-compose.yml https://github.com/denwwer/inboxbuffer/docker-compose.yml \
&& docker compose up -d
# Watch emails arrive
$ open http://localhost:1081 Standard SMTP settings, auth, custom headers. Works with any app or framework — no SDK needed. Resend or forward through your own SMTP relay or AWS SES with email template preview.
AI agents can list, read and manage captured emails via the Model Context Protocol.
Create virtual inboxes with wildcard filters, favorites email messages and easy customization.
Label messages by hand across inboxes — #bug #awaited #approved
Instant search across subjects, addresses and bodies.
Everything the UI does, scriptable. Built for CI pipelines and e2e test suites.
HTML, text, raw source, headers, attachments. Preview the message as desktop or mobile. Validate HTML against email-client quirks, score spam with Rspamd integration.
Nothing leaves your machine. Resend to a real address only when you explicitly ask.
Small tool, deliberate choices. Nothing unnecessary.
Zipping stored mail would save disk megabytes but cost RAM and CPU on your machine. Test mail is transient anyway (auto-cleanup has you covered), and a dev tool should stay light where it counts.
Keyset pagination and lean indexes keep the UI instant whether an inbox holds ten messages or a hundred thousand.
If a feature needs a manual, it needs a redesign. Everything is discoverable from the UI, and the API describes itself through an OpenAPI spec.
Put your own proxy in front (Caddy, nginx, Traefik) when you expose it beyond localhost or for testing purposes. One tool, one job.