请先阅读前一篇
这篇文章是"在Linux上搭建邮件服务器"系列的第七篇文章。
在前一篇中,我们介绍了如何将Dovecot与PostgreSQL联动进行用户认证
如果还没有查看,建议您先阅读。
👉 前一篇: Dovecot的auth-sql.conf.ext设置及密码哈希


Postfix配置文件结构

Postfix是负责邮件传输的SMTP服务器,通过多种配置文件来调整其运行。
在这篇文章中,我们将解释Postfix的配置文件结构和主要角色

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.cfvirtual_mailboxes.cfvirtual_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认证 (即将发布!)