Skip to content

Bulk MailerSend one message to many recipients

Typed in, pasted, uploaded as CSV, or pulled straight from LDAP / Active Directory. Self-hosted, and it runs offline.

Bulk Mailer

Running in one command

bash
docker run -d -p 8000:8000 \
  -e SECRET_KEY=$(openssl rand -base64 36) \
  -e ADMIN_PASSWORD=choose-one \
  -v mailer-data:/data \
  ghcr.io/timothestoifl24/bulk-mailer:latest

Open http://127.0.0.1:8000 and sign in as admin. The full walkthrough, including a Compose stack with PostgreSQL, is in Setup.

What it is

Built with FastAPI, Jinja2 and SQLAlchemy, a Tabler (Bootstrap 5) interface vendored locally rather than pulled from a CDN, and either SQLite or PostgreSQL. No JavaScript build step — server-rendered pages you can run on a workstation, a small VPS, or fully offline on an isolated network.

Before a large run

This tool will happily send to every address a directory returns. It has no opinion about whether it should.

Sending responsibly

Check the throttle against your mail server's rate limit. Do a dry run. Send a test to yourself. Make sure the recipients actually expect the message.

The unsubscribe link is in the default template for a reason — keep it.

Where to go next

GuideA first campaign, start to finish
ScreenshotsEvery screen, before you install anything
SetupDocker, Compose, or from source
Advanced configPostgreSQL, LDAP sign-in, list sync, deployment
UpgradingVersioning, schema changes, what to check
FAQThe questions that come up
ContributingDevelopment setup, tests, releases

Bug reports and questions go to Issues and Discussions. Security problems go privately, never to a public issue.

Released under the MIT licence.