请先阅读前一篇
这篇文章是"在Linux上搭建邮件服务器"系列的第七篇文章。
在前一篇中,我们介绍了如何将Dovecot与PostgreSQL联动进行用户认证。
如果还没有查看,建议您先阅读。
👉 前一篇: Dovecot的auth-sql.conf.ext设置及密码哈希
Postfix配置文件结构
Postfix是负责邮件传输的SMTP服务器,通过多种配置文件来调整其运行。
在这篇文章中,我们将解释Postfix的配置文件结构和主要角色。

Postfix主要配置文件
| 文件名 | 角色 |
|---|---|
| /etc/postfix/main.cf | Postfix的主要配置文件 (邮件传输、网络设置等) |
| /etc/postfix/master.cf | 管理Postfix服务 (SMTP, LMTP, SASL认证等) |
| /etc/postfix/virtual | 虚拟用户(域名)映射 |
| /etc/postfix/aliases | 系统用户电子邮件别名管理 |
| /etc/postfix/transport | 指定特定域/地址的邮件传送路径 |
| /etc/postfix/relay_domains | 设置允许的中继域 |
| /etc/postfix/sasl_passwd | 存储SMTP中继服务器认证信息 |
| /etc/postfix/sql/*.cf | 数据库联动配置文件 (PostgreSQL) |
Postfix主要配置项 (main.cf)
现在看看定义Postfix操作的主要配置项。
文件位置是 /etc/postfix/main.cf。
1️⃣ 基本邮件服务器设置
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
myhostname→ 邮件服务器的主机名mydomain→ 基本域名设置inet_interfaces→ 设置在所有网络接口上接收邮件inet_protocols→ 仅使用IPv4 (可以禁用IPv6)
2️⃣ 邮件中继限制
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
permit_mynetworks→ 在可信网络上允许中继permit_sasl_authenticated→ 仅允许SASL认证用户进行邮件中继defer_unauth_destination→ 阻止未经认证的外部中继
3️⃣ 虚拟用户及数据库联动
为了让Postfix使用PostgreSQL管理虚拟域和邮箱,您需要添加以下设置。
virtual_mailbox_domains = pgsql:/etc/postfix/sql/virtual_domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/sql/virtual_mailboxes.cf
virtual_alias_maps = pgsql:/etc/postfix/sql/virtual_aliases.cf
🔹 说明
- virtual_mailbox_domains → 从数据库查找可接收的虚拟域
- virtual_mailbox_maps → 从数据库查找用户邮箱信息
- virtual_alias_maps → 从数据库查找电子邮件别名
💡 如果使用MySQL
可以用mysql:代替pgsql:。💡 在大流量环境下,使用proxy:pgsql:可能对性能更有利。 但在一般环境下,去掉proxy:也可以正常工作。
设置Postfix使用数据库
要使Postfix使用PostgreSQL,您需要安装相关软件包。
sudo apt update
sudo apt install postfix postfix-pgsql
postfix→ 基本的Postfix SMTP服务器postfix-pgsql→ 使Postfix能够与PostgreSQL联动的软件包
安装完成后,必须编写配置文件,使Postfix可以从PostgreSQL获取用户信息。
Postfix数据库联动设置 (virtual_*.cf文件编写)
Postfix使用 virtual_domains.cf、virtual_mailboxes.cf 和 virtual_aliases.cf 文件从数据库查询信息。
这些文件需要手动创建,请参照以下内容编写。
1️⃣ /etc/postfix/sql/virtual_domains.cf (域名查询设置)
user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT domain_name FROM mail_domain WHERE domain_name='%s' AND active=true
说明
user → PostgreSQL用户账户 (请确保在数据库中提前创建此用户以允许postfix访问)
password → PostgreSQL账户密码 (预先创建的DB用户 mailadmin 的密码)
dbname → 数据库名称
hosts → 数据库服务器地址 (使用本地服务器)
query → 从mail_domain表中查询可接收的域名
2️⃣ /etc/postfix/sql/virtual_mailboxes.cf (邮箱查询设置)
user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT home_directory FROM mail_users WHERE email='%s'
说明
query → 查询用户的邮件存储路径 (从mail_users表中返回home_directory字段)
Postfix将返回路径以将用户的邮件存储在正确的目录中
3️⃣ /etc/postfix/sql/virtual_aliases.cf (电子邮件别名查询设置)
user = mailadmin
password = yourpassword
dbname = mail
hosts = 127.0.0.1
query = SELECT destination_email FROM mail_alias WHERE source_email='%s'
说明
query → 如果存在别名,查询实际邮件将发送到的目标电子邮件
参考mail_alias表找到注册的电子邮件别名并返回
安全设置
这些设置文件包含密码,因此必须限制其权限。
sudo chmod 640 /etc/postfix/sql/virtual_*.cf
sudo chown root:postfix /etc/postfix/sql/virtual_*.cf
🔒 安全注意事项:
由于设置文件中包含密码,必须限制其他用户的读取权限。 使用chmod 640使Postfix进程(postfix组)能够访问。
重新加载Postfix配置
完成配置后,您必须重新加载Postfix以使更改生效。
sudo systemctl restart postfix
总结与下一步
✅ Postfix配置文件结构及角色说明
✅ 在Postfix的 main.cf 中添加主要设置
✅ 设置Postfix与PostgreSQL联动的 virtual_*.cf 文件
在下一篇文章中,我们将讨论如何将Postfix与Dovecot联动以配置SMTP认证。
这将使邮件服务器具备完整的收发功能。
👉 下一篇: Postfix与Dovecot联动及SMTP认证 (即将发布!)
目前没有评论。