自己收邮件这件事,我断断续续折腾了三年。最开始是 Postfix + Dovecot,配置散落在十几个文件里,每次升级都心惊胆战。后来换成了 Stalwart —— 一个用 Rust 写的 all-in-one 邮件服务器。

为什么不继续用 Postfix

不是 Postfix 不好,是我不想再维护它了。Stalwart 把 SMTP、IMAP、JMAP、Spam 过滤全放在一个进程里,配置只有一份 TOML。

NixOS 模块

NixOS 已经有 services.stalwart-mail 模块了,最小可用配置大概长这样:

services.stalwart-mail = {
  enable = true;
  settings = {
    server.hostname = "mail.example.com";
    server.listener."smtps".bind = [ "[::]:465" ];
    server.listener."imaps".bind = [ "[::]:993" ];
    certificate = {
      default.cert = "/var/lib/acme/mail.example.com/fullchain.pem";
      default.key = "/var/lib/acme/mail.example.com/key.pem";
    };
  };
};

证书交给 security.acme 自己续,记得把 acme 用户加进 stalwart-mail 组,否则读不到私钥。

DNS 记录别写错

邮件能不能收到,八成取决于 DNS。至少要这几条:

  • MX 指向 mail.example.com
  • A / AAAA 指向真实的公网地址
  • TXT 的 SPF:v=spf1 mx ~all
  • _dmarc 的 DMARC:v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com
  • DKIM 由 Stalwart 生成,公钥贴到 selector._domainkey 即可

提醒一句:家宽 25 端口基本都是被封的,发信老老实实走中转,别硬刚。

效果

现在整台机器的邮件相关配置不到 100 行,nixos-rebuild switch 之后就再也不用管了。收信延迟从原来的两三秒变成了几乎瞬时,客户端用 Thunderbird 通过 JMAP 连接,同步速度肉眼可见地变快。

折腾了三年,终于可以开始用邮件了。