📨 请先阅读前一篇文章!
本文是 “在 Linux 上搭建邮件服务器”系列的第五篇文章。
在上一篇中分析了Dovecot 必备配置文件 4 个,如果还没有阅读,推荐先确认一下。
👉 前一篇: Dovecot 必备配置文件分析


🔄 顺序调整通知
在上一篇中预告了“在下一篇会讨论 auth-sql.conf.ext 设置”,但在实际写作时,认为先解释数据库表设计更符合逻辑的顺序

因此,本篇文章将介绍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 账户,而是通过数据库获取用户信息进行认证。

🔹 虚拟用户环境的优势

  • 与系统账户分隔,提高了安全性
  • 用户账户可以轻松添加和删除
  • 支持多个域名(可以在一台服务器上管理多个邮件域名)
  • 具有优良的可扩展性,易于管理

Pigeon holding a letter near a database


🛠️ 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 设置与密码哈希方法 (敬请期待!)