惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
Forbes - Security
Forbes - Security
IT之家
IT之家
P
Privacy International News Feed
宝玉的分享
宝玉的分享
小众软件
小众软件
Google DeepMind News
Google DeepMind News
美团技术团队
G
GRAHAM CLULEY
T
Tor Project blog
Recorded Future
Recorded Future
I
Intezer
C
Cyber Attacks, Cyber Crime and Cyber Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
Scott Helme
Scott Helme
WordPress大学
WordPress大学
F
Full Disclosure
D
Docker
G
Google Developers Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Cyberwarzone
Cyberwarzone
The Last Watchdog
The Last Watchdog
V
V2EX
www.infosecurity-magazine.com
www.infosecurity-magazine.com
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Recent Announcements
Recent Announcements
P
Palo Alto Networks Blog
L
LINUX DO - 热门话题
V
Visual Studio Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
腾讯CDC
H
Heimdal Security Blog
博客园 - 【当耐特】
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy & Cybersecurity Law Blog
S
Securelist
Vercel News
Vercel News
J
Java Code Geeks

Dejavu's Blog

甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 在 Windows 中使用 Yubikey 的 OpenPGP 应用 Windows 11 IoT LTSC 养老指南 巧用浏览器生成 HAR 文件批量下载所需网页资源 聊聊静态网站的评论系统 在 Hugo 站点中优雅地展示实况照片 使用 snac 部署一个简洁优雅的 ActivityPub 实例 当 25 岁来临的时候 断网的这两年 从 Bitwarden/Vaultwarden 到 KeePassXC 也许是 Android 上最好的本地播放器 - 椒盐音乐 2023 半年小结 写一个好玩的 Hugo 货币汇率转换短代码 写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示 海信 Touch Lite 墨水屏音乐阅读器的简单体验 从 Debian 11(bullseye) 无感升级到 Debian 12(bookworm) 使用 GitHub Actions 自动提交 URL 到 IndexNow 批量重写 Git 历史提交记录 使用 cgit 托管小小的也很可爱的 Git 服务器 在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器 托管简单 Git 服务器的一些尝试 使用 stagit 自托管纯静态 Git 存储库 使用 Docker 快速部署单人 Fediverse 实例 我是如何建立自己的个人博客的? 简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南 服务器使用 Cloudflare CDN 的最佳实践 甲骨文服务器分配并启用 IPv6 地址 Git 版本控制学习笔记(二) Cloudflare WAF 防护策略简易指南 Mastodon 服务器批量导入自定义表情 低成本自托管 Mastodon 实例简明指南 自托管服务指南──有了服务器可以做什么? 使用 Miniflux + RSSHub 打造个人 RSS 阅读器 构建支持多种 CPU 架构的 Docker 镜像 一个可自托管的静态短链接应用 别了,二〇二二! Duplicacy CLI 进阶使用指南 Duplicacy CLI 备份工具的基本使用 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器 Yubikey 转运日志及上手指南 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室 初探 Cloudflare 零信任 - 通过 Cloudflare Tunnel 访问服务 某科学的 PGP 算号指南 2022 年的 MacBook Air M1 使用体验及应用推荐 使用 Vercel 和 Supabase 自托管 Cusdis 评论系统 为什么你的搜索引擎不好用? 个人在 Windows 上常用软件清单 macOS 基础开发环境设置指南 在 macOS 上使用 Canokey 的 OpenPGP 应用 提取 Windows UWP 应用商店的安装包以供离线安装 Git 版本控制学习笔记(一) 使用 Notion 管理 GitHub Star 项目 使用 Vercel 免费部署 Giscus 评论系统 将博客评论从 Utterances 无缝迁移到 Giscus Canokey 签名和认证应用指南 Canokey 的基本使用指南 Canokey Pigeon 揽件日志及简单开箱 关于 Google Play 保护机制和 DRM 安全等级的那些事 记录一次捡垃圾装机 GitHub 使用 GPG 密钥提交签名认证 使用 Scoop 管理 Windows 下的软件和开发环境 Windows Terminal+PowerShell 7 打造 Windows 下最好用的终端 一个好用的 Telegram 文件批量上传/下载工具 Clash for Windows 优雅地使用 TUN 模式接管系统流量 全平台搭建 Hexo 静态博客指南 尝试将 Manjaro 作为主力操作系统使用 Hexo 进行 SEO 优化的基本指南 使用本地代理给 Git 和 NPM 加速
使用 Stalwart 自托管邮局服务
Dejavu Moe · 2026-01-17 · via Dejavu's Blog

简介

Stalwart 是一款采用 Rust 编写的高性能邮件与协作服务器,兼顾了极致的运行效率与从个人到企业级的扩展灵活性。其资源占用主要随并发连接数与客户端活跃度动态增减。

它的性能占用极为克制,空闲状态下 RAM 占用约 100MB,是资源受限系统的理想选择。

  • 入门配置:针对 5-10 人的小型组织,1 核 vCPU + 1GB RAM 即可确保流畅运行;
  • 性能负载:CPU 负载随着用户规模、邮件吞吐量及协议操作强度增加;
  • 并发处理:系统默认设置为全协议共 8192 个连接,更高并发场景下,也支持多节点负载均衡部署。

域名准备

本文以 mail.via.moe 作为测试邮件域名,我们将获得类似 [email protected] 的邮箱。在设置服务器的 rDNS 解析之前,先完成域名到服务器 IP 的解析。

当前,只需在 DNS 服务商处添加以下两条记录:

类型名称IP 地址备注
Amail.via.moe.111.112.134.12IPv4
AAAAmail.via.moe.1a2b:3c4d:5:c666::1IPv6

请勿开启任何 CDN 来代理此流量,DNS 记录全球同步需要一些时间,趁着这段解析空档,我们继续下一步。

服务器准备

选择 25 端口开放支持 rDNS 解析 的云服务提供商,这是自托管邮件服务器的基本门槛。

Netcup 全系产品原生开放 25 端口,无需提交工单申请。若是新购买的 G12 代产品,只需登录 SCP 控制台手动删除默认的防火墙策略即可。

详见: Netcup 免税账号注册及购买服务器全记录

当然,请务必将其用于正途,任何滥发垃圾邮件(Spam)的行为都是不被允许的。

本文以 Netcup VPS nano G11s 为例,月付仅需 13.21 元,其配置为 2vCPU / 2GB RAM / 60GB SSD,并配备 1Gbps 无限流量。

流量说明:合理使用原则。若 24 小时内平均带宽持续超过 100Mbps,会临时限速至 100Mbps,动态 24 小时不再超过此限制后,自动恢复 1Gbps。

vps-nano-g11.webp

接下来的教程将基于全新的 Debian 13 系统,手把手带你从零开始搭建 Stalwart。

设置 Swap

适当设置 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 作为反向代理服务器。由于配置涉及 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

设置 rDNS 反向记录

在 Netcup 客户面板,设置 rDNS 记录

rdns.webp

开始安装

我们将采用官方推荐的 二进制安装 方式(而非 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) 登录信息为:

  • 用户名 admin
  • 密码 XvdNDhax3Q

安装完成,在正式使用之前,还需要完成一些其他工作。

acme.sh 申请证书

安装 acme.sh

# 切换到 root 用户
sudo -i
curl https://get.acme.sh | sh -s email=<联系邮箱>
# 重载 Shell 设置
source ~/.bashrc

Cloudflare 用户令牌

Cloudflare 控制台 新建一个用户 API 令牌,这将用于 acme.sh 用于 DNS 验证

api-template.webp

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

min-permissions.webp

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

zone-id.webp

获取 Google GTS 证书

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

gcp-shell.webp

执行命令

# 新建 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 账户

acme.sh --register-account -m [email protected] \
  --server google \
  --eab-kid "<eab-kid>" \
  --eab-hmac-key "<eab-hmac-key>"

申请 GTS 证书

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,使用后备管理员信息登录。

修改密码

后备管理员拥有邮件服务器的完全控制权,默认的随机密码太弱,建议修改

change-admin-pwd.webp

设置主机名

点击左下脚 Maintenance 菜单

maintenance.webp

点击 Settings

settings.webp

设置正确的主机名并保存

hostname.webp

添加 TLS 证书

这里忘记截图了,文字描述下。在 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 内置的安全和防垃圾系统正常工作。

trust-proxies.webp

删除端口

删除不使用的端口

del-port.webp

修改监听端口

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

change-port.webp

点击 Reload config 重载配置

添加域名

add-domain.webp

查看 DNS 解析记录

dns-records.webp

配置完成后,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 反向代理

编辑 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

发信测试

通过邮件客户端发信测试

full-mark.webp

得到了满分,这只是第一步。实际情况是,邮件是否会被投递进垃圾箱,还有很长的路要走:

  • 域名权重:新注册或从未发过信的域名,在各大厂商眼中缺乏「历史背书」。
  • 灰名单机制:由于信誉尚未积累,邮件很可能会触发目标服务器的灰名单过滤,一般会导致投递延迟或被拒绝。

先向自己的邮箱发信,慢慢温养,滴水石穿、假以时日,一定能养好信誉🤣。

结论

诚然,Stalwart 资源要求极低,100MB 左右浮动的 RAM,正常的单人示例或小型组织,普通的 1vCPU、1GB 的 VPS 就够用了。

然而,官方文档逻辑混乱,Web Admin 控制台操作反直觉、用户交互体验差、维护和更新困难,我认为它远未达到生产级别的可用水平。

我们不应当对开源的免费产品苛责什么,以上仅是 个人纯主观评价,我决定寻找下一款更符合用户直觉的邮件服务。