10-Stalwart服务搭建

nobility 发布于 2026-02-07 01-个人知识管理系统 443 次阅读


Stalwart 服务搭建

邮件服务端口扫盲

搭建邮件服务器需要依赖如下几个端口:

  • 25 端口 - SMTP(Simple Mail Transfer Protocol):邮件传输协议,主要用于服务器之间转发邮件的协议(MTA -> MTA)。
  • 465 端口 - SMTPS(SMTP over SSL/TLS):加密版 SMTP。
  • 587 端口 - SMTP Submission:客户端提交邮件给服务器(MUA -> MSA)。
  • 143 端口 - IMAP(Internet Message Access Protocol):客户端在线收取/管理邮件。
  • 993 端口 – IMAPS(IMAP over SSL/TLS):加密版 IMAP。
  • 110 端口 – POP3(Post Office Protocol v3):客户端下载邮件。
  • 995 端口 – POP3S(POP3 over SSL/TLS):加密版 POP3。

我们要达到的效果是,从我们搭建 MTA -> 外部 MTA,比如 MTA -> QQ 邮箱,如果 25 号端口的出站流量被封禁,那么我们就无法利用 25 号端口进行跨 MTA 通信。虽然 465 端口是加密版的 SMTP,但是外部 MTA 在与我们的 MTA 进行数据交换时,并不一定会用 465 端口,所以在自建 SMTP 服务器的前提需要保证当前云厂商允许 25 号端口的出入流量,可以通过以下命令检测:

telnet smtp.qq.com 25

如果上述命令迟迟得不到相应,那么就说明你的 25 号端口出站流量被封禁,需要向云厂商申请解封。如果上述命令很快返回了类似如下内容,那么说明你的 25 号端口的出站流量是正常的。

Trying 183.47.101.192...
Connected to smtp.qq.com.
Escape character is '^]'.
220 newxmesmtplogicsvrsza63-0.qq.com XMail Esmtp QQ Mail Server.

配置 SMTP

进入 Stalwart Web 管理后台,用 Docker 日志中的账户密码进行登入(执行 docker-compose logs stalwart 命令)。

对于 Stalwart 的后端数据库存储、LDAP 认证系统等,我们都无需关心,直接使用默认的后端数据库(RocksDB)进行存储和认证即可。对于 TLS 证书来说,我们也无需关心,因为可以直接通过 Nginx 将其反向代理到 Nginx 后方,对于邮件的 TLS 证书我们直接使用与 Nginx 相同的证书即可。

我们只进行必要的配置:

依次进入 Settings > Server > Network 选项卡,将 Network settings 下的 Hostname 配置项目设置为 Stalwart 的 Web 域名,比如 mail.example.com,然后点击 Save & Reload 按钮让配置生效。

依次进入 Management > Directory > Domains 选项卡,点击 Create domain 按钮创建一个主域名,这里指的是你的根域名,比如 Stalwart 的 Web 域名是 mail.example.com 那么根域名就是 example.com

主域名添加完成后,你新添加的域名条目后面会有一个“更多”的按钮(显示为三个点),点击后会出现更多选项,点击 View DNS records 可以查看需要为这个域名配置的一些 DNS 记录,我们需要将这些记录依次添加到 DNS 解析上。

DNS 记录扫盲

  • A 记录 - Address:用于映射域名和服务器实际 IP 地址的关系。
  • CNAME 记录 - Canonical Name:用于为域名创建别名,将一个子域名指向另一个域名。
  • MX 记录 - Mail Exchange:用于记录哪些域名的服务器可以接收该域的电子邮件,优先级决定了邮件服务器的查询顺序,值越低优先级就越高。
  • TXT 记录 - Text:用于记录存储文本信息,主要用于邮件验证和安全机制,比如:
    • SPF(Sender Policy Framework):用于指定允许发送邮件的 IP 地址列表,防止垃圾邮件伪造。例如 v=spf1 mx -all 表示仅允许邮件服务器自身发送邮件。
    • DKIM(DomainKeys Identified Mail):用于提供公钥对出站邮件进行签名,接收方服务器会通过查询该记录来验证邮件完整性和真实性,避免内容被篡改。
    • DMARC(Domain-based Message Authentication, Reporting & Conformance):用于指定如何处理未通过 SPF 或 DKIM 检查的邮件,比如标记为垃圾或直接拒绝,并将报告发送到指定邮箱。
  • SRV 记录 - Service Record:用于‌标记特定网络服务位置‌,举个例子,当 SMTP 在使用非标准接口 2525 时,我们就需要配置 _smtp._tcp.example.com 的 SRV 记录,并标注其优先级、权重、端口、域名(0 1 2525 mail.example.com),让客户端能够自动发现其服务位置。

映射 TLS 证书

依次进入 Settings > Server > TLS > Certificates 选项卡,点击 Create certificate 按钮创建一个证书,Certificate Id 只要不重复即可,而 Certificate 需要填入证书,Private Key 需要填入证书密钥,不过,这两个配置项即支持填入证书或密钥内容本身,也支持文件映射的,我举个例子:

%{file:/etc/nginx/ssl/*.example.com.key}%

配置完成后,点击 Save & Reload 按钮让配置生效。

创建用户

依次进入 Management > Directory > Accounts 选项卡,点击 Create account 按钮创建一个用户,填入 Login nameEmail,建议两者都填入带有域名的邮箱地址,然后点击 Authentication 选项卡填写密码,最后再点击 Save changes 按钮进行创建。

⚠️ 警告:

这里的 Login name 切勿填写与管理员用户相同的名字,否则会顶掉管理员账户,如果你已经这么做了,那么可以修改 data/stalwart/etc/config.toml 中的 authentication.fallback-admin.user 配置项,暂时将管理员用户名修改成别的,再用管理员账户登入 Stalwart,然后将同名普通用户删除或修改普通用户名。

之后,我们就可以通过任意一个 Email 客户端进行登陆了,可以写一封测试邮件发送到自己的邮箱里。

配置 SMTP 中继

在大多数情况下,我们可能无法开通 25 号端口进行 MTA 间的数据交换,这时我们可以利用 SMTP 中继功能,将 Stalwart 作为 MUA 把邮件发送委托给第三方 MTA(比如腾讯企业邮箱),并利用第三方 MTA 的 25 号端口进行邮件转发,这样不仅可以解决 25 号端口的限制,还可以提升邮件的信誉度(由企业邮箱做背书),唯一的坏处是我们每日的邮件发送数量可能会受限,也只能用单一用户进行中继(不过可以通过为企业邮箱配置别名来解决)。

依次进入 Settings > SMTP > Outbound > Routing 选项卡,点击 Create Route 按钮创建一个路由规则:

  • ID:只要不重复即可,但是建议使用中继的企业邮箱作为名称。
  • Type:要选择 Relay Host,表示当前路由规则是一台中继主机。

一旦我们选择了 Relay Host,那么下方会多处一列配置项让我们填:

Server Details

  • Address:中继主机地址,比如 smtp.exmail.qq.com
  • Port:中继主机端口,比如 465。
  • Protocol:中继主机协议,比如 SMTP。

📝 注意:

由于我们使用 465 端口进行转发,所以一定要打开 Implicit TLS 选项。

Authentication

  • Username:中继主机授权用户名。
  • Secret:中继主机授权码。

依次进入 Settings > SMTP > Outbound > Strategies 选项卡,在 Routing 选项组中点击 Add Condition 按钮添加一个路由生效条件:

  • if 部分填入策略生效规则,比如:
    • rcpt_domain = 'qq.com' 表示目标域是 qq.com 时生效(注意等号左右的空格)。
    • sender = 'admin@example.com' 表示发件人是 admin@example.com 时生效(注意等号左右的空格)。
  • then 部分填入 Routing ID 表示生效的路由规则(注意要加单引号)。

如果想要所有非本域的邮件都走中继,那么可以在最后一行将 'mx' 替换为中继路由规则的 Routing ID 即可,最后一行实际上就是 else 语句。

配置 IMAP 同步

在大多数情况下,我们可能无法开通 25 号端口进行 MTA 间的数据交换,这时我们可以利用 IMAP 协议,将第三方 MTA(比如腾讯企业邮箱)中的邮件定期增量备份到 Stalwart 中。

我在 GitHub 上搜索到了一款工具 Imapsync,这个工具就是利用的 IMAP 协议来增量备份邮件的,该工具的作者提供了 Docker 命令行工具,所以我们可以不在宿主机上安装,仅利用 Docker 就可以使用该工具:

为了密码的安全性,建议使用

docker run --rm gilleslamiral/imapsync imapsync \
  --host1 '<第三方 MTA IMAP 地址>' --user1 '<第三方 MTA 账号>' --password1 '<第三方 MTA 密钥>' \
  --host2 '<Stalwart 的 IMAP 地址>' --user2 '<Stalwart 账号>' --password2 '<Stalwart 密码>' \
  --delete2 --skipcrossduplicates --noexpungeaftereach

🔔 提示

建议你在调试阶段添加 --dry 参数,imapsync 打印了将要做的工作日志,并不实际进行同步。更多 imapsync 命令参数命令可以在 imapsync 的 README 中查看

等测试通过后,我们可以建立一个脚本文件,并利用 crontab -e 创建一个相应的 cron 任务来定期进行邮件数据同步。

加油啊!即便没有转生到异世界,也要拿出真本事!!!\(`Δ’)/
最后更新于 2026-02-07