Mailboxes and newsletters from one Docker Compose stack
BillionMail is a complete mail server with an email campaign tool on top, deployed as a single Docker Compose stack. The same machine hosts mailboxes for the domains you add (SMTP, IMAP, POP3, webmail) and sends your newsletters, all driven from a web UI written in Go. The project pitches itself as an open, cheaper answer to email marketing platforms, and as a way to stop configuring Postfix, Dovecot and Rspamd by hand. The code is AGPL-3.0, and the website lists no paid or hosted plan.
listmonk and Keila manage lists and campaigns, then hand delivery to a server you already run: one or more SMTP servers for listmonk, SMTP or AWS SES, Sendgrid, Mailgun and Postmark for Keila. BillionMail ships that server, so mail leaves from the machine's own IP.
The comparison of self-hosted newsletter tools sorts out what each tool handles and what it leaves to the SMTP relay.
Ready-made mail stack with guided SPF, DKIM and DMARC
- The mail stack comes assembled: Postfix for SMTP, Dovecot for IMAP and POP3, Rspamd for spam filtering, Roundcube at
/roundcube/, with PostgreSQL and Redis underneath.install.shgenerates a random admin login and passwords, andbm show-recordprints the DNS records to create. - Guided DNS and certificates: the UI walks you through SPF, DKIM and DMARC, then requests a Let's Encrypt certificate. Since v4.9, DKIM keys also come in 1024 bits for DNS hosts that cap record length.
- Campaigns without a third-party service: an HTML editor with variables or a drag-and-drop builder, contacts imported from CSV into groups, tag filters with exclusions, spintax, send now or later, and an unsubscribe link you switch on per campaign. Open and click tracking can be turned off per campaign or for the whole instance (v4.9).
- An API for transactional mail: single or batch sends, an
X-API-Keyheader and an IP allowlist set per API. - Blocklist monitoring: since v4.8, BillionMail checks on demand or automatically whether the domain or IP appears on a blocklist, and sends an email alert when it does.
Seven containers and a port 25 your host may block
Outbound port 25 must be open. Mail servers only reach each other on that port, the docs point out, and "most cloud servers" block it by default, with AWS EC2 and DigitalOcean given as examples. The way out is to get the host to open it or to route mail through an SMTP relay: AWS SES, Mailgun or any relay you pick, one per domain.
PTR records and blocklist removal are handled elsewhere. The IP's PTR record is set at the hosting provider or network operator, not in BillionMail. For a poorly rated IP or domain, the docs send you to Spamhaus's removal form. A server with several outbound IPs can dedicate one to each domain since v4.4.
Seven containers, nine published ports. PostgreSQL 17, Redis 7, Rspamd, Dovecot, Postfix, Roundcube and the Go core, which mounts the Docker socket read-only. Ports 25, 465, 587, 110, 143, 993, 995, 80 and 443 are published; the last two can be moved in .env to sit behind a reverse proxy. The stated minimum is one core, 1 GB of RAM and 20 GB of disk, on Linux amd64 or arm64. install.sh also turns on a firewall (ufw with default deny on Debian and Ubuntu). The Docker route has you copy env_init, where the admin login is billion/billion and the Postgres and Redis passwords sit in the public repository; the README asks you to edit that .env before starting.
No release since December 2025. Maintained by aaPanel, the project shipped 21 releases in eight months, from V0.01 (April 11, 2025) to v4.9 (December 11, 2025). The default dev branch then took 74 commits between February and April 2026, and two more on June 10 and 11 adding single sign-on from aaPanel. The repository has 227 open issues.
