- #教程
- #邮件服务器
- #Stalwart

之前用 Poste.io 搭过邮件服务器,能用但总觉得功能上有点受限。后来发现了 Stalwart,Rust 写的,原生支持 JMAP、IMAP、POP3、SMTP,性能和安全性都不错,管理面板也挺现代化。这篇文章记录一下用官方安装包从零部署的整个过程。
前置条件
动手之前先确认几件事:
- 一台 Linux 服务器,推荐 Ubuntu 22.04/24.04 LTS 或 Debian 12。
- 25 端口必须开放。很多云厂商默认封 25 端口防垃圾邮件,买之前问清楚或者买完测一下。测试方法:
连得上就说明没被封。
telnet smtp.gmail.com 25 - 一个域名,能管理 DNS 记录(Cloudflare、Namecheap 之类的都行)。
- 域名已解析到服务器 IP,至少先把
mail.example.com的 A 记录指过去。
安装
用官方提供的安装脚本,一行搞定:
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
sudo bash install.sh脚本会把服务安装到 /opt/stalwart 目录下。安装过程大概一分钟,结束后会在终端输出类似这样的信息:
✅ Installation complete!
Admin username: admin
Admin password: Rk8x#mP2$vLn9Qw
Web interface: https://<your-server-ip>:443这个临时管理员密码务必复制下来,后面登录管理面板要用,登进去之后可以改。
安装完成后 Stalwart 会自动以 systemd 服务运行。可以检查一下状态:
sudo systemctl status stalwart-mail看到 active (running) 就说明没问题。
需要放行的端口
Stalwart 默认会监听以下端口,防火墙需要全部放行:
| 端口 | 协议 | 用途 |
|---|---|---|
| 25 | TCP | SMTP(接收外部邮件) |
| 465 | TCP | SMTPS(加密发信) |
| 587 | TCP | Submission(客户端提交邮件) |
| 143 | TCP | IMAP(收邮件) |
| 993 | TCP | IMAPS(加密收邮件) |
| 110 | TCP | POP3(收邮件) |
| 995 | TCP | POP3S(加密收邮件) |
| 443 | TCP | HTTPS(管理面板 + JMAP + autoconfig) |
| 8080 | TCP | HTTP(管理面板备用端口) |
用 ufw 的话:
sudo ufw allow 25,465,587,143,993,110,995,443,8080/tcp用 iptables 的话逐个放行就行,这里不赘述了。
后续登入后台后,你也可以在 Settings → Server → Listeners 中直观地查看或修改所有服务的监听端口(例如 HTTP、IMAP、SMTP 等):

登录管理面板
浏览器打开 https://<你的服务器IP>:443。
首次访问会因为自签证书弹安全警告,跳过就行,后面配好 Let's Encrypt 就正常了。
用安装时给的用户名 admin 和临时密码登录。
登入后的界面可能比较空,点击右上角的 Actions 按钮,选择 Manage 进入管理后台:

进去之后建议第一件事就是改密码:
Management → Directory → Accounts → admin → 修改密码
配置主机名
登进管理面板后先把主机名设好,这是为了确保邮件服务器能正确标识自己。
点击侧边栏最下方的 Settings 菜单:

进入 Server → Network,在 Hostname 栏填入你的邮件服务器域名,比如 mail.example.com,然后保存。

这个主机名会出现在 SMTP HELO/EHLO、TLS 证书请求、自动发现等各种地方,写错会导致一堆问题。
配置 TLS 证书
如果你已经有现成的证书(比如用宝塔面板、Nginx Proxy Manager 申请好的),可以直接在面板里引用。也可以用 Stalwart 自带的 ACME 自动签发。
手动指定现有证书
在 Settings → Server → TLS → Certificates 中点击 Add:
- Certificate ID: 随便起个名字,比如
ruawd.de。 - Certificate: 填入证书文件路径,格式为
%file:/路径/到/fullchain.pem%(对应截图中的宝塔路径)。 - Private Key: 填入私钥文件路径,格式为
%file:/路径/到/privkey.pem%。

注意:Stalwart 运行在自己的用户下,确保它对这些证书文件有读取权限。
ACME 自动签发
如果想直接让 Stalwart 自己管证书,在 Settings → Server → TLS → ACME Providers 中新建:
- Directory URL:
https://acme-v02.api.letsencrypt.org/directory - Challenge: 选
tls-alpn-01或http-01。 - Domains: 填你的邮件域名,如
mail.example.com。
保存后 Stalwart 会自动申请并续期。配置好后,记得在 Settings → Server → TLS → Defaults 里勾选默认使用的证书。
添加域名
在左侧菜单栏进入 Directory → Domains,点击右上角的 Create domain(新建域名):

在 Domain name(域名)一栏填入你的主域名,比如 example.com,其他项可以留空,然后点击 Save changes 保存:

保存之后回到域名列表,找到你刚才添加的域名,点击最右侧的三个点菜单,选择 View DNS records:

在这个页面,Stalwart 会把接下来你需要配置的 DNS 记录全部列出来。
配置 DNS 记录
按管理面板给出的记录,到你的 DNS 服务商(Cloudflare 等)里添加。下面以 example.com 为例列出典型的记录:
基础记录
| 类型 | 名称 | 值 | 说明 |
|---|---|---|---|
| A | <服务器IP> | 邮件服务器地址 | |
| MX | @ | mail.example.com(优先级 10) | 指定邮件接收服务器 |
SPF 记录
| 类型 | 名称 | 值 |
|---|---|---|
| TXT | @ | v=spf1 mx ~all |
告诉收件方:只有 MX 记录指向的服务器才有资格代这个域名发信。
DKIM 记录
| 类型 | 名称 | 值 |
|---|---|---|
| TXT | stalwart._domainkey | v=DKIM1; k=ed25519; p=<公钥> |
DKIM 的公钥和 selector 名称在管理面板的 DNS 记录页面里能直接复制,照着填就行。
DMARC 记录
| 类型 | 名称 | 值 |
|---|---|---|
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected] |
刚开始建议 p=none(仅监控),确认邮件收发正常后再逐步收紧到 p=quarantine 或 p=reject。
自动发现记录(可选但推荐)
| 类型 | 名称 | 值 |
|---|---|---|
| CNAME | autoconfig | mail.example.com |
| CNAME | autodiscover | mail.example.com |
配了这两条,Thunderbird、Outlook 等客户端在添加账号时可以自动检测服务器设置。
MTA-STS(可选)
MTA-STS 强制入站邮件走 TLS 加密,防止中间人降级攻击。需要两步:
- 添加 DNS 记录:
| 类型 | 名称 | 值 |
|---|---|---|
| TXT | _mta-sts | v=STSv1; id=20260331; |
- 在
https://mta-sts.example.com/.well-known/mta-sts.txt提供策略文件:
version: STSv1
mode: enforce
mx: mail.example.com
max_age: 86400这个文件可以用 Nginx 反代或者直接让 Stalwart 处理(需要在 ACME 里把 mta-sts.example.com 也加上)。
创建邮箱账号
DNS 记录配好、传播生效后(通常几分钟到几小时),就可以建邮箱账号了。
Management → Directory → Accounts → 新建账号
填写:
- 用户名:比如
me,对应的邮箱地址就是[email protected] - 域名:选择刚才添加的
example.com - 密码:设一个足够强的密码
保存完就能用了。
连接邮件客户端
Stalwart 本身不带 Webmail 界面,需要用外部客户端。推荐 Thunderbird(桌面)或者 FairEmail(Android)。
客户端配置参数
| 项目 | 值 |
|---|---|
| 收信服务器 (IMAP) | mail.example.com,端口 993,SSL/TLS |
| 发信服务器 (SMTP) | mail.example.com,端口 465,SSL/TLS |
| 用户名 | [email protected] |
| 密码 | 账号密码 |
如果配了 autoconfig/autodiscover 的 CNAME 记录,Thunderbird 和 Outlook 可以自动识别配置,直接填邮箱地址和密码就行。
反向代理(可选)
如果你的服务器上已经跑着 Nginx,想把管理面板和 HTTPS 流量走 Nginx 代理,可以这么配:
HTTPS 反代(管理面板 / JMAP)
server {
listen 443 ssl http2;
server_name mail.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://127.0.0.1:8443;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}SMTP / IMAP 反代
邮件协议是纯 TCP,需要用 Nginx 的 stream 模块:
stream {
# SMTP
server {
listen 25;
proxy_pass 127.0.0.1:10025;
proxy_protocol on;
}
# IMAPS
server {
listen 993;
proxy_pass 127.0.0.1:10993;
proxy_protocol on;
}
# SMTPS
server {
listen 465;
proxy_pass 127.0.0.1:10465;
proxy_protocol on;
}
}用了 Proxy Protocol 的话,记得在 Stalwart 的 Listener 配置里也开启 Proxy Protocol 支持,不然 Stalwart 拿不到真实客户端 IP。
测试发信
配完之后发封测试邮件到 Gmail 或者 Outlook,然后检查以下几点:
- 能否正常收到,没进垃圾箱。
- 查看邮件原始头,确认 SPF、DKIM、DMARC 都是
pass。 - 用 MXToolbox 或 mail-tester.com 跑一下评分。
如果 SPF 或 DKIM 显示 fail,回去检查 DNS 记录有没有填错或者还没生效。
上线前清单
- 管理员密码已更改为强密码
- 主机名设置正确且与域名一致
- TLS 证书已通过 ACME 自动签发
- MX、SPF、DKIM、DMARC 记录已添加并生效
- 25 端口确认可用,未被云厂商封锁
- 防火墙已放行所有需要的端口
- 测试邮件发送接收正常
- 邮件通过 SPF/DKIM/DMARC 验证
总结
Stalwart 整体体验比传统方案(Postfix + Dovecot 那套)简单太多了,一个二进制文件把 SMTP、IMAP、JMAP 全搞定,自带管理面板,还能自动签证书。坑主要在 DNS 记录和端口放行上,把这些理顺了基本就没什么问题。
不过 Stalwart 目前没有内置 Webmail,如果需要网页收发邮件得另外搭一个 Roundcube 或 SnappyMail 接上去。日常用 Thunderbird 或者手机自带邮件 app 直连 IMAP 也完全够用。
DISCUSSION
文章评论
昵称、头像与账号资料会自动同步,无需手动填写。