Stalwart 郵件伺服器架設指南:取代 Postfix 與 Dovecot
Stalwart 以單一 Rust 二進位檔取代傳統郵件堆疊。本文分析其架構優劣、連接埠 25 的封鎖測試,以及為何在複雜環境下 mailcow 仍是更佳選擇。
Stalwart 如何整合為單一執行檔
Stalwart 是一套郵件伺服器,您只需在單一 VPS 上執行一個 Rust 編譯的執行檔即可運作。它在同一個處理程序中處理 SMTP、IMAP、POP3、JMAP、CalDAV、CardDAV 與 WebDAV 協定,並內建垃圾郵件過濾器、郵件儲存機制與 ACME 用戶端。傳統架構需結合 Postfix、Dovecot、Rspamd、帳號資料庫及獨立的憑證工具才能達成相同功能。Stalwart 以單一服務單元與位於 /etc/stalwart/config.json 的單一設定檔取代上述所有組件。
以下所有數據、設定名稱與指令均引用自 Stalwart 的官方文件、發布頁面與安裝腳本,首次查閱時間為 2026 年 8 月 28 日(針對 2026 年 8 月 24 日發布的 v0.16.19 版本),並於 2026 年 10 月 12 日重新核對(當時最新版本為 2026 年 10 月 11 日發布的 v0.16.26)。這些指令供您在自己的伺服器上執行。每個指令後均附有驗證方式,以確認執行結果。
Stalwart 採用 GNU Affero General Public License v3.0 (AGPL-3.0) 與 Stalwart Enterprise License v2 雙重授權。部分功能僅限企業版使用。文件中的 HTTP 端點清單會以 /scim/v2/* 標示此類功能。在規劃部署涉及您尚未實際測試的功能時,請務必先閱讀授權條款。
單一執行檔確實減少了移動組件的數量。但這並不代表決定郵件能否送達的兩項關鍵因素會因此改變。
連接埠 25 與 DNS 信譽度與您執行的軟體無關
對外 TCP 連接埠 25 是第一道關卡。許多 VPS 提供商預設會在新帳號上封鎖此埠,而連接埠 25 若被封鎖,代表您的伺服器無法直接將郵件傳送給其他人的郵件伺服器。在安裝任何軟體前,請先進行測試。
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 alt1.aspmx.l.google.com 25若連線正常,Connection to alt1.aspmx.l.google.com ... 25 port [tcp/smtp] succeeded! 會在大約一秒內顯示。若遭到封鎖,則會出現兩種情況。如果封包在上游被丟棄,系統不會回傳重設訊號,因此 nc 會掛起五秒後才顯示 nc: connect to alt1.aspmx.l.google.com port 25 (tcp) failed: Connection timed out。如果防火牆直接拒絕連線,則會回傳 ICMP 錯誤(netfilter 的 reject 預設會回傳連接埠無法連線,除非另有設定,例如管理員禁止),此時失敗訊息會立即回傳,通常顯示為 Connection refused 或 No route to host。無論哪種情況,請向您的提供商提交支援工單。
如果提供商拒絕開放,唯一的解決方案是使用轉送(relay)。Stalwart 可透過 Relay 路由將所有外寄郵件交給 smarthost,其連接埠預設為 25,但可接受 1 到 65535 之間的任何數值,並具備 implicitTls 開關,以及用於 465 或 587 埠驗證轉送的 authUsername 與 authSecret 欄位。此時您的郵件將使用轉送伺服器的信譽度發送,而非您自己的。
第二道關卡是接收端網路如何看待您的 IP 位址與網域名稱。這涉及 IP 的反向 DNS、SPF、DKIM、DMARC,以及您所屬 IP 位址區段的發送歷史。根據我們在 2026 年 8 月 28 日閱讀的內容,Stalwart 的 DNS 設定頁面明確指出這些工作的位置:反向 DNS 記錄「通常由託管提供商設定,而非 Stalwart 本身」。此類別中的其他項目亦同。這些設定存在於您的 DNS 區域與提供商的控制面板中,而非郵件伺服器內。
因此,本頁面不再重複說明這些記錄。我們有另一篇專門介紹的文章:SPF、DKIM 與 DMARC:為所有郵件發送來源進行一次性設定。如果您尚未決定是否要自行架設郵件伺服器,請先參考 我們對自架郵件是否仍具價值的誠實分析。選擇 Stalwart 並不會改變上述任何評估條件。
小型 VPS 執行 Stalwart 郵件伺服器的需求
根據 2026 年 10 月 12 日查閱的 Stalwart 系統需求頁面,其數據如下。閒置時的記憶體用量約為 100 MB。對於 5 到 10 位使用者的小型部署,1 GB RAM 已足夠。低流量且約 5 位使用者的環境可在單核心 CPU 上執行;該頁面並補充:「隨著併發量與活動增加,需要更多 CPU 核心以維持低延遲與高吞吐量」。預設的併發連線上限為 8,192 個,涵蓋所有服務,且可自行設定。
該頁面未註明最小磁碟空間,因此請根據預期儲存的郵件量規劃磁碟大小,並預留空間供儲存區進行壓縮(compact)。
必須確保三條對外連線路徑暢通,否則伺服器會出現與郵件無關的故障現象。伺服器需從 https://github.com/stalwartlabs/webui/releases/latest/ 取得網頁介面套件;需連線至 https://acme-v02.api.letsencrypt.org/directory 取得憑證;並需透過 UDP 與 TCP 53 埠進行 DNS 查詢,以處理 MX 與驗證記錄。若出口防火牆設定過於嚴格而阻擋了第一項連線,將導致郵件伺服器雖已啟動,卻無法使用管理介面。
安裝指定版本,而非「latest」
官方安裝程式是一個 shell script。執行前請先閱讀內容。
curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
less install.sh
sudo sh install.sh於 2026 年 10 月 12 日閱讀該 script,可明確得知其運作方式。它會建立一個 stalwart 服務帳號及其所需的目錄。接著從 https://github.com/stalwartlabs/stalwart/releases/latest/download 下載檔案。二進位檔會放置於 /usr/local/bin/stalwart,權限為 0755。設定檔存於 /etc/stalwart/config.json,資料存於 /var/lib/stalwart,日誌存於 /var/log/stalwart,這三個目錄的權限皆為 0750,並由 stalwart 擁有。環境變數檔案會寫入 /etc/stalwart/stalwart.env,權限為 0640,由 root:stalwart 擁有。該 script 接受一個選用的安裝前綴以及一個用於 FoundationDB 建置的 --fdb 旗標。它不接受版本參數。
最後一點至關重要。該 script 總是拉取最新版本,因此相隔一週建立的兩台伺服器,執行的程式碼並不相同。請在安裝後自行鎖定二進位檔版本,這也是 v0.16.26 發行說明中建議的升級路徑:「若您正從 v0.16.x 升級,請替換二進位檔(或執行 docker pull)。」在 2026 年 8 月 24 日至 10 月 11 日之間發布了 7 個修補版本,其中包含多項安全性修正,因此請鎖定最新版本,並在有計畫的情況下進行版本變更。
STALWART_TAG=v0.16.26
curl -fsSLO "https://github.com/stalwartlabs/stalwart/releases/download/${STALWART_TAG}/stalwart-x86_64-unknown-linux-gnu.tar.gz"
tar zxf stalwart-x86_64-unknown-linux-gnu.tar.gz
sudo systemctl stop stalwart
sudo install -m 0755 -o root -g root stalwart /usr/local/bin/stalwart
sudo systemctl start stalwart
systemctl is-active stalwartsystemctl is-active stalwart 應輸出 active。若輸出其他內容,請參閱 journalctl -u stalwart -n 50。每個發行資產皆附帶對應的 .sigstore.json 套件,因此在安裝前即可驗證下載檔案的簽章。
該 script 寫入的 unit 檔案會以 User=stalwart 身分執行,並設定 AmbientCapabilities=CAP_NET_BIND_SERVICE。此權限即為非特權帳號能綁定 25、443、465 與 993 埠的原因。若您日後自行編寫 unit 檔案並遺漏該行設定,服務將無法啟動,因為一般使用者無法綁定 1024 以下的埠。
初始管理員密碼的輸出位置
Stalwart 會以引導模式(bootstrap mode)啟動,並將一組 16 字元的臨時密碼寫入服務日誌中,僅此一次。
sudo journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'設定精靈會監聽 8080 埠的純 HTTP 請求,請勿將此埠暴露於公開網路。建議改用 SSH 通道從您的筆記型電腦進行連線:
ssh -N -L 8080:127.0.0.1:8080 you@your-vps接著開啟 http://127.0.0.1:8080/admin 並以 admin 帳號登入,密碼請使用日誌中顯示的內容。精靈將會詢問伺服器主機名稱、預設郵件網域、TLS、儲存空間、帳號目錄、日誌記錄及 DNS 處理方式。完成後請重新啟動服務,之後即可使用 https://<your-host>/admin 進行操作。
若密碼已從日誌中被洗掉,請改為設定固定密碼。/etc/stalwart/stalwart.env 檔案中已預留相關的註解項目,包含 STALWART_RECOVERY_ADMIN=admin:changeme、STALWART_RECOVERY_MODE=true 與 STALWART_RECOVERY_MODE_PORT(預設為 8080)。請取消註解、重新啟動服務、登入,完成後再將該項目重新註解。Stalwart 的安全性強化頁面建議將此憑證僅保留於緊急情況使用,且切勿使用管理員帳號登入 IMAP、JMAP 或 WebDAV。
該頁面同時列出了應保留的監聽埠:用於接收 SMTP 的 25 埠、用於隱式 TLS 提交(submission)的 465 埠、用於 IMAPS 的 993 埠,以及用於所有 HTTP 流量的 443 埠。頁面中將 587、143、4190、110、995 及 8080 視為非必要埠,並建議在設定完成後關閉 8080 埠。
使用固定標籤在 Docker 中執行
文件記載的映像檔為 stalwartlabs/stalwart。截至 2026 年 10 月 12 日,Docker Hub 上除了 v0.16.26 標籤外,還有 -alpine 變體。Stalwart 的 Docker 頁面建議生產環境使用 v0.16 次要版本標籤。基於與上述二進位檔相同的理由,請鎖定修補程式版本。
services:
stalwart:
image: stalwartlabs/stalwart:v0.16.26
container_name: stalwart
restart: unless-stopped
ports:
- "25:25"
- "465:465"
- "993:993"
- "443:443"
- "127.0.0.1:8080:8080"
volumes:
- stalwart-etc:/etc/stalwart
- stalwart-data:/var/lib/stalwart
volumes:
stalwart-etc:
stalwart-data:該檔案是文件記載的 docker run 指令之 Compose 版本,已移除不必要的監聽器,並將設定埠綁定至 localhost。啟動後,請讀取相同的引導(bootstrap)行:
docker compose up -d
docker compose logs stalwart 2>&1 | grep -A8 'bootstrap mode'Docker 頁面亦記載了 -e STALWART_RECOVERY_ADMIN=admin:mySecretPass 作為啟動時設定固定憑證的方法,若您偏好此方式而非讀取日誌,可使用 Compose 的 environment: 金鑰。
完整的文件記載埠列表,以及為何此檔案較短
Stalwart 的 Docker 頁面發布了 443、8080、25、587、465、143、993、110、995 與 4190 埠。其強化安全頁面將 587、143、110、995 與 4190 列為非必要,並建議在設定完成後停用 8080。請僅加入您客戶端實際需要的埠。若手機堅持使用 STARTTLS 提交,請發布 587。若您的使用者透過桌面客戶端編寫 Sieve 規則,請發布 4190。
若您不熟悉 Compose,我們的 VPS Docker Compose 實作指南 涵蓋了此處使用的檔案配置與命名磁碟區模型。針對郵件伺服器特別提醒一點:Docker 會透過寫入自身的防火牆規則來發布埠,且這些規則的優先順序高於 ufw,因此 ufw deny 8080 無法關閉 Compose 所發布的埠。在埠映射中綁定至 127.0.0.1 才是真正關閉埠的方法,這也是上述檔案採取此做法,且 SSH 通道依然適用的原因。
不使用 certbot 的 TLS 及其代價
Stalwart 直接實作了 ACME (automatic certificate management environment),因此不需要 certbot,也不需要續期掛鉤 (renewal hook)。說明文件列出了四種驗證方法。HTTP-01 會在 80 埠回應挑戰請求。TLS-ALPN-01 會在 443 埠使用 ACME 專用的 ALPN 協定來呈現專門建立的憑證。DNS-01 透過發布臨時 TXT 記錄進行驗證,是兩種能簽發萬用字元憑證的方法之一。DNS-PERSIST-01 則使用長效的授權 TXT 記錄,而非每次續期時都寫入新的記錄。
其代價在於 Stalwart 必須掌控 TLS 交握 (handshake)。TLS-ALPN-01 是透過自行完成交握來運作,因此若後方有負責 TLS termination 的反向代理,此方法將無法成功。若該伺服器上的 nginx 或 Caddy 已佔用 443 埠,您有三種解決方案。Stalwart 官方的 nginx 指南建議將 nginx 設定為 TCP passthrough,並使用 listen 443; proxy_pass 127.0.0.1:10443; proxy_protocol on;,讓 TLS 連線能未經更動地傳遞至 Stalwart。這會將 443 埠上的所有連線交由 Stalwart 處理,因此適用於該埠口未提供其他服務的伺服器。否則,請將 Stalwart 改為使用 DNS-01 或 HTTP-01,或是為其配置獨立的 IP 位址。
DANE 與 MTA-STS 以及您應了解的預設值
兩者皆透過網頁介面中的 Settings、MTA、Outbound、TLS Strategies,針對 MtaTlsStrategy 物件的 TLS 策略進行設定。dane 欄位預設為 optional,當收件者發布 TLSA 記錄時,系統會嘗試進行 DANE 驗證,若無則退回至一般的 STARTTLS。若設為 require,則僅在 TLSA 記錄可驗證時才會進行傳送。mtaSts 欄位的行為相同,預設值為 optional。相關的逾時設定為 tlsTimeout(預設 3 分鐘)與 mtaStsTimeout(預設 5 分鐘)。
在入站方面,Stalwart 可在 https://mta-sts.<domain>/.well-known/mta-sts.txt 發布您自己的 MTA-STS 政策,這需要開啟 443 埠。MtaSts 單例物件包含 mode(預設 testing)、maxAge(預設 7 天)以及 mxHosts(若留空,則退回至 TLS 憑證中的主機名稱)。您需要提供兩筆 DNS 記錄:指向郵件主機的 mta-sts CNAME,以及包含政策識別碼的 _mta-sts TXT 記錄。
dig +short TXT _mta-sts.example.org
curl -s https://mta-sts.example.org/.well-known/mta-sts.txtTXT 查詢應回傳 v=STSv1; id=... 字串,而 curl 應回傳政策內容。若 curl 未回傳任何內容,則代表 443 埠已關閉,或是 mta-sts.example.org 的憑證從未簽發。
在上述兩項檢查通過前,請將 mode 保持在 testing。若在 enforce 模式下政策設定錯誤或憑證失效,將導致其他伺服器無法投遞郵件給您,且您將會從使用者端而非日誌中得知此問題。DANE 也有類似的陷阱:它要求 DNSSEC 簽署的區域,且每次 ACME 更新憑證時,必須重新發布鎖定葉憑證(leaf certificate)的 TLSA 記錄。請改為鎖定簽發的 CA,或是接受每次更新憑證的繁瑣作業。
靜態加密並非端對端加密
這是最常被誤解的功能,以下說明文件中的確切定義。每位使用者的純文字郵件在寫入磁碟前,會自動使用其 OpenPGP 或 S/MIME 憑證進行加密。encryptAtRest 預設為啟用,適用於透過 SMTP 或 LMTP 傳入的郵件,前提是收件者已註冊加密金鑰。encryptOnAppend 預設為 false,「這會讓附加的郵件保持原樣,以便用戶端能完全掌控其儲存的內容」。OpenPGP 使用 PGP/MIME 而非較舊的 PGP/Inline,並採用 AES-256 或 AES-128。Stalwart 不會產生金鑰:使用者需匯出 ASCII-armored 公開金鑰,並將其註冊為 Account 下的 PublicKey 物件(Public Keys)。
因此,此功能可保護遭竊的磁碟映像檔、遭竊的備份,以及郵件送達後管理員讀取儲存空間的情況。若無私密金鑰,儲存的位元組將無法讀取,管理員也無法解密。
此功能無法保護傳輸中的郵件。郵件在網際網路上傳輸時,取決於兩台伺服器協商的 TLS 版本;郵件抵達時為純文字,Stalwart 隨即進行加密。寄件者、寄件者的服務供應商以及任何移除 TLS 的節點,皆已看過純文字內容。
另有三項限制值得明確說明。您的「寄件備份」與「草稿」資料夾是由您的用戶端寫入,這屬於附加操作,且 encryptOnAppend 預設為 false,因此除非您更改設定,否則這些郵件將以明文儲存。我在 2026 年 10 月 12 日重新閱讀的文件僅描述郵件內容,並未說明信封資料、標頭或索引項目會被加密,請勿假設它們已加密。文件亦未說明在您上傳金鑰前已儲存的郵件會被重新加密,請假設它們不會被加密並自行檢查。全文檢索是否仍能對加密後的郵件內文運作,文件中亦未提及。在向任何人承諾此功能前,請先在測試帳號上進行驗證。
此外,若使用者遺失私密金鑰,其郵件將永久遺失。基於設計,此系統不提供任何復原途徑。
WKD 是網頁伺服器的工作,而非郵件伺服器的工作
WKD (Web Key Directory) 是 OpenPGP 機制中的另一半,它解決了不同的問題。它將您的公開金鑰發布在網域下的一個固定 HTTPS URL,讓寄件者的郵件用戶端能在郵件離開其機器前,自動搜尋並加密訊息。這屬於端對端加密。Stalwart 的靜態加密 (at-rest encryption) 則是針對儲存在磁碟上的副本。設定其中一項並不會自動獲得另一項的功能。
Stalwart 不提供 WKD 服務。根據 2026 年 10 月 12 日查閱的說明文件,其 HTTP 端點僅列出 jmap、caldav、carddav、oauth-authorization-server、openid-configuration、acme-challenge、mta-sts.txt、mail-v1.xml 與自動設定的標準路徑。其中並無 openpgpkey 路徑。請使用一般的靜態網頁伺服器來提供此服務。
該規範定義了兩種配置方式。進階方法使用 https://openpgpkey.example.org/.well-known/openpgpkey/example.org/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe,直接方法則使用 https://example.org/.well-known/openpgpkey/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe。該 32 字元字串是將本地端名稱轉為小寫後,經由 SHA-1 雜湊並以 z-base-32 編碼而成,這也是為什麼您不應手動建立這些檔名的原因。請使用 GnuPG 為您產生。
gpg --export --armor you@example.org > you.asc
gpg-wks-client --print-wkd-url you@example.org
gpg-wks-client --install-key you.asc you@example.org--print-wkd-url 會列印出用戶端將擷取的 URL(使用子網域格式)。--install-key 會將金鑰寫入一個鏡像 WKD 配置的本地目錄樹,預設位於名為 openpgpkey 的頂層目錄下,您可透過 -C dir 進行變更。將該目錄樹複製到您的網頁根目錄,並在 hu 目錄旁新增必要的 policy 檔案(空檔案即可),最後使用 curl 擷取您自己的 URL,以確認其回傳的是金鑰位元組而非 404 錯誤。
單一 VPS 上的儲存配置
Stalwart 將儲存角色分為四類:用於郵件信箱狀態等結構化記錄的資料儲存(data store)、用於原始郵件內容與附件的二進位物件儲存(blob store)、用於全文檢索索引的搜尋儲存(search store),以及用於速率限制器、驗證權杖與工作階段資料的記憶體內儲存(in-memory store)。每一項皆可指向不同的後端。支援的後端包括 RocksDB、FoundationDB、PostgreSQL、MySQL、SQLite、相容 S3 的物件儲存、Azure Blob Storage、Redis、ElasticSearch 與 Meilisearch。
在單一 VPS 上,解決方案很簡單。官方文件稱 RocksDB 為「Stalwart 單節點安裝的推薦後端,因其速度與可靠性」。Redis 僅支援作為記憶體內儲存,不能作為資料儲存或二進位物件儲存,因此開始使用時無需額外部署 Redis 容器。若未來信箱容量超過磁碟空間,可再將二進位物件儲存遷移至 S3。
備份方式取決於後端。對於外部資料庫,請使用該資料庫專屬的備份程序。對於內嵌式資料庫,FAQ 指出應複製 /var/lib/stalwart 目錄。請在服務停止時執行此操作,或透過檔案系統或磁碟區快照進行。若在鍵值儲存執行期間進行檔案層級複製,可能會擷取到寫入中的狀態,導致備份損毀,且直到嘗試還原時才會發現。
取代 Rspamd 的垃圾郵件過濾器
過濾程序在同一處理程序內執行,因此無需額外維護另一個 daemon。分類器設定位於 SpamClassifier 單例(singleton)下的「設定」>「垃圾郵件過濾器」>「分類器」。它採用具備特徵雜湊(feature hashing)的 FTRL-Proximal 演算法。FtrlFh 是大多數部署環境建議使用的預設值。FtrlCcfh 則改用布穀鳥雜湊(cuckoo feature hashing)以減少雜湊碰撞,適用於大規模部署。它會持續進行訓練:當使用者將郵件標記為垃圾郵件或正常郵件時,該標籤會直接回饋至未來的決策中。
分類器周邊整合了 DNS 黑名單、灰名單(greylisting)、網路釣魚偵測、垃圾郵件陷阱與 Pyzor;若您有無法捨棄的規則,亦可選擇透過 milter 呼叫 SpamAssassin。
為何 mailcow 仍然是合適的選擇
Stalwart 沒有內建網頁郵件(webmail)。這是目前最大的功能缺口,且差距顯著。根據 2026 年 10 月 12 日查閱的 mailcow 文件,其包含 16 個組件,其中 SOGo 能直接為使用者提供瀏覽器收件匣,以及 CalDAV 與 CardDAV 介面。Stalwart 於 2025 年 6 月 20 日發布的發展藍圖指出,內建網頁郵件「在我們的計畫中,但目前並非首要任務」,預計在 1.0 版本後使用 Rust 與 Dioxus 開發,「最有可能在 2026 年的某個時間點」。截至 2026 年 10 月 12 日,專案部落格尚未發布相關公告。因此,若選擇 Stalwart,您必須自行部署 Roundcube,或要求每位使用者自行設定郵件客戶端。
Stalwart 確實具備網頁管理介面,因此這並非大眾所預期的缺口。第二個缺口是版本的成熟度。FAQ 指出 Stalwart 仍處於 0.x 階段,資料佈局與設定檔在 v1.0 之前可能會變更,這可能需要進行遷移。該專案在 2026 年 6 月發布的文章標題為「零待處理錯誤報告:邁向 Stalwart 1.0 之路」,這說明了目前的進度:即將完成,但尚未達標。截至 2026 年 10 月 12 日,最新版本仍為 v0.16.26。
第三個缺口是功能清單中鮮少提及的部分。Postfix、Dovecot 與 Rspamd 擁有長達十年的技術支援與社群解答。在凌晨兩點,當郵件堆積且使用者等待處理時,搜尋到相符的錯誤訊息遠比優雅的架構更有價值。若您正處於這種情況,我們的 mailcow 安裝指南涵蓋了整個堆疊的端到端流程,這能讓您更早結束排解問題的夜晚。
當您需要單一執行檔、單一設定檔與 JMAP 支援,且願意嘗試新技術時,請選擇 Stalwart。當您需要現成的網頁郵件功能以及龐大的既有技術資源時,請選擇 mailcow。
遷移現有郵件
通用的遷移路徑是透過 imapsync 進行 IMAP 對 IMAP 的傳輸,此工具不限制兩端的軟體類型。請務必先執行測試運作(dry run)。
imapsync --dry \
--host1 old.example.org --user1 you@example.org --passfile1 /root/.old.pw \
--host2 mail.example.org --user2 you@example.org --passfile2 /root/.new.pw--dry 參數會讓 imapsync「僅模擬執行而不實際變更;僅輸出預計執行的動作」,因此在移除此旗標前,請先閱讀輸出內容。每個密碼檔案的第一行皆存放密碼,請在遷移完成後 chmod 600 兩者並將其刪除。
Stalwart 亦提供較新的工具,多數第三方指南尚未更新相關資訊。其官方部落格記錄了 JMAP 匯入與匯出工具 Vandelay(2026 年 5 月 29 日),以及用於零停機升級的遷移代理(2026 年 6 月 10 日)。在規劃大規模遷移前,請先閱讀上述兩篇文件,因為它們比目前網路上能找到的絕大多數資料都更為新穎。
故障模式與您會看到的字串
管理介面無法載入。 FAQ 直接點出了這個問題:網頁介面套件在首次執行時會從 GitHub 下載,因此若伺服器無法對 github.com 發起對外 HTTPS 連線,服務雖然會啟動,但所有網頁介面路由都會回傳 404。請從伺服器端使用 curl -sI https://github.com/stalwartlabs/webui/releases/latest/ 進行檢查。FAQ 列出的其他常見原因包括 HTTP 或 HTTPS 配置不符,以及反向代理未轉發客戶端 IP。
日誌中沒有引導密碼(bootstrap password)。 該密碼僅在引導模式啟動時列印一次。若服務在此之後已重啟,請使用 sudo journalctl -u stalwart --since today | grep -A8 'bootstrap mode' 擴大檢視範圍。若密碼確實遺失,請在 /etc/stalwart/stalwart.env 中設定 STALWART_RECOVERY_ADMIN 並重啟服務。
透過本地代理轉發被拒絕。 v0.16.19 版本說明記錄了一項修復,解決了轉發路由被 host resolves loopback address 拒絕的問題。若您遇到該字串,代表您正在執行舊版本。請鎖定(pin)至該版本或更新版本,勿嘗試繞過此問題。
自行編寫 unit 檔案後服務無法啟動。 若缺少 AmbientCapabilities=CAP_NET_BIND_SERVICE,stalwart 使用者將無法綁定 25、443、465 或 993 埠,導致啟動時在第一個監聽器處失敗。請從安裝程式產生的 unit 檔案中複製 capability 設定行。
憑證無法核發。 HTTP-01 需要 80 埠可達且未被佔用。TLS-ALPN-01 需要 Stalwart 本身在 443 埠回應 TLS 握手。若伺服器上其他程式佔用了任一埠,ACME 將會持續靜默失敗,而其他服務看起來卻一切正常。
FAQ
Stalwart 能否在同一台 VPS 上取代 Postfix、Dovecot 和 Rspamd?
可以。單一 Rust 二進位檔即可處理 SMTP、IMAP、POP3、JMAP、CalDAV、CardDAV 和 WebDAV,並包含垃圾郵件過濾器、郵件儲存庫及 ACME 客戶端。系統中僅需一個 systemd unit 和一個位於 /etc/stalwart/config.json 的設定檔,而非四個守護行程及其整合配置。它無法取代的是您的 DNS 區域設定或供應商對 25 埠的政策,這才是自架郵件伺服器成敗的關鍵。
Stalwart 郵件伺服器需要多少記憶體?
根據 2026 年 10 月 12 日查閱的 Stalwart 系統需求頁面,閒置時約需 100 MB,並建議 1 GB 記憶體適用於 5 到 10 位使用者的小型部署。約 5 位使用者的低流量配置可在單核心 CPU 上執行。所有服務的預設連線上限為 8,192 個並發連線且可調整,因此上限隨連線數與郵件量增加,而非僅取決於使用者數量。官方未發布最小磁碟空間要求,請根據您保留的郵件量規劃磁碟大小。
切換到 Stalwart 能否改善電子郵件的送達率?
不能。送達率取決於您的 VPS 是否開放對外 TCP 25 埠、IP 的反向 DNS 設定,以及網域的 SPF、DKIM 和 DMARC 設定。Stalwart 確實支援 DANE、MTA-STS 和 SMTP TLS 報告,並能為您發布 MTA-STS 政策,但這些僅規範傳輸安全性,而非接收端網路是否信任您的位址。安裝任何軟體前,請先使用 nc -vz -w 5 alt1.aspmx.l.google.com 25 測試 25 埠。
Stalwart 是否包含網頁郵件(webmail)?
截至 2026 年 10 月 12 日尚未包含。它提供的是網頁管理介面,兩者功能不同。該專案 2025 年 6 月 20 日的開發路線圖文章指出,計畫在 1.0 版本後推出以 Rust 和 Dioxus 構建的網頁郵件客戶端,預計「最有可能在 2026 年某個時間點」推出,且專案部落格目前尚未發布相關公告。若您的使用者現在就需要瀏覽器收件匣,請額外部署 Roundcube 或使用整合 SOGo 的軟體堆疊。
Stalwart 的靜態加密(encryption at rest)能防護什麼?
它會在將訊息寫入磁碟前,使用每位使用者的 OpenPGP 或 S/MIME 公鑰進行加密,因此即使磁碟或備份遭竊,或管理員讀取儲存庫,也無法還原內容。這並非端對端加密:訊息以明文抵達並在遞送時加密,因此在抵達前的每一跳(hop)都能看到內容。encryptOnAppend 預設為 false,因此除非您手動更改,否則客戶端寫入的「寄件備份」與「草稿」將保持明文。文件僅涵蓋訊息內容,未提及元數據(metadata)、索引條目或對金鑰上傳前已儲存郵件的重新加密,請務必自行驗證,切勿預設其具備上述功能。