Mail Server
Mailcow mail stack with Brevo SMTP relay — inbound mailboxes plus high-deliverability outbound SMTP.
Own Your Inbox
I wanted real @amora.dev mail without depending entirely on a consumer mailbox for domain email. That meant inbound delivery I control, plus outbound mail that actually lands in inboxes.
Mailcow provides the full suite (Postfix, Dovecot, SOGo, admin UI) in Docker. Brevo (smtp-relay.brevo.com) handles outbound SMTP relay so reputation and throttling are less of a foot-gun than sending raw SMTP from a VPS IP.
Introduction
Self-hosting mail is famously sharp-edged: DNS, spam policy, TLS, and relay reputation all have to line up. This project was deliberate practice in making those pieces boring and reliable.
Architecture
Mailcow
Mailcow packages the mail stack as compose services with a web admin panel for domains, mailboxes, and aliases. IMAP/SMTP and webmail sit behind the same host with certificates managed through the suite.
Brevo SMTP relay
Outbound mail authenticates to Brevo SMTP (smtp-relay.brevo.com:587). That offloads delivery reputation to Brevo while Mailcow still owns identity, storage, and inbound handling. The portfolio contact form uses the same Brevo path via Nodemailer.
DNS & trust
MX, SPF, DKIM, and DMARC are published for the domain. Without those, even a perfect mailer gets spam-foldered — so DNS was treated as part of the application, not an afterthought.
Operations
• TLS everywhere for submission and retrieval
• Mailbox and alias management through Mailcow admin
• Brevo SMTP credentials (BREVO_SMTP_USER / BREVO_SMTP_KEY) rotated via env / secrets, not baked into images
• Monitoring delivery/bounce signals in Brevo when sending transactional mail
Outcomes
Domain email works for portfolio contact flows and personal use, with clearer separation between “store and receive” (Mailcow) and “send at scale” (Brevo SMTP). The contact form on this site rides the same Brevo outbound path.