






















Stalwart 是一款采用 Rust 编写的高性能邮件与协作服务器,兼顾了极致的运行效率与从个人到企业级的扩展灵活性。其资源占用主要随并发连接数与客户端活跃度动态增减。
它的性能占用极为克制,空闲状态下 RAM 占用约 100MB,是资源受限系统的理想选择。
本文以 mail.via.moe 作为测试邮件域名,我们将获得类似 [email protected] 的邮箱。在设置服务器的 rDNS 解析之前,先完成域名到服务器 IP 的解析。
当前,只需在 DNS 服务商处添加以下两条记录:
| 类型 | 名称 | IP 地址 | 备注 |
|---|---|---|---|
| A | mail.via.moe. | 111.112.134.12 | IPv4 |
| AAAA | mail.via.moe. | 1a2b:3c4d:5:c666::1 | IPv6 |
请勿开启任何 CDN 来代理此流量,DNS 记录全球同步需要一些时间,趁着这段解析空档,我们继续下一步。
选择 25 端口开放、支持 rDNS 解析 的云服务提供商,这是自托管邮件服务器的基本门槛。
Netcup 全系产品原生开放 25 端口,无需提交工单申请。若是新购买的 G12 代产品,只需登录 SCP 控制台手动删除默认的防火墙策略即可。
当然,请务必将其用于正途,任何滥发垃圾邮件(Spam)的行为都是不被允许的。
本文以 Netcup VPS nano G11s 为例,月付仅需 13.21 元,其配置为 2vCPU / 2GB RAM / 60GB SSD,并配备 1Gbps 无限流量。
流量说明:合理使用原则。若 24 小时内平均带宽持续超过 100Mbps,会临时限速至 100Mbps,动态 24 小时不再超过此限制后,自动恢复 1Gbps。

接下来的教程将基于全新的 Debian 13 系统,手把手带你从零开始搭建 Stalwart。
适当设置 Swap 交换空间,防止 RAM 耗尽内核 OOM。
# 检查 Swap 状态
sudo swapon --show
# 低于 8GB RAM,设置 2*RAM 的 Swap
# 4096 * 1MB = 4GB
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo vim /etc/fstab
# 添加下面一行
/swapfile none swap sw 0 0
# 检查 fstab 挂载
sudo mount -a
sudo swapon --show
free -h
我们将使用 Nginx 作为反向代理服务器。由于配置涉及 Nginx Stream 模块,请务必确保安装的是项目存储库中的最新稳定版,以获得完整模块支持。
具体步骤参考: 新到手的 Linux 服务器,我这样设置——安装 Nginx
Stalwart 遵循「安全即默认」原则,系统内部已集成了针对暴力破解、账户枚举、漏洞扫描及 SYN 泛洪攻击的防护机制。
我们仅开放必要的端口,其中 8080 端口仅用于初始化的 Web Admin 配置,待服务器设置完成后,建议将其关闭以收紧安全策略。
sudo apt install ufw
# 确保 IPv6 支持
sudo sed -i 's/IPV6=no/IPV6=yes/' /etc/default/ufw
# 设置默认规则
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH 安全端口
sudo ufw allow 22122/tcp comment 'SSH'
# 80 用于 ACME 证书挑战和 MTA-STS 刷新
sudo ufw allow 80/tcp comment 'HTTP / ACME'
# 443 用于 JMAP, Admin 后台, MTA-STS 策略查询
sudo ufw allow 443/tcp comment 'HTTPS / JMAP'
# SMTP 入站(必须保留,用于接收外域邮件)
sudo ufw allow 25/tcp comment 'Mail Inbound'
# SMTPS (Implicit TLS) 客户端发信
sudo ufw allow 465/tcp comment 'SMTPS'
# IMAPS (Implicit TLS) 客户端收信
sudo ufw allow 993/tcp comment 'IMAPS'
# 临时放行8080,安装的时候需要
sudo ufw allow 8080/tcp comment 'Temporary Init Server'
# 启用防火墙
sudo ufw enable
# 重载防火墙配置
sudo ufw reload
# 查看规则
sudo ufw status numbered
将服务器主机名设置为即将使用的邮局域名,比如 mail.via.moe
sudo hostnamectl set-hostname mail.via.moe
在 Netcup 客户面板,设置 rDNS 记录

我们将采用官方推荐的 二进制安装 方式(而非 Docker)。通过官方提供的 Shell 脚本,可以快速完成部署。后续升级只需手动替换单个二进制可执行文件,维护压力极小。
根据 Stalwart 官方文档,v1.0 正式版预计将于 2026 年上半年发布。在此之前,除非涉及关键的安全补丁或重大漏洞修复,否则保持当前版本稳定运行即可,无需频繁跟进小版本更新。
# 下载脚本
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
sudo sh ./install.sh
# 执行安装脚本
sudo sh ./install.sh
示例输出:
⏳ Downloading stalwart for x86_64-unknown-linux-gnu...
Warning: Not enforcing strong cipher suites for TLS, this is potentially less secure
Warning: Not enforcing TLS v1.2, this is potentially less secure
stalwart
🖥️ Creating 'stalwart' account...
✅ Configuration file written to /opt/stalwart/etc/config.toml
🔑 Your administrator account is 'admin' with password 'XvdNDhax3Q'.
🔐 Setting permissions...
🚀 Starting service...
Created symlink '/etc/systemd/system/multi-user.target.wants/stalwart.service' → '/etc/systemd/system/stalwart.service'.
🎉 Installation complete! Continue the setup at http://127.0.0.1:8080/login
上面显示的默认 后备管理员 (Fallback Administrator) 登录信息为:
adminXvdNDhax3Q安装完成,在正式使用之前,还需要完成一些其他工作。
# 切换到 root 用户
sudo -i
curl https://get.acme.sh | sh -s email=<联系邮箱>
# 重载 Shell 设置
source ~/.bashrc
在 Cloudflare 控制台 新建一个用户 API 令牌,这将用于 acme.sh 用于 DNS 验证

仅需要指定区域的 DNS 编辑和读取权限

保存后复制用户 API Token 备用,在域管理页面复制区域 ID

我比较喜欢 Google 的 GTS 免费 TLS 证书,访问 Google Cloud Shell

执行命令
# 新建 acmedotsh 项目
gcloud projects create acmedotsh
# 切换到该项目
gcloud config set project acmedotsh
# 创建密钥
gcloud publicca external-account-keys create
# 输出 y 确认开启 Public Certificate Authority API
gcloud publicca external-account-keys create
API [publicca.googleapis.com] not enabled on project [acmedotsh]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y
Enabling service [publicca.googleapis.com] on project [acmedotsh]...
Operation "operations/acat.p2-105847362940-f728394a-bcde-4123-af90-1234567890ab" finished successfully.
Created an external account key
[b64MacKey: <eab-hmac-key>
keyId: <eab-kid>]
acme.sh --register-account -m [email protected] \
--server google \
--eab-kid "<eab-kid>" \
--eab-hmac-key "<eab-hmac-key>"
export CF_Token="<Cloudflare 用户令牌>"
export CF_Zone_ID="<Cloudflare 区域 ID>"
# 申请 ECC 证书
acme.sh --issue --dns dns_cf \
-d mail.via.moe \
--server google \
--keylength ec-256
sudo mkdir -p /etc/nginx/cert
sudo chmod 700 /etc/nginx/cert
# 安装到指定目录并设置权限
acme.sh --install-cert -d mail.via.moe --ecc \
--key-file /etc/nginx/cert/mail.via.moe.key \
--fullchain-file /etc/nginx/cert/mail.via.moe.pem \
--reloadcmd "systemctl reload nginx && chown root:stalwart /etc/nginx/cert/mail.via.moe.* && chmod 640 /etc/nginx/cert/mail.via.moe.key"
访问临时管理后台为 http://<IP 地址>:8080,使用后备管理员信息登录。
后备管理员拥有邮件服务器的完全控制权,默认的随机密码太弱,建议修改

点击左下脚 Maintenance 菜单

点击 Settings

设置正确的主机名并保存

这里忘记截图了,文字描述下。在 TLS——>Certificate——>Create Certificate 里
# 按照 ${file:文件路径}% 的格式把前面 acme.sh 安装证书的路径写进去保存即可。
证书公钥路径:%{file:/etc/nginx/cert/mail.via.moe.pem}%
证书私钥路径:%{file:/etc/nginx/cert/mail.via.moe.key}%
在 Stalwart 后台将 Nginx 设置为可信代理,用于传入真实 IP,以便 Stalwart 内置的安全和防垃圾系统正常工作。

删除不使用的端口

修改以下监听端口,方便后续交给 Nginx Stream 转发

点击 Reload config 重载配置


配置完成后,Stalwart 会生成约 10 多条 DNS 记录,涵盖 SPF、DKIM、DMARC 等关键安全验证,将其逐一添加到 DNS 服务商处的解析记录。
关于 TLSA 记录
TLSA 记录依赖 TLS 证书的 Hash 值,我建议 暂时跳过。目前 GTS 证书有效期通常为 90 天,每次证书自动续期后,Hash 值都会发生变化。
如果你对安全性有极致追求,可以考虑 自动化思路:编写脚本,在证书更新后自动重新计算 Hash,并利用 Cloudflare API 令牌同步更新 DNS 记录。
添加一个用户 [email protected] 设置为管理员,并设置密码。
根据需要,可以按照官方文档修改默认配置文件
sudo vim /opt/stalwart/etc/config.toml
tail -f /opt/stalwart/logs/stalwart.log.*
编辑 Nginx 默认配置文件
sudo vim /etc/nginx/nginx.conf
修改部分如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
...# 这里省略了
}
# 仅需添加下面一行
include /etc/nginx/stream.conf.d/*.conf;
编辑用于 Stalwart 邮件服务的 Nginx Stream 配置
sudo vim /etc/nginx/stream.conf.d/mail.via.moe.conf
就像这样
stream {
log_format proxy '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time "$upstream_addr"';
access_log /var/log/nginx/mail.via.moe.access.log proxy;
error_log /var/log/nginx/mail.via.moe.error.log;
server {
listen 25;
listen [::]:25;
proxy_pass 127.0.0.1:10025;
proxy_protocol on;
}
server {
listen 465;
listen [::]:465;
proxy_pass 127.0.0.1:10465;
proxy_protocol on;
}
server {
listen 993;
listen [::]:993;
proxy_pass 127.0.0.1:10993;
proxy_protocol on;
}
server {
listen 443;
listen [::]:443;
proxy_pass 127.0.0.1:10443;
proxy_protocol on;
}
}
检查并重载 Nginx 配置
sudo nginx -t
sudo nginx -s reload
此时我可以正常访问 https://mail.via.moe,先在管理后台删除 8080 端口。
然后,删除服务器防火墙放行规则
sudo ufw delete allow 8080/tcp
sudo ufw reload
通过邮件客户端发信测试

得到了满分,这只是第一步。实际情况是,邮件是否会被投递进垃圾箱,还有很长的路要走:
先向自己的邮箱发信,慢慢温养,滴水石穿、假以时日,一定能养好信誉🤣。
诚然,Stalwart 资源要求极低,100MB 左右浮动的 RAM,正常的单人示例或小型组织,普通的 1vCPU、1GB 的 VPS 就够用了。
然而,官方文档逻辑混乱,Web Admin 控制台操作反直觉、用户交互体验差、维护和更新困难,我认为它远未达到生产级别的可用水平。
我们不应当对开源的免费产品苛责什么,以上仅是 个人纯主观评价,我决定寻找下一款更符合用户直觉的邮件服务。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。