Skip to main content

設定 postfix 為轉信主機

情境說明

需求:需要一部 SMTP 寄信主機可供論壇網站寄信,免費的 Gmail 或 ISP 提供的 SMTP 主機都會有寄送數量的限制,而其他提供可大量寄信的雲端服務商,例如 Mailchimp、Sendgrid 等收費都不便宜。

目的:使用 postfix 架設一部自有的 SMTP 寄信主機。

說明:

  • 採用 docker 佈署方式
  • 為了降低寄出的郵件被其他郵件平台視為垃圾郵件而遭阻擋,主機在寄信時所提供的「寄件者」郵件位址的網域,需要包含一些安全設定:
    NOTE:建議至少要完成最簡單的 SPF Record;不然透過主機寄信到 Gmail 會收不到。
    • SPF Record
    • DKIM
    • DMARC
  • 為了要完成上述設定,必須擁有網域的控制權。
  • 網域內至少需有一個有效的郵件信箱,作為論壇系統管理後台認証與主機設定過程驗證用。

關鍵參數定義:

  • 網域內的有效信箱:alang@mydomain.com
  • 網域:mydomain.com
  • 寄信主機的 FQDN:smtp.mydomain.com
  • 透過主機發信時的「寄件者」郵件位址:alang@mydomain.com
安裝設定 container
git clone https://github.com/a-lang/docker-postfix-smtp.git 
docker pull alangtw/postfix-smtp:trusty

修改啟動參數

run.sh:

  • maildomain: 你的網域名
  • smtp_user: 外寄郵件的連線帳號與密碼,中間用:隔開
-e maildomain=mydomain.com -e smtp_user=alang@mydomain.com:thispassword \
建立 SSL 自我簽署憑證

為了要新增 SSL 憑證,必須先將 container 啟動。

注意:此時 container 雖然啟動,但缺少一些需要的憑證與金鑰檔,所以系統還無法正常運作。

啟動 container

chmod 0755 *.sh
./run.sh

建立 SSL 憑證檔
NOTE: 在 Host 執行以下指令

docker exec -it postfix openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout  /etc/postfix/certs/smtp-mydomain-com.key \
-out /etc/postfix/certs/smtp-mydomain-com.crt

Tip:

憑證檔 .crt 與 .key 會儲存在以下路徑:
- Host OS: data/certs
- Container OS: /etc/postfix/certs

SSL 憑證是用在 SMTP 主機與發信電腦或發信系統加密連線。

建立 DKIM 金鑰

在 Host 執行以下指令

docker exec -it postfix sh -c "cd /etc/opendkim/domainkeys && opendkim-genkey -t -s mail -d mydomain.com"

Tip:

私鑰檔 .private 與公鑰檔 .txt 會儲存在以下路徑:
- Host OS: data/domainkeys
- Container OS: /etc/postfix/domainkeys

.txt 內有公鑰字串,這要設定在 DNS Zone。

重啟 container

有了 SSL 憑證與 DKIM 金鑰,需重啟 container 以套用這些設定。

./stop.sh
./run.sh

到這裡,主機設定都已完成。

檢查幾個 container 的服務
postfix:

#> docker exec -it postfix ps -ef | grep postfix
root        54    51  0 07:11 ?        00:00:00 /bin/bash /opt/postfix.sh
root       125     1  0 07:11 ?        00:00:00 /usr/lib/postfix/master
postfix    127   125  0 07:11 ?        00:00:00 pickup -l -t unix -u
postfix    128   125  0 07:11 ?        00:00:00 qmgr -l -t unix -u

opendkim:

#> docker exec -it postfix ps -ef | grep opendkim
opendkim    55    51  0 07:11 ?        00:00:00 /usr/sbin/opendkim -f
opendkim    66    55  0 07:11 ?        00:00:00 /usr/sbin/opendkim -f

/var/log/mail.log:

#> docker exec -it postfix tail -20 /var/log/mail.log
Jan  2 07:11:14 a037fd779eaa opendkim[66]: OpenDKIM Filter v2.9.1 starting (args: -f)
Jan  2 07:11:15 a037fd779eaa postfix/master[125]: daemon started -- version 2.11.0, configuration /etc/postfix

雖然系統會用 sasl 作郵件認証,不過 saslauthd 服務可以不用啟動。

Tip: mail.log 如服務正常運作,不應該出現錯誤訊息;用戶端在寄信後,這裡如果顯示 ... doesn't resolve to XXX.XXX.XXX.XXX 的錯誤,這是正常的,原因是主機所在的網路無法反查用戶端的FQDN,這不會影響寄信功能。

防止寄出信件成為垃圾信而遭阻擋
  • 避免外寄郵件遭到假冒
  • 降低外寄郵件被辨識為垃圾郵件
  • 避免有心人士以郵件工具作為釣魚攻擊

關於 SPF、DKIM 與 DMARC 的運作原理,以及如何保護郵件被假冒或竄改,參閱下述連結

新增 SPF 記錄