← 返回上一頁
Linux/Unix mail

Stalwart 1.0 郵件伺服器:SMTP、IMAP、JMAP 一個執行檔跑完

本頁目錄
文章資訊
  • 適用讀者:自己管郵件伺服器的人、想把 Postfix + Dovecot 那一整串換掉的人,以及在評估 JMAP 的人
  • 測試版本:Stalwart v1.0.1(映像 stalwartlabs/stalwart:v1.0.1,354MB)
  • 測試環境:Rocky Linux 9.4、3.6GB RAM、Podman 5.4.0(rootful)
  • 資訊截至:2026-10-29(台北時間)

這次實測最先卡住我的不是憑證,而是登入:精靈跑完、容器重啟後,WebUI 只肯在「https://伺服器主機名稱」上讓人登入,而我為了避開主機上的 443,把容器的 HTTPS 轉到 18443。登入頁正常,送出密碼後瀏覽器被導回 https://mail.wplab.test/,直接 ERR_CONNECTION_REFUSED。官方文件其實有寫這個情況,我先前讀過卻沒當一回事,被擋了一次才回頭對照。

Stalwart 是 Rust 寫的郵件伺服器,SMTP 收發、IMAP、POP3、JMAP、ManageSieve、垃圾信過濾、DKIM 簽章、CalDAV 與 CardDAV 都在同一個執行檔,管理介面是它自己下載的 WebUI。GitHub 上約 15,000 顆星,這兩天也出現在 Trending 的 Rust 榜。10 月 26 日釋出 v1.0.0,10 月 28 日接著釋出 v1.0.1。

我的看法是:新建一台小型郵件伺服器,Stalwart 1.0 已經可以直接拿來試,一個容器、145MB 記憶體就把收發信、搜尋與監控接起來;但如果你手上是 0.16 以前的實例,這次升級要走遷移工具,先排一個維護窗口,不要想著換個映像標籤就好。

下面是我在內部測試機上的紀錄:容器怎麼起、精靈每一步填什麼、寄收信與附件搜尋的結果、新的 Prometheus 輸出、DNS 記錄長什麼樣,最後是升級與取捨。有些東西我沒測到,會在對應段落講清楚。

重點摘要
  • 單一容器、五個精靈步驟,就能從空白到可以用 SMTP 提交與 IMAP 收信;閒置時 podman stats 顯示 145MB,資料目錄約 77MB。
  • 收到的信會同時被 Ed25519 與 RSA 兩把 DKIM 金鑰簽章;IMAP 的 SEARCH TEXT 找得到 docx 附件裡的字,SEARCH BODY 找不到。
  • 1.0.1 的 Prometheus 與 OTLP 輸出換了新實作,指標名稱變成 stalwart_*_total 這種慣例寫法,舊儀表板與告警要重寫;打開輸出後我得重啟容器才會生效。
  • 1.0 的資料庫佈局重做,0.16 的資料不能原地升級,要用官方的 stalwart-migrate 另開一個空的 1.0 資料庫再複製。
  • 這次沒測:外部真實投遞、自動 DNS 與 ACME、叢集、日曆與通訊錄、遷移工具本身。

一、從 0.16 到 1.0.1 只隔了十天

1.0 不是小改版,資料庫格式換了。 這是整篇最值得先講的一件事。官方遷移文件寫得很直接:1.0 打不開 0.16 的資料庫,硬開會停在錯誤訊息,要用 stalwart-migrate 把設定與資料複製到一個全新的 1.0 資料庫。

2026-10-18
v0.16.27
0.16 系列的最後一版,遷移工具要求來源必須是這一版
2026-10-26
v1.0.0
資料庫佈局重做,0.16 不能原地升級
2026-10-28
v1.0.1
換掉遙測輸出的實作,指標名稱改了

v1.0.0 的 release notes 列了一長串新功能:附件裡的 PDF、Office 文件、OpenDocument、EPUB、RTF 都會抽字進全文索引;DKIM2 支援 ML-DSA-44 搭 Ed25519 的複合簽章(後量子);OAuth 加了 client ID metadata documents、每個 client 的 scope 與使用者可管理的「已連線應用程式」;外送 HTTP 請求(webhook、OIDC 探索、DNS 與 AI 供應商)加了 SSRF 保護;單節點部署多了內建的記憶體型存放區。v1.0.1 則把 OpenTelemetry 與 Prometheus 的輸出換成自己的實作,官方寫編碼速度快 4 到 14 倍,同時修了 config.json 用行程 umask 建立(常見是 0644)導致資料庫憑證別的本機使用者讀得到的問題。

我這次沒有 0.16 的實例可以升級,所以遷移工具只讀文件、沒實跑,後面第八節會把文件裡的限制整理出來。

二、架構與定位

Stalwart 把郵件伺服器常見的零件塞進同一個行程,資料只落在兩個目錄。 一般自架的做法是 Postfix 收發、Dovecot 供 IMAP、rspamd 擋垃圾信、opendkim 簽章,再加一套網頁管理,各自有設定檔與帳號來源。Stalwart 全部內建,帳號、網域、DNS 記錄、設定都是同一組 JMAP 物件,WebUI 與我後面用 curl 打的 API 是同一條路。

Stalwart 單一容器的內部分工
圖 1:本次實測的架構。客戶端、瀏覽器、Prometheus 都連同一個容器,資料只落在兩個 volume

/etc/stalwart 只放一個 config.json,內容是資料庫連線資訊,我的只有 122 位元組。其餘設定都存在資料庫裡,所以備份重點是 /var/lib/stalwart。預設的儲存是 RocksDB,單節點不需要另一套資料庫伺服器;要接 PostgreSQL、MySQL 或 FoundationDB 也可以,但官方提醒以後可能成為叢集的話,一開始就要選共享儲存,因為事後換資料庫要做資料遷移。

三、安裝:容器與設定精靈

3.1 拉映像與啟動

映像 354MB,在這台主機上拉完不到十五秒。 官方建議追主版本標籤 v1,我為了讓文章的版本可重現,直接指定 v1.0.1。

dkr — 拉映像
$ sudo podman pull -q docker.io/stalwartlabs/stalwart:v1.0.1
b4d02342a10b348cb3102bf172fc81cdb9cfc550e435b80f13ff1762c0c8137e
$ sudo podman images --format "{{.Repository}}:{{.Tag}} {{.Size}}" | grep stalwart
docker.io/stalwartlabs/stalwart:v1.0.1 354 MB

主機上的 25、443 我不想動,所以全部轉到 18xxx,而且只綁 127.0.0.1。這也是前面登入卡住的源頭:精靈階段用 8080 沒問題,正式運作後 WebUI 只接受主機名稱對應的 HTTPS 位址,換了埠號就會失敗。

dkr — 啟動並看 bootstrap 輸出
$ sudo podman run -d --name wplab-stalwart --init \
    -p 127.0.0.1:18025:25 -p 127.0.0.1:18465:465 -p 127.0.0.1:18993:993 \
    -p 127.0.0.1:18443:443 -p 127.0.0.1:18080:8080 \
    -v wplab-stalwart-etc:/etc/stalwart -v wplab-stalwart-data:/var/lib/stalwart \
    docker.io/stalwartlabs/stalwart:v1.0.1
$ sudo podman logs wplab-stalwart 2>&1 | head -12
Stalwart bootstrap mode - temporary administrator account
   username: admin
   password: ****************
Use these credentials to complete the initial setup at the
/admin web UI. Once setup is done, Stalwart will provision a
permanent administrator and this temporary account will no
longer apply.
WARN Server started in bootstrap mode (server.bootstrap-mode) version = "1.0.1"
INFO Network listener started (network.listen-start) listenerId = "http-recovery", localPort = 8080, tls = false

bootstrap 模式的臨時管理員密碼只印一次,而且每次啟動都會換,只有最新一段有效。官方也給了替代做法:用 STALWART_RECOVERY_ADMIN=admin:<密碼> 把密碼固定下來。

3.2 設定精靈五步

精靈只有兩個必填欄位。 第一步填主機名稱與預設網域,我用 mail.wplab.test 與 wplab.test。ACME 預設開著,內網機器申請不到 Let's Encrypt 憑證,所以我關掉;DKIM 金鑰保持開啟。

設定精靈第一步
圖 2:設定精靈第 1 步(共 5 步)。只有主機名稱與預設網域必填,兩個開關預設都是開的,我把 ACME 關掉,因為這台沒有公開網域
Server Identity 欄位特寫
圖 3:欄位特寫。主機名稱填 mail.wplab.test、網域填 wplab.test;DKIM 簽章金鑰的開關保持開啟

第二步儲存維持預設的 RocksDB,第三步帳號來源維持內部目錄。第四步是容器要注意的地方:預設把 log 寫檔,容器裡沒有 /var/log/stalwart,要改成 Console,podman logs 才看得到東西。「Use ANSI colors」預設也是開的,我沒關,結果貼 log 時一堆 [37m 色碼,後面貼進文章的輸出是我自己過濾掉的。

精靈第四步 Logging
圖 4:第 4 步 Logging。預設是寫檔,容器裡要改成 Console;「Use ANSI colors」預設是開的,所以 podman logs 看到的是帶色碼的字

第五步 DNS 管理我選手動,這台沒有真的網域可以讓它寫記錄。按下 Finish 之後,最後一頁會給 [email protected] 與一組隨機密碼,只顯示這一次,官方也說不會寫進 log。

注意:精靈跑完還要重啟

精靈寫完 config.json 後,伺服器仍然停在 bootstrap 模式,只服務 8080 的精靈。要重啟容器,郵件相關的埠才會開。重啟後 config.json 的權限是 -rw-------,只有 stalwart 這個帳號讀得到,跟 1.0.1 的修正對得上。

dkr — 精靈跑完、重啟
$ sudo podman exec wplab-stalwart ls -la /etc/stalwart
-rw-------. 1 stalwart stalwart 122 Oct 28 23:42 config.json
$ sudo podman restart wplab-stalwart
$ sudo podman logs wplab-stalwart 2>&1 | grep "listener started"
INFO Network listener started (network.listen-start) listenerId = "smtp", localPort = 25, tls = false
INFO Network listener started (network.listen-start) listenerId = "submissions", localPort = 465, tls = true
INFO Network listener started (network.listen-start) listenerId = "imaps", localPort = 993, tls = true
INFO Network listener started (network.listen-start) listenerId = "pop3s", localPort = 995, tls = true
INFO Network listener started (network.listen-start) listenerId = "sieve", localPort = 4190, tls = false
INFO Network listener started (network.listen-start) listenerId = "https", localPort = 443, tls = true
INFO Network listener started (network.listen-start) listenerId = "http", localPort = 8080, tls = false

四、建帳號與寄收信

4.1 UI 與 JMAP 兩種建法

建帳號的表單沒有密碼欄位,這點第一次會愣一下。 要在「Credentials」按 Add item,才會長出 Password 欄位。我在 UI 建了 alice,然後把送出的請求記下來,發現就是一個 x:Account/set,所以第二個帳號 bob 直接用 curl 打 JMAP 建,用管理員帳密做 Basic 認證就能過。

建立使用者的 Credentials 區塊
圖 7:建立使用者表單。沒有密碼欄位,要在 Credentials 按 Add item 才會長出 Password 欄位(內容已遮蔽)
dkr — 用 JMAP 建第二個帳號
$ curl -sk -u '[email protected]:***' https://mail.wplab.test:18443/jmap/ \
    -H 'content-type: application/json' -d @create-bob.json
{"methodResponses":[["x:Account/set",{"accountId":"b","created":{"n":{"id":"d"}}},"s"]],"sessionState":"cdcefeae"}
Accounts 清單
圖 5:Directory › Accounts。三個帳號:精靈建的 admin、我在 UI 建的 alice、用 JMAP 建的 bob
帳號清單特寫
圖 6:清單特寫。UI 與 JMAP 建的帳號在同一份清單,沒有分別

4.2 寄一封、收一封

我在主機上用 Python 的 smtplib 走 465 提交埠、用 imaplib 走 993 收信,兩個都忽略自簽憑證的驗證。alice 寄給 bob,3 秒後 bob 的 INBOX 就有信,X-Spam-Status: No。

dkr — 寄信與收信
$ python3 mailtest.py
EHLO features: ['8bitmime', 'auth', 'binarymime', 'chunking', 'enhancedstatuscodes', 'no-soliciting', 'pipelining', 'requiretls', 'size', 'smtputf8']
send: accepted
login OK
caps ('IMAP4REV2', 'IMAP4REV1', 'ENABLE', 'SASL-IR', 'LITERAL+', 'ID', 'UTF8=ACCEPT', 'AUTH=PLAIN', 'AUTH=OAUTHBEARER', 'AUTH=XOAUTH2')
inbox ids [b'1']
Delivered-To: [email protected]
X-Spam-Status: No
DKIM-Signature: v=1; a=ed25519-sha256; s=v1-ed25519-20261028; d=wplab.test; c=relaxed/relaxed; ...
DKIM-Signature: v=1; a=rsa-sha256; s=v1-rsa-20261028; d=wplab.test; c=relaxed/relaxed; ...
From: [email protected]
To: [email protected]
Subject: wplab hello

有一個細節我原本沒預期:信上有兩條 DKIM-Signature,一條 ed25519-sha256、一條 rsa-sha256,都是精靈替網域產生的金鑰。Ed25519 簽章短,RSA 是給還不認 Ed25519 的接收端用的。IMAP 的能力清單裡有 IMAP4REV2,也有 AUTH=OAUTHBEARER 與 AUTH=XOAUTH2。

五、搜尋、拒收與登入失敗

5.1 附件全文搜尋

SEARCH TEXT 找得到 docx 附件裡的字,SEARCH BODY 找不到。 我自己用 Python 湊了一個只有一行文字的最小 docx(內文「quarterly budget zebraquartz approved」),當附件寄給 bob,等 8 秒再搜。

dkr — IMAP 全文搜尋
(等 8 秒讓索引跑完後搜尋;信箱裡有兩封:#1 純文字 hello、#2 附 budget.docx)
>>> m.search(None, 'TEXT "zebraquartz"')
('OK', [b'2'])
>>> m.search(None, 'BODY "zebraquartz"')
('OK', [b''])
>>> m.search(None, 'TEXT "hello"')
('OK', [b'1'])

這行為跟 IMAP 規格一致:BODY 只看信件本文,TEXT 看整封含附件。重點是附件被抽字了。這個功能不用另外裝搜尋引擎,預設就內建。我只測了 docx,PDF、xlsx 等沒有逐一試。

5.2 不存在的收件人與錯誤密碼

寄給不存在的 [email protected],伺服器在 RCPT 階段就回 550 5.1.1 Mailbox does not exist.,不會先收下再退信。IMAP 登入密碼打錯,回的是 NO [AUTHENTICATIONFAILED],0.48 秒就結束,沒有卡住。這在 0.16.25 的 release notes 裡是個修正項目(失敗的登入以前會回沒有 tag 的 NO,客戶端一直等),我只能說 1.0.1 上看起來是正常的。

dkr — 錯誤收件人與錯誤密碼
$ python3 mailtest2.py
unknown rcpt -> {'[email protected]': (550, b'5.1.1 Mailbox does not exist.')}
bad login -> b'[AUTHENTICATIONFAILED] Authentication failed' 0.48 s

六、監控:1.0.1 換掉的遙測輸出

6.1 打開 Prometheus 輸出

Prometheus 輸出預設是關的,設定改了之後我得重啟容器才生效。 設定在 Settings › Telemetry › Metrics,也可以用 JMAP 直接改 x:Metrics 這個單例物件。我設了 Basic 認證(帳號 prom),改完馬上打 /metrics/prometheus 是 404,重啟後才變 200。

Metrics 設定頁
圖 8:Settings › Telemetry › Metrics。OTLP 與 Prometheus 的設定都集中在這一頁,服務名稱改成這裡的欄位,不再讀 OTEL_* 環境變數
Telemetry 選單特寫
圖 9:Telemetry 選單特寫。Prometheus 是 Metrics 底下的獨立頁籤
dkr — 打開 Prometheus 輸出
$ curl -sk -u '[email protected]:***' https://mail.wplab.test:18443/jmap/ -d @enable-prom.json
{"methodResponses":[["x:Metrics/set",{"accountId":"b","updated":{"singleton":null}},"s"]],"sessionState":"cdcefeae"}
$ curl -sk -u prom:*** -o /dev/null -w '%{http_code}\n' https://mail.wplab.test:18443/metrics/prometheus
404
$ sudo podman restart wplab-stalwart
$ curl -sk -u prom:*** -o /dev/null -w '%{http_code}\n' https://mail.wplab.test:18443/metrics/prometheus
200

6.2 指標長什麼樣

指標名稱用 Prometheus 慣例:counter 以 _total 結尾、單位寫在名稱裡、前綴是 stalwart_。官方在 release notes 特別註明,儀表板與告警規則必須更新,所以從 0.16 過來的人,這一塊會斷。服務名稱、命名空間與資源屬性現在是設定欄位,取代原本的 OTEL_* 環境變數。

dkr — 寄一封信之後的指標
$ curl -sk -u prom:*** https://mail.wplab.test:18443/metrics/prometheus | grep -v '^# HELP'
# TYPE stalwart_auth_success_total counter
stalwart_auth_success_total 2
# TYPE stalwart_delivery_completed_total counter
stalwart_delivery_completed_total 1
# TYPE stalwart_message_ingest_ham_total counter
stalwart_message_ingest_ham_total 1
# TYPE stalwart_smtp_dkim_fail_total counter
stalwart_smtp_dkim_fail_total 1
# TYPE stalwart_server_memory_bytes gauge
stalwart_server_memory_bytes 169381888
# TYPE stalwart_users gauge
stalwart_users 3
# TYPE stalwart_domains gauge
stalwart_domains 1
$ curl -sk -o /dev/null -w 'no-cred %{http_code}\n' https://mail.wplab.test:18443/metrics/prometheus
no-cred 401
$ curl -sk -u prom:bad -o /dev/null -w 'wrong-cred %{http_code}\n' https://mail.wplab.test:18443/metrics/prometheus
wrong-cred 401

有一個數字我沒深究:寄完信後 stalwart_smtp_dkim_fail_total 是 1。這台沒有公開 DNS,我推測是本機投遞時驗證自家簽章查不到公鑰,但這只是推測,沒有去翻 log 確認。如果你上線後看到這個數字一直增加,才值得查。

沒帶帳密與帶錯帳密都是 401,官方文件說明失敗事件記在 debug 層級,一般的 info tracer 不會顯示。

七、DNS 記錄與 DKIM

伺服器會替每個網域算好整份 DNS 記錄。 手動模式下要自己複製到 DNS 供應商,可以從 WebUI 的 View Zone File 看,也可以讀網域物件的 dnsZoneFile 欄位。我讀出來的內容節錄如下。

dkr — 伺服器替網域算好的 DNS 記錄(節錄)
$ curl -sk -u '[email protected]:***' https://mail.wplab.test:18443/jmap/ -d '{"methodCalls":[["x:Domain/get",{"accountId":"b","ids":["b"],"properties":["name","dnsZoneFile"]},"g"]]}'
v1-ed25519-20261028._domainkey.wplab.test. IN TXT "v=DKIM1; k=ed25519; h=sha256; p=N0D/Xbk+YK+/MZwsJHQ+QTo+qO6rQ9smj20w5zHvEBQ="
v1-rsa-20261028._domainkey.wplab.test. IN TXT ( "v=DKIM1; k=rsa; h=sha256; p=MIIBIjANBgkq..." )
mail.wplab.test. IN TXT "v=spf1 a -all"
wplab.test. IN TXT "v=spf1 mx -all"
wplab.test. IN MX 10 mail.wplab.test.
_dmarc.wplab.test. IN TXT "v=DMARC1; p=reject; rua=mailto:[email protected]"
_imaps._tcp.wplab.test. IN SRV 0 1 993 mail.wplab.test.
_submissions._tcp.wplab.test. IN SRV 0 1 465 mail.wplab.test.
_mta-sts.wplab.test. IN TXT "v=STSv1; id=620384299469475471"
autoconfig.wplab.test. IN CNAME mail.wplab.test.
autodiscover.wplab.test. IN CNAME mail.wplab.test.

兩個地方要留意。DMARC 預設是 p=reject,對新網域算嚴格,上線初期先收 rua 報告、看有沒有誤擋自己寄的信,可以把 policy 暫時降到 none 或 quarantine。另一個是官方提到,手動 DNS 模式下伺服器無法替新金鑰發布記錄,所以 DKIM 金鑰不會自動輪替;要輪替就得選支援的 DNS 供應商,讓它自己寫記錄。

這一節我只確認了「記錄長什麼樣」,沒有真的把它們發布到公開 DNS,也沒有對外部郵件服務投遞,所以信會不會被 Gmail 或 Outlook 收進垃圾桶,這篇答不了。

八、升級與破壞性變更

升級這件事要分三種情況看。 官方把路徑講得很清楚,我整理成表。

你現在的版本 升級到 1.0.x 的做法 備註
0.16.27 用 stalwart-migrate 複製到全新的 1.0 資料庫 來源必須是 0.16.27,更早的 0.16 要先升到這版
0.15 以下 先照 0.16 的升級文件,再走上一列 文件另有說明
1.0.0 換映像到 1.0.1 OAuth 同意畫面行為改了,叢集要先把所有節點升完,才能依賴新的登入流程

遷移工具的做法是複製:先在 0.16 還在服務時跑第一輪,之後可重複增量,最後停掉 0.16 跑一次 run --final,停機只有最後這一段。官方說明使用者感覺不大,因為 IMAP UID、UIDVALIDITY 與 JMAP 的變更歷史都保留;仍然可見的影響是 OAuth token 不遷移(要重新登入)、CalDAV 與 CardDAV 客戶端會重抓一次、全文索引要在 1.0 啟動後重建,重建完成前搜尋結果不完整。

1.0.1 內部還有幾個行為變更要記得:JMAP 以 $draft 關鍵字附加的信,在靜態加密開啟時不再加密;Sent 副本也是未加密;註冊表列出已連線應用程式、公鑰、遮蔽地址等物件時,管理員也只看到指定帳號的資料,要看別人的要明確帶 accountId。

九、對比與取捨

單一執行檔的好處是你只要顧一個東西,壞處是也只有一個東西能出問題。 跟傳統組合比一下:

項目 Stalwart 1.0.1 Postfix + Dovecot + rspamd
行程數量(本次實測) 1 個容器 至少 3 套服務各自設定
IMAP / JMAP 同一套帳號 ✅ ⚠️ JMAP 需另外的伺服器
附件全文搜尋 ✅ 內建 ⚠️ 要另外接 Solr、Xapian 等外掛
設定方式 WebUI 與 JMAP 物件 各自的文字設定檔
運維經驗與周邊文章 ❌ 1.0 剛出,資料少 ✅ 二十年累積
0.16 以前的資料 ⚠️ 要走遷移工具 —

限制與沒解決的問題我整理三點。第一,啟動時會從 GitHub 下載 WebUI 與垃圾信規則,主機要能連外 HTTPS,否則 /admin 會是 404,這在受限網段要預先處理(官方有說明如何自行託管 WebUI)。第二,1.0 才剛出,網路上的踩雷經驗與第三方整合文章少,我這次被導向 443 的問題,就是靠官方文件才找到答案。第三,我只在單節點驗證,叢集、外部目錄(LDAP、OIDC)與外部 DNS 自動管理都沒測。

十、實務建議

適合的場景:想用一台小機器跑自己或小團隊的郵件、想要原生 JMAP、想把附件搜尋與 Prometheus 監控一起拿到,而且願意先看過文件再動手的人。

不太適合的場景:手上已經有穩定運作的 Postfix + Dovecot,而且沒有搜尋與 JMAP 需求;或者有 0.16 實例但沒有維護窗口去做遷移。

如果要試,我會這樣排:

  1. 先在隔離網段起一個 `v1.0.1`,用精靈走完,確認 25、465、993 都能連。
  2. 把容器日誌改 Console,並關掉 ANSI 色碼,方便接 log 系統。
  3. 打開 Prometheus 輸出並加 Basic 認證,用 `stalwart_*_total` 重做儀表板。
  4. DNS 先用手動模式把記錄發布出去,DMARC 先放寬,觀察一週報告再收緊。
  5. 0.16 的實例先升到 0.16.27,再依官方遷移文件排演一次 `stalwart-migrate`,別第一次就在正式資料上跑。

十一、結論

我的判斷是:Stalwart 1.0.1 在單節點、內部網路的條件下,收發信、搜尋、DKIM 簽章與監控都能運作,一個 354MB 的映像、145MB 的閒置記憶體,對一台小機器很划算。這次我沒有證據說它在公開網路上的投遞信譽與長期穩定度也一樣好,那要另外觀察。

接下來我會看三件事:遷移工具的實際回報(特別是大信箱)、1.0.x 後續版本有沒有再改指標或資料格式、以及 DNS 自動管理對 Cloudflare 這類常見供應商的成熟度。

參考資料

  • Stalwart 1.0.0 release notes:https://github.com/stalwartlabs/stalwart/releases/tag/v1.0.0(2026-10-26)
  • Stalwart 1.0.1 release notes:https://github.com/stalwartlabs/stalwart/releases/tag/v1.0.1(2026-10-28)
  • Stalwart Docker 安裝文件:https://stalw.art/docs/install/platform/docker
  • 從 0.16 升級到 1.0 的遷移文件:https://stalw.art/docs/migration/upgrade-0-16/
  • Stalwart Prometheus 輸出文件:https://stalw.art/docs/telemetry/metrics/prometheus
  • Stalwart GitHub 專案:https://github.com/stalwartlabs/stalwart
分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料。