📨 請先閱讀前一篇!
這篇文章是 「在 Linux 上搭建郵件伺服器」 系列的第五篇文章。
在前一篇中,我們分析了 Dovecot 必要的設定檔 4 個。如果還沒閱讀的話,建議您先確認。
👉 前一篇:Dovecot 必要設定檔分析


🔄 順序調整通知
在上一篇中預告將在「下一篇中處理 auth-sql.conf.ext 設定」,但
實際寫文章時,我認為先解釋 DB 表格設計是更合邏輯的順序

因此這篇文章將討論Dovecot 的虛擬用戶概念和 PostgreSQL 表格設計
而下一篇將解釋Dovecot 與 PostgreSQL 之間連接的 auth-sql.conf.ext 設定


🎯 Dovecot 虛擬用戶是什麼?為什麼需要?

Dovecot 認證用戶的方式主要有兩種。

  1. 基於系統賬戶的認證
  2. 使用 Linux 的 /etc/passwd/etc/shadow 檔案進行認證
  3. 利用一般的系統用戶賬戶
  4. 賬戶管理繁瑣,難以創建郵件專用賬戶

  5. 基於虛擬用戶的認證 (Virtual Users)

  6. 使用獨立的數據庫 (PostgreSQL、MySQL 等) 進行認證
  7. 可以獨立於系統賬戶的郵件專用用戶管理
  8. 具有優秀的安全性與擴展性,適合大型郵件服務

我們計畫使用 PostgreSQL 創建虛擬用戶環境
這意味著在不創建實際的 Linux 賬戶的情況下,通過數據庫來獲取用戶信息進行認證。

🔹 虛擬用戶環境的優勢

  • 與系統賬戶分離,安全性高
  • 可輕鬆添加、刪除用戶賬戶
  • 支持多個域名(在同一伺服器上管理多個郵件域名)
  • 擴展性極佳,管理簡便

鴿子在數據庫旁邊拿著信件


🛠️ PostgreSQL 中的表格設計

為了妥善管理 Dovecot 的虛擬用戶,最少需要 3 個表格。

1️⃣ 必備表格構成

  1. mail_domain - 郵件伺服器管理的域名列表
  2. mail_users - 真正的郵件用戶信息
  3. mail_alias - 郵件別名(轉發)管理

這樣分開的原因是基於擴展性維護方便性
未來經營多個郵件域名或將特定郵件轉發至其他地址時會非常有用。


2️⃣ 表格架構和 SQL 範例

📌 1. mail_domain (域名列表管理)
此表管理郵件伺服器允許的域名。
即定義如 example.commydomain.com 的郵件域名。

CREATE TABLE mail_domain (
    id SERIAL PRIMARY KEY,
    domain_name VARCHAR(255) NOT NULL UNIQUE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 說明
- domain_name → 郵件域名 (例: example.com)
- active → 是否使用該域名 (可停用)
- created_at → 創建日期

範例數據插入

INSERT INTO mail_domain (domain_name) VALUES ('example.com');
INSERT INTO mail_domain (domain_name) VALUES ('mydomain.com');

📌 2. mail_users (郵件用戶賬戶)
真實的郵件用戶賬戶信息將保存於此。
每個用戶必須屬於特定的域名。

CREATE TABLE mail_users (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password TEXT NOT NULL,
    home_directory TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 說明
- domain_id → 與 mail_domain 表的 id 相關聯(郵件用戶所屬的域名)
- email → 用戶電子郵件地址(user@example.com
- password → 保存加密的密碼
- home_directory → 郵件保存路徑(/var/mail/vmail/user@example.com
- created_at → 賬戶創建日期

範例數據插入

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', 'hashed_password_here', '/var/mail/vmail/user@example.com');

📌 3. mail_alias (郵件別名 / 轉發) 在將郵件地址轉發到其他地址或使用一個地址的多個別名時需要此表。

CREATE TABLE mail_alias (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    source_email VARCHAR(255) NOT NULL,
    destination_email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 說明

  • source_email → 原始電子郵件地址 (例: contact@example.com)
  • destination_email → 將被轉發的電子郵件地址 (例: admin@example.com)
  • 執行將特定郵件地址自動轉發到其他地址的功能

範例數據插入

INSERT INTO mail_alias (domain_id, source_email, destination_email)
VALUES (1, 'contact@example.com', 'admin@example.com');

現在寄到 contact@example.com 的郵件會自動轉發到 admin@example.com。

🔍 為未來擴展建議的表格

除了基本的郵件服務經營外,還可以擴展附加功能。
以下是可以未來擴展的表格例子。

表格名稱 角色
mail_quota 每個用戶的郵件容量限制
mail_blacklist 阻止的郵件地址列表
mail_whitelist 允許的郵件地址列表
mail_forwarding 轉發到外部郵件賬戶
mail_autoresponder 自動回覆消息管理
mail_address_book 內部通訊錄管理

🏁 總結與下一步

本篇文章涵蓋的內容
- Dovecot 虛擬用戶的概念及必要性
- PostgreSQL 表格設計 (mail_domain, mail_users, mail_alias)
- 郵件管理擴展的附加表格建議

下一篇預告:auth-sql.conf.ext 設定及密碼哈希方法
現在數據庫表格已準備好。下一篇將解釋Dovecot 如何從 PostgreSQL 中獲取用戶信息進行認證
並討論在郵件用戶賬戶中將使用的密碼哈希方法

特別是,將比較MD5、SHA-256、BCRYPT 方法的特性和安全性差異,
具體看看這些方法如何在 Dovecot 和 PostgreSQL 中進行應用。

👉 下一篇:auth-sql.conf.ext 設定及密碼哈希方法 (敬請期待!)