請先閱讀之前的篇章
這篇文章是「在Linux上搭建郵件伺服器」系列的第七篇文章。
在之前的篇章中,我們探討了如何將Dovecot與PostgreSQL整合以設定使用者認證
如果您尚未確認,建議您先閱讀。
👉 上一篇:Dovecot的auth-sql.conf.ext設置和密碼哈希


Postfix設定檔結構

Postfix是負責郵件傳送的SMTP伺服器,使用多種設定檔來調整運作。
這篇文章將解釋Postfix的設定檔結構與主要角色

Postfix Configuration Diagram

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
可以將pgsql:替換為mysql:

💡 在大規模流量環境中,使用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能夠存取DB。)
password → PostgreSQL賬號密碼(已創建的DB用戶mailadmin的DB帳戶密碼)
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認證(敬請期待!)