<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabe</title>
    <description>The latest articles on DEV Community by Gabe (@fijiwebdesign).</description>
    <link>https://dev.to/fijiwebdesign</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F407530%2Fb070bb34-65c2-4c05-81fe-902d376f9a6a.jpeg</url>
      <title>DEV Community: Gabe</title>
      <link>https://dev.to/fijiwebdesign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fijiwebdesign"/>
    <language>en</language>
    <item>
      <title>23 open source email servers for Linux, sorted by the job each one does</title>
      <dc:creator>Gabe</dc:creator>
      <pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/fijiwebdesign/23-open-source-email-servers-for-linux-sorted-by-the-job-each-one-does-18om</link>
      <guid>https://dev.to/fijiwebdesign/23-open-source-email-servers-for-linux-sorted-by-the-job-each-one-does-18om</guid>
      <description>&lt;p&gt;Most "best open source mail server" lists put a full-stack Docker bundle and a single SMTP daemon in the same ranked table, as if you'd choose between them. You wouldn't. This is 23 Linux mail projects grouped by the slot they fill in the mail path, with licenses, languages, and activity verified on 2026-08-05, plus the part every roundup skips: what self-hosting still costs you after the install script says done.&lt;/p&gt;

&lt;p&gt;Start with the slots, not the projects. A mail server is five distinct jobs wearing one&lt;br&gt;
name, and every project below fills one, some, or all of them. Once you know which slot&lt;br&gt;
you're shopping for, the list stops being a popularity contest and turns into about three&lt;br&gt;
real candidates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09jd8p2ftr6u0ijjngcw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09jd8p2ftr6u0ijjngcw.png" alt="The mail path as slots: inbound MX, filter, store, IMAP, client; outbound submission, queue, internet — and which project fills each" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whichever you install, the acceptance test is the same three commands, and it is worth&lt;br&gt;
running them before you read another word of documentation. Two of them check the server.&lt;br&gt;
The third checks the thing that actually decides whether your mail arrives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. does it accept mail on :25 for a domain it claims to own?&lt;/span&gt;
swaks &lt;span class="nt"&gt;--to&lt;/span&gt; you@example.com &lt;span class="nt"&gt;--server&lt;/span&gt; mail.example.com:25 &lt;span class="nt"&gt;--tls&lt;/span&gt;

&lt;span class="c"&gt;# 2. does it serve that mailbox back over IMAP with a real cert?&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; mail.example.com:993 &lt;span class="nt"&gt;-quiet&lt;/span&gt; &lt;span class="nt"&gt;-crlf&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
a login you@example.com hunter2
a list "" "*"
a logout
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# 3. does your sending IP have reverse DNS that matches your HELO name?&lt;/span&gt;
dig +short &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://ifconfig.me&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Command 3 is not part of any project's install script, and it is the one that fails. An&lt;br&gt;
IP with no PTR record, or a PTR that doesn't match the name your server announces in&lt;br&gt;
&lt;code&gt;EHLO&lt;/code&gt;, gets your mail filed as spam by Gmail and Outlook no matter which of these 23&lt;br&gt;
projects is behind it.&lt;/p&gt;

&lt;p&gt;Everything below was checked against each project's repository on 2026-08-05: license&lt;br&gt;
from the actual &lt;code&gt;LICENSE&lt;/code&gt; file, language, star count, and the date of the last commit.&lt;br&gt;
Star counts are a proxy for attention, not quality, and I've said so where the two&lt;br&gt;
diverge.&lt;/p&gt;
&lt;h2&gt;
  
  
  The MTAs: they move mail and nothing else
&lt;/h2&gt;

&lt;p&gt;An MTA speaks SMTP. It accepts a message on port 25, decides whether to take it, and&lt;br&gt;
either drops it into a local store or queues it for delivery elsewhere. It does not serve&lt;br&gt;
you a mailbox, filter spam, or render a web UI. Three of the four below have been doing&lt;br&gt;
this since before most of us had email addresses, which is the point: they are the least&lt;br&gt;
surprising software in your stack.&lt;/p&gt;
&lt;h3&gt;
  
  
  Postfix
&lt;/h3&gt;

&lt;p&gt;The default answer, and usually the right one. C, dual-licensed under&lt;br&gt;
&lt;a href="https://www.postfix.org/" rel="noopener noreferrer"&gt;EPL-2.0 or IPL-1.0&lt;/a&gt; since 3.2.5, written by Wietse Venema as&lt;br&gt;
a security-first replacement for Sendmail. Its architecture is a set of small processes&lt;br&gt;
with narrow privileges talking over pipes, which is why its CVE history is as quiet as it&lt;br&gt;
is. Nearly every bundle further down this page is Postfix plus a wrapper. Configuration&lt;br&gt;
is a flat &lt;code&gt;main.cf&lt;/code&gt; of key-value pairs, and it's readable, but the map/transport/restriction&lt;br&gt;
vocabulary takes a weekend to learn properly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Exim
&lt;/h3&gt;

&lt;p&gt;C, GPL-2.0-or-later, stable at 4.99.5 as of 2026-07-22. The Debian default for years and&lt;br&gt;
the engine behind most cPanel hosts. Exim's distinguishing feature is a genuinely&lt;br&gt;
programmable configuration language with string expansions, routers, and transports, so&lt;br&gt;
you can express routing logic in the config that would need a plugin elsewhere. That&lt;br&gt;
power has a cost: Exim has shipped several remote-code-execution CVEs where Postfix&lt;br&gt;
shipped none, largely because more of the message path runs in one privileged process.&lt;br&gt;
Pick it when you need its routing expressiveness, and subscribe to the security list.&lt;/p&gt;
&lt;h3&gt;
  
  
  OpenSMTPD
&lt;/h3&gt;

&lt;p&gt;C, ISC license, from the OpenBSD project. The configuration file is the pitch: a working&lt;br&gt;
mail server in about six lines, with a grammar closer to &lt;code&gt;pf&lt;/code&gt; than to &lt;code&gt;main.cf&lt;/code&gt;. It is&lt;br&gt;
audited to OpenBSD standards and deliberately implements a subset of SMTP rather than all&lt;br&gt;
of it. If you run OpenBSD, or you want the smallest correct thing that can accept mail,&lt;br&gt;
this is the one. Portable builds for Linux exist and are maintained, though they lag the&lt;br&gt;
OpenBSD release.&lt;/p&gt;
&lt;h3&gt;
  
  
  chasquid
&lt;/h3&gt;

&lt;p&gt;Go, Apache-2.0, &lt;a href="https://github.com/albertito/chasquid" rel="noopener noreferrer"&gt;978 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-06-07. Written for small personal servers by one maintainer who kept it small on&lt;br&gt;
purpose: SMTP in, SMTP out, hooks for aliases and spam filtering, no store of its own.&lt;br&gt;
It is the modern-language equivalent of OpenSMTPD's philosophy, and it pairs with Dovecot&lt;br&gt;
the same way. A single-maintainer project is a real risk to weigh, but the codebase is&lt;br&gt;
small enough that you could read all of it in an afternoon.&lt;/p&gt;
&lt;h2&gt;
  
  
  The all-in-one servers: the whole path in one binary
&lt;/h2&gt;

&lt;p&gt;These replace the classic Postfix-plus-Dovecot-plus-Rspamd assembly with a single&lt;br&gt;
process. It's a genuine architectural argument, not just packaging: one config file, one&lt;br&gt;
set of credentials, one thing to upgrade, and no gluing an MTA's idea of a user to an&lt;br&gt;
IMAP server's idea of a user. The trade is that you are betting on a younger codebase in&lt;br&gt;
the position where the old ones have thirty years of hostile-internet exposure.&lt;/p&gt;
&lt;h3&gt;
  
  
  Stalwart
&lt;/h3&gt;

&lt;p&gt;Rust, dual-licensed AGPL-3.0 and a commercial Enterprise license,&lt;br&gt;
&lt;a href="https://github.com/stalwartlabs/stalwart" rel="noopener noreferrer"&gt;14,017 stars&lt;/a&gt;, last commit 2026-08-03. The most&lt;br&gt;
protocol-complete project on this page: SMTP, IMAP4, JMAP, POP3, CalDAV, CardDAV, and&lt;br&gt;
WebDAV in one server, with built-in spam filtering, DKIM/ARC signing, and full-text&lt;br&gt;
search. JMAP support in particular is close to unique here. It's also the most actively&lt;br&gt;
developed, which cuts both ways: features land fast, and the config surface has changed&lt;br&gt;
between minor versions. Read the upgrade notes before you &lt;code&gt;apt upgrade&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  mox
&lt;/h3&gt;

&lt;p&gt;Go, MIT, &lt;a href="https://github.com/mjl-/mox" rel="noopener noreferrer"&gt;5,768 stars&lt;/a&gt;, last commit 2026-08-02. mox's design&lt;br&gt;
goal is that a competent person can run a personal mail server without becoming a mail&lt;br&gt;
administrator. One binary, a &lt;code&gt;quickstart&lt;/code&gt; command that generates your DNS records and&lt;br&gt;
systemd unit, and sane defaults for SPF, DKIM, DMARC, MTA-STS, DANE, and TLSRPT out of&lt;br&gt;
the box. It ships DANE and MTA-STS support that several older projects still don't. If&lt;br&gt;
you want one domain, a handful of mailboxes, and to stop thinking about it, mox is the&lt;br&gt;
shortest honest path.&lt;/p&gt;
&lt;h3&gt;
  
  
  maddy
&lt;/h3&gt;

&lt;p&gt;Go, GPL-3.0, &lt;a href="https://github.com/foxcpp/maddy" rel="noopener noreferrer"&gt;6,055 stars&lt;/a&gt;, last commit 2026-07-24. The&lt;br&gt;
selling point is composability: maddy models the mail path as pipelines of modules you&lt;br&gt;
wire in its config, so you can swap the storage backend or the auth source without&lt;br&gt;
swapping servers. It hits a nice middle ground between "one opinionated binary" and "six&lt;br&gt;
daemons and a socket map." Development is steadier than fast, which for mail software is&lt;br&gt;
not the worst property.&lt;/p&gt;
&lt;h2&gt;
  
  
  The bundles: the classics, assembled
&lt;/h2&gt;

&lt;p&gt;These aren't servers. They're curated stacks (usually Postfix, Dovecot, Rspamd, and a&lt;br&gt;
webmail) plus provisioning, TLS automation, and an admin UI. You get a working mail host&lt;br&gt;
in an afternoon and inherit whatever opinions the maintainers baked in. That is a fair&lt;br&gt;
trade for most people, as long as you know you're now debugging the wrapper as well as&lt;br&gt;
the components.&lt;/p&gt;
&lt;h3&gt;
  
  
  docker-mailserver
&lt;/h3&gt;

&lt;p&gt;Shell, MIT, &lt;a href="https://github.com/docker-mailserver/docker-mailserver" rel="noopener noreferrer"&gt;18,661 stars&lt;/a&gt;, last&lt;br&gt;
commit 2026-08-03. A single container with Postfix, Dovecot, Rspamd, ClamAV, and Fail2ban,&lt;br&gt;
configured by env vars and a &lt;code&gt;setup&lt;/code&gt; CLI. No database and no admin web UI on purpose:&lt;br&gt;
accounts live in a flat file, and the project treats "no persistent state we manage" as a&lt;br&gt;
feature. The most popular project on this page by stars, and the easiest to reason about&lt;br&gt;
when it breaks, because it's just the classics in a box.&lt;/p&gt;
&lt;h3&gt;
  
  
  mailcow: dockerized
&lt;/h3&gt;

&lt;p&gt;GPL-3.0, &lt;a href="https://github.com/mailcow/mailcow-dockerized" rel="noopener noreferrer"&gt;13,229 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-08-04. The opposite bet: a full docker-compose stack (Postfix, Dovecot, Rspamd,&lt;br&gt;
SOGo, Nginx, MariaDB, Redis) with a polished admin panel, per-domain quotas, ActiveSync,&lt;br&gt;
and calendars and contacts through SOGo. If you're replacing a small-business Exchange or&lt;br&gt;
Google Workspace and non-engineers will use the admin UI, this is the strongest option&lt;br&gt;
here. Budget the RAM: a dozen containers is not a $5 VPS workload.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mail-in-a-Box
&lt;/h3&gt;

&lt;p&gt;Python, CC0-1.0 (public domain), &lt;a href="https://github.com/mail-in-a-box/mailinabox" rel="noopener noreferrer"&gt;15,377 stars&lt;/a&gt;,&lt;br&gt;
last commit 2026-05-24. One &lt;code&gt;setup&lt;/code&gt; script turns a clean Ubuntu box into mail, webmail,&lt;br&gt;
contacts, calendar, DNS, and a status console that tells you exactly which DNS records&lt;br&gt;
are wrong. Explicitly designed for one box, one owner, no customization, and it says so:&lt;br&gt;
deviate from the supported layout and upgrades will fight you. The slowest commit cadence&lt;br&gt;
in this group, which reflects a project that considers itself finished more than one that&lt;br&gt;
is stalled.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mailu
&lt;/h3&gt;

&lt;p&gt;Python, MIT, &lt;a href="https://github.com/Mailu/Mailu" rel="noopener noreferrer"&gt;7,421 stars&lt;/a&gt;, last commit 2026-07-27.&lt;br&gt;
Docker-compose stack in the mailcow tradition, with a lighter footprint and a Kubernetes&lt;br&gt;
path that actually works. Web admin, optional webmail, per-user filters. A good middle&lt;br&gt;
choice if mailcow feels heavy and docker-mailserver feels too bare.&lt;/p&gt;
&lt;h3&gt;
  
  
  iRedMail
&lt;/h3&gt;

&lt;p&gt;Shell, GPL-3.0, &lt;a href="https://github.com/iredmail/iRedMail" rel="noopener noreferrer"&gt;1,834 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-07-22. Installs the classic stack straight onto the host (no containers) across&lt;br&gt;
several Linux and BSD distributions, backed by OpenLDAP, MySQL, or PostgreSQL. The&lt;br&gt;
open-source edition is complete; the good admin panel is the paid iRedAdmin-Pro, which is&lt;br&gt;
worth knowing before you plan around it. Choose it when you want packages on metal and an&lt;br&gt;
LDAP directory rather than a compose file.&lt;/p&gt;
&lt;h3&gt;
  
  
  Modoboa
&lt;/h3&gt;

&lt;p&gt;Python (Django), ISC, &lt;a href="https://github.com/modoboa/modoboa" rel="noopener noreferrer"&gt;3,528 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-08-04. Not a mail server: a management layer over Postfix and Dovecot, with domain&lt;br&gt;
and mailbox admin, per-user DNS record checks, a calendar, and a REST API. Reach for it&lt;br&gt;
when you already run the classics and the thing you're actually missing is a control&lt;br&gt;
panel with an API you can automate against.&lt;/p&gt;
&lt;h2&gt;
  
  
  The programmable ones: mail as an event in your application
&lt;/h2&gt;

&lt;p&gt;This is the category that behaves differently from everything above. The projects here&lt;br&gt;
assume the recipient is not a human with a mail client but a program: a support tool that&lt;br&gt;
turns replies into tickets, a CI system that accepts commands by email, an AI agent with&lt;br&gt;
its own address. What you want from a mail server in that case is not a mailbox. It's a&lt;br&gt;
well-formed event delivered to your code, with the MIME already parsed and the&lt;br&gt;
authentication already checked.&lt;/p&gt;
&lt;h3&gt;
  
  
  Haraka
&lt;/h3&gt;

&lt;p&gt;JavaScript, MIT, &lt;a href="https://github.com/haraka/Haraka" rel="noopener noreferrer"&gt;5,613 stars&lt;/a&gt;, last commit 2026-08-04.&lt;br&gt;
A high-performance SMTP server built as a plugin bus: every phase of the SMTP conversation&lt;br&gt;
(&lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;mail&lt;/code&gt;, &lt;code&gt;rcpt&lt;/code&gt;, &lt;code&gt;data_post&lt;/code&gt;) is an event you can hook in JavaScript, so you&lt;br&gt;
can reject a recipient with a live database lookup or hand the parsed message to your own&lt;br&gt;
code. It is the most flexible way to put application logic inside the SMTP conversation&lt;br&gt;
itself, and it's what we run as our own MX edge. It gives you a programmable SMTP server,&lt;br&gt;
not a finished product: storage, auth, retries, and the web UI are yours.&lt;/p&gt;
&lt;h3&gt;
  
  
  WildDuck
&lt;/h3&gt;

&lt;p&gt;JavaScript, EUPL-1.2, &lt;a href="https://github.com/zone-eu/wildduck" rel="noopener noreferrer"&gt;2,106 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-08-04. An IMAP and POP3 server that stores mail in MongoDB instead of on a&lt;br&gt;
filesystem, so mailboxes replicate and shard the way the rest of your infrastructure&lt;br&gt;
does, with no local state on the mail nodes. It also exposes a full REST API over&lt;br&gt;
mailboxes, which is unusual and useful. The right pick when you're building a mail&lt;br&gt;
&lt;em&gt;product&lt;/em&gt; for many users rather than hosting mail for a company.&lt;/p&gt;
&lt;h3&gt;
  
  
  ZoneMTA
&lt;/h3&gt;

&lt;p&gt;JavaScript, EUPL-1.2, &lt;a href="https://github.com/zone-eu/zone-mta" rel="noopener noreferrer"&gt;668 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-07-20. Outbound only, and specialized: named delivery zones let you bind different&lt;br&gt;
traffic to different IPs, so transactional mail and bulk mail stop sharing a reputation.&lt;br&gt;
Per-zone throttling, connection pooling, and hooks for rewriting messages in flight. Low&lt;br&gt;
star count for how good it is at its one job.&lt;/p&gt;
&lt;h3&gt;
  
  
  Postal
&lt;/h3&gt;

&lt;p&gt;Ruby, MIT, &lt;a href="https://github.com/postalserver/postal" rel="noopener noreferrer"&gt;16,719 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-08-03. The self-hosted answer to SendGrid or Mailgun: a full sending platform with&lt;br&gt;
an HTTP send API, per-organization credentials, click and open tracking, bounce&lt;br&gt;
processing, suppression lists, inbound routes that POST to a URL, and a real dashboard.&lt;br&gt;
If your requirement reads "we need a transactional email API but the data has to stay on&lt;br&gt;
our infrastructure," Postal is the closest open-source match. It expects MariaDB, RabbitMQ,&lt;br&gt;
and someone to keep them alive.&lt;/p&gt;
&lt;h3&gt;
  
  
  MailKite Server
&lt;/h3&gt;

&lt;p&gt;JavaScript (Node ≥ 22.5), AGPL-3.0, &lt;a href="https://github.com/mailkite/server" rel="noopener noreferrer"&gt;github.com/mailkite/server&lt;/a&gt;,&lt;br&gt;
v0.5.0, first public release 2026-08-01. This is ours, and it exists because of a specific&lt;br&gt;
gap in the list above: the programmable projects each solve one slot well (Haraka the SMTP&lt;br&gt;
conversation, WildDuck the store, Postal the sending platform), and an application that&lt;br&gt;
wants to &lt;em&gt;receive&lt;/em&gt; mail has to assemble three of them plus the parsing, the signing, and&lt;br&gt;
the retry logic.&lt;/p&gt;

&lt;p&gt;MailKite Server is that assembly, built so that every protocol daemon is stateless and all&lt;br&gt;
state sits behind one small HTTP contract: five IMAP read endpoints, an inbound ingest&lt;br&gt;
hook, an SMTP auth check, and a relay endpoint&lt;br&gt;
(&lt;a href="https://github.com/mailkite/server/blob/main/docs/contract.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/contract.md&lt;/code&gt;&lt;/a&gt;). The&lt;br&gt;
bundled zero-dependency SQLite backend and MailKite Cloud are two implementations of the&lt;br&gt;
same contract, so the Haraka MX edge, the submission edge, the IMAP head, and the web&lt;br&gt;
console run unchanged against either. One MX edge can serve several backends at once,&lt;br&gt;
routing each recipient domain to its owner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/mailkite/server &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;server
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;           &lt;span class="c"&gt;# backend + web console on :8787&lt;/span&gt;
docker compose &lt;span class="nt"&gt;--profile&lt;/span&gt; edges up &lt;span class="nt"&gt;-d&lt;/span&gt;   &lt;span class="c"&gt;# adds the MX edge on :25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mail that arrives is POSTed to your app as parsed JSON, signed with an&lt;br&gt;
&lt;code&gt;x-mailkite-signature: t=&amp;lt;unix&amp;gt;,v1=&amp;lt;hex&amp;gt;&lt;/code&gt; header. Verifying it is one call from the SDK,&lt;br&gt;
and because the self-hosted server and the hosted service sign identically, the same&lt;br&gt;
handler works against both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MailKite&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mailkite&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;MailKite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verifyWebhook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-mailkite-signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MAILKITE_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bad signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attachments&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;handleIncomingEmail&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attachments&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Honest scope: it's pre-1.0, the SMTP and IMAP edges run our production mail but the SQLite&lt;br&gt;
backend and console are new, and it is not a groupware server. If you want mailboxes for&lt;br&gt;
humans with calendars and contacts, mailcow or Stalwart is a better fit and it isn't&lt;br&gt;
close. If you want an application (or an AI agent) to own an address and react to mail as&lt;br&gt;
an event, this is the shape we think that should take, and you can run the whole thing&lt;br&gt;
yourself. &lt;a href="https://mailkite.dev" rel="noopener noreferrer"&gt;MailKite Cloud&lt;/a&gt;, which we build and which pays for this&lt;br&gt;
work, is the same contract with the deliverability and retention handled; the DIY path&lt;br&gt;
above is deliberately complete so you never need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The supporting cast
&lt;/h2&gt;

&lt;p&gt;Three projects that aren't mail servers but appear in almost every deployment on this&lt;br&gt;
page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dovecot
&lt;/h3&gt;

&lt;p&gt;C, LGPL-2.1 with MIT-licensed parts, &lt;a href="https://github.com/dovecot/core" rel="noopener noreferrer"&gt;1,233 stars&lt;/a&gt; on the&lt;br&gt;
core repo, last commit 2026-08-04. The IMAP and POP3 server that nearly every bundle here&lt;br&gt;
ships. Its Sieve implementation handles server-side filtering, and its LMTP and auth&lt;br&gt;
services are what Postfix hands mail to. The low star count is an artifact of a project&lt;br&gt;
that predates GitHub as a center of gravity, not a measure of use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rspamd
&lt;/h3&gt;

&lt;p&gt;C, Apache-2.0, &lt;a href="https://github.com/rspamd/rspamd" rel="noopener noreferrer"&gt;2,501 stars&lt;/a&gt;, last commit 2026-08-04.&lt;br&gt;
The spam filter that replaced SpamAssassin nearly everywhere: fast, with Bayesian&lt;br&gt;
classification, fuzzy hashing, greylisting, reputation tracking, and DKIM/ARC signing&lt;br&gt;
built in. It also handles the signing side of DMARC alignment, so it often does more than&lt;br&gt;
filtering in a modern stack. If you already run Postfix and your only problem is spam,&lt;br&gt;
adding Rspamd is a smaller change than replacing your server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Roundcube
&lt;/h3&gt;

&lt;p&gt;PHP, GPL-3.0, &lt;a href="https://github.com/roundcube/roundcubemail" rel="noopener noreferrer"&gt;7,114 stars&lt;/a&gt;, last commit&lt;br&gt;
2026-07-25. The webmail your users will actually see, sitting on top of whatever IMAP&lt;br&gt;
server you chose. Roundcube Elastic is the modern responsive skin, and the plugin API&lt;br&gt;
covers most of what people ask for. SOGo (bundled in mailcow) is the alternative when you&lt;br&gt;
need calendars and ActiveSync alongside mail.&lt;/p&gt;

&lt;h2&gt;
  
  
  If what you want is a newsletter, not a mail server
&lt;/h2&gt;

&lt;p&gt;Two projects worth naming because people land on mail-server roundups when this is what&lt;br&gt;
they actually need. Neither speaks SMTP to the internet on its own; both hand mail to&lt;br&gt;
something that does (Postfix, SES, or any relay).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;listmonk&lt;/strong&gt; (&lt;a href="https://github.com/knadh/listmonk" rel="noopener noreferrer"&gt;22,624 stars&lt;/a&gt;, Go, AGPL-3.0, last commit&lt;br&gt;
2026-08-03) is a single self-contained binary plus Postgres: subscriber lists, campaign&lt;br&gt;
templating, per-campaign analytics, and a fast admin UI. The highest star count on this&lt;br&gt;
page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keila&lt;/strong&gt; (&lt;a href="https://github.com/pentacent/keila" rel="noopener noreferrer"&gt;2,180 stars&lt;/a&gt;, Elixir, AGPL-3.0, last&lt;br&gt;
commit 2026-08-01) covers the same ground with a friendlier editor and a GDPR-first&lt;br&gt;
posture, which is why it shows up in European deployments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every project, one table
&lt;/h2&gt;

&lt;p&gt;Verified 2026-08-05. Stars are rounded; "last commit" is the most recent push to the&lt;br&gt;
default branch.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project&lt;/th&gt;
&lt;th&gt;Slot&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;th&gt;Last commit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.postfix.org/" rel="noopener noreferrer"&gt;Postfix&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MTA&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;EPL-2.0 / IPL-1.0&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.exim.org/" rel="noopener noreferrer"&gt;Exim&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MTA&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;GPL-2.0-or-later&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;4.99.5, 2026-07-22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.opensmtpd.org/" rel="noopener noreferrer"&gt;OpenSMTPD&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MTA&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;ISC&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/albertito/chasquid" rel="noopener noreferrer"&gt;chasquid&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;MTA&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;1.0k&lt;/td&gt;
&lt;td&gt;2026-06-07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/stalwartlabs/stalwart" rel="noopener noreferrer"&gt;Stalwart&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;all-in-one&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;AGPL-3.0 / commercial&lt;/td&gt;
&lt;td&gt;14.0k&lt;/td&gt;
&lt;td&gt;2026-08-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/mjl-/mox" rel="noopener noreferrer"&gt;mox&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;all-in-one&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;5.8k&lt;/td&gt;
&lt;td&gt;2026-08-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/foxcpp/maddy" rel="noopener noreferrer"&gt;maddy&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;all-in-one&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;6.1k&lt;/td&gt;
&lt;td&gt;2026-07-24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/docker-mailserver/docker-mailserver" rel="noopener noreferrer"&gt;docker-mailserver&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;18.7k&lt;/td&gt;
&lt;td&gt;2026-08-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/mailcow/mailcow-dockerized" rel="noopener noreferrer"&gt;mailcow&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;Shell / JS&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;13.2k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/mail-in-a-box/mailinabox" rel="noopener noreferrer"&gt;Mail-in-a-Box&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;CC0-1.0&lt;/td&gt;
&lt;td&gt;15.4k&lt;/td&gt;
&lt;td&gt;2026-05-24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/Mailu/Mailu" rel="noopener noreferrer"&gt;Mailu&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;7.4k&lt;/td&gt;
&lt;td&gt;2026-07-27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/iredmail/iRedMail" rel="noopener noreferrer"&gt;iRedMail&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;bundle&lt;/td&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;1.8k&lt;/td&gt;
&lt;td&gt;2026-07-22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/modoboa/modoboa" rel="noopener noreferrer"&gt;Modoboa&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;admin layer&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;ISC&lt;/td&gt;
&lt;td&gt;3.5k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/haraka/Haraka" rel="noopener noreferrer"&gt;Haraka&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;programmable SMTP&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;5.6k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/zone-eu/wildduck" rel="noopener noreferrer"&gt;WildDuck&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;IMAP + store&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;EUPL-1.2&lt;/td&gt;
&lt;td&gt;2.1k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/zone-eu/zone-mta" rel="noopener noreferrer"&gt;ZoneMTA&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;outbound MTA&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;EUPL-1.2&lt;/td&gt;
&lt;td&gt;0.7k&lt;/td&gt;
&lt;td&gt;2026-07-20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/postalserver/postal" rel="noopener noreferrer"&gt;Postal&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;sending platform&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;16.7k&lt;/td&gt;
&lt;td&gt;2026-08-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/mailkite/server" rel="noopener noreferrer"&gt;MailKite Server&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;app / agent mail&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;new&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/dovecot/core" rel="noopener noreferrer"&gt;Dovecot&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;IMAP + store&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;LGPL-2.1 / MIT&lt;/td&gt;
&lt;td&gt;1.2k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/rspamd/rspamd" rel="noopener noreferrer"&gt;Rspamd&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;filter&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;2.5k&lt;/td&gt;
&lt;td&gt;2026-08-04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/roundcube/roundcubemail" rel="noopener noreferrer"&gt;Roundcube&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;webmail&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;7.1k&lt;/td&gt;
&lt;td&gt;2026-07-25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/knadh/listmonk" rel="noopener noreferrer"&gt;listmonk&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;newsletter&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;22.6k&lt;/td&gt;
&lt;td&gt;2026-08-03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/pentacent/keila" rel="noopener noreferrer"&gt;Keila&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;newsletter&lt;/td&gt;
&lt;td&gt;Elixir&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;2.2k&lt;/td&gt;
&lt;td&gt;2026-08-01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What none of them fix
&lt;/h2&gt;

&lt;p&gt;Every project on this list will accept mail on port 25 within an hour. None of them can&lt;br&gt;
make anyone else accept mail from you, and that is where self-hosted email actually goes&lt;br&gt;
wrong. Four things decide it, and all four are outside the software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Port 25 is blocked&lt;/strong&gt; on most residential ISPs and on several cloud providers by
default. Check before you build. Some providers unblock on request, others never will.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your IP has a history you didn't write.&lt;/strong&gt; Cloud IPs get recycled. A fresh instance can
arrive already on a blocklist because of whoever had it in March, and no amount of
correct configuration overrides that.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PTR records live at your hosting provider&lt;/strong&gt;, not in your DNS zone, and they must match
the hostname your server announces. This is command 3 at the top of this page, and it's
the single most common miss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warming is real for volume.&lt;/strong&gt; Sending a thousand messages on day one from a new IP is
the behavior of a spammer, and receivers model it that way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this argues against self-hosting. It argues for being honest about the job: the&lt;br&gt;
install is an afternoon, the reputation is a practice. A common and entirely reasonable&lt;br&gt;
split is to receive on your own server, where reputation doesn't matter much, and relay&lt;br&gt;
outbound through a service whose IPs are already warm.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to pick
&lt;/h2&gt;

&lt;p&gt;The decision is almost never "which is best." It's "which sentence sounds like me."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs26odq61nramqckfyvv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs26odq61nramqckfyvv6.png" alt="Decision guide: the sentence that sounds like you, and what to install" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're still undecided after that, the default that disappoints the fewest people is&lt;br&gt;
mailcow for human mailboxes and Postfix plus Dovecot plus Rspamd for anything you intend&lt;br&gt;
to operate for a decade. Both are boring in the way infrastructure should be.&lt;/p&gt;

&lt;p&gt;And if you got here because an application of yours needs to receive email rather than&lt;br&gt;
host it, that's a different problem with a different shape, which is&lt;br&gt;
&lt;a href="https://mailkite.dev/blog/mailkite-server-open-source/" rel="noopener noreferrer"&gt;why we open-sourced our answer to it&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://mailkite.dev/blog/open-source-email-servers-linux/" rel="noopener noreferrer"&gt;mailkite.dev&lt;/a&gt;. I'm Gabe; I build &lt;a href="https://mailkite.dev" rel="noopener noreferrer"&gt;MailKite&lt;/a&gt;, and &lt;a href="https://github.com/mailkite/server" rel="noopener noreferrer"&gt;MailKite Server&lt;/a&gt; (AGPL-3.0) is #18 on the list above.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>selfhosting</category>
      <category>comparison</category>
      <category>smtp</category>
    </item>
  </channel>
</rss>
