📧 Postfix

安全可靠的 SMTP 郵件傳輸代理

Postfix 是高安全性的 MTA(郵件傳輸代理),設計目標是取代 Sendmail,支援 SASL 認證、TLS 加密、SPF/DKIM 整合,適合自建郵件發送服務。

安裝

$ sudo apt update && sudo apt install -y postfix mailutils
# 安裝時選擇 "Internet Site",輸入你的郵件網域(如 example.com)

基本設定(/etc/postfix/main.cf)

# 主機名稱(需與 MX 記錄一致)
myhostname = mail.example.com
mydomain   = example.com
myorigin   = $mydomain

# 接受哪些 domain 的郵件
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 信任的網路(只有這些 IP 可以轉發郵件)
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# 信箱格式與存放路徑
home_mailbox = Maildir/

# 連線大小限制
message_size_limit = 10240000   # 10MB

# TLS 設定(啟用加密)
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_use_tls = yes
smtp_tls_security_level = may
$ sudo postfix check && sudo systemctl restart postfix

透過 SMTP 服務轉發(推薦中小型應用)

若只是要讓應用程式發送通知信,透過現有的 SMTP 服務(Gmail、SendGrid、Mailgun)轉發更簡單且可靠:

# 在 main.cf 加入
relayhost = [smtp.sendgrid.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
$ echo "[smtp.sendgrid.net]:587 apikey:你的API金鑰" | sudo tee /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl restart postfix

測試發信

$ # 傳送測試信
echo "測試信內容" | mail -s "測試主旨" test@example.com

# 查看郵件佇列
mailq

# 查看發送日誌
sudo tail -f /var/log/mail.log

SPF / DKIM 設定(提高到達率)

SPF(在 DNS 新增 TXT 記錄)

# DNS TXT 記錄(@)
"v=spf1 ip4:你的伺服器IP mx ~all"

DKIM(使用 opendkim)

$ sudo apt install -y opendkim opendkim-tools
sudo opendkim-genkey -t -s mail -d example.com
# 產生 mail.private(私鑰)和 mail.txt(DNS 記錄)
cat mail.txt   # 複製內容加入 DNS TXT 記錄

常用操作

操作指令
檢查設定sudo postfix check
重新載入設定sudo systemctl reload postfix
查看郵件佇列mailq
強制重送佇列中的郵件sudo postqueue -f
清空佇列sudo postsuper -d ALL
查看即時日誌sudo tail -f /var/log/mail.log