CnetOS 安裝 Postfix、Dovecot、MySQL 搭配 Let’s Encrypt 與 Rainloop、觸發器的一些紀錄

在 CentOS 上安裝 Postfix 和 Dovecot 並透過 MySQL 達到虛擬化的文章可參考 Linode 官方的 Email with Postfix, Dovecot, and MySQL,基本上這篇已經帶的十分清楚,照著做可以跑起來沒問題,我只針對 Let’s Encrypt 和 Rainloop 及其他自己遇到的問題做分享。

Postfix / Dovecot 搭配 Let’s Encrypt

我的 Let’s Encrypt 是用 Acme PHP 管理,路徑要記得換成你自己的(例如用 dehydrated 的話路徑應該會像是 /etc/dehydrated/certs/domain.com/

# Postfix
#
# 編輯 /etc/postfix/main.cf
#
smtpd_tls_cert_file = /etc/acmephp/certs/domain.com/cert.pem
smtpd_tls_key_file = /etc/acmephp/private/domain.com/private.pem
smtpd_tls_CAfile = /etc/acmephp/certs/domain.com/chain.pem

# Dovecot
#
# 編輯 /etc/dovecot/conf.d/10-ssl.conf
# 或直接加在 /etc/dovecot/dove.conf 裡
#
ssl_cert = </etc/acmephp/certs/domain.com/cert.pem
ssl_key = </etc/acmephp/private/domain.com/private.pem
ssl_ca = </etc/acmephp/certs/domain.com/chain.pem

安裝 Rainloop

Rainloop 官網說明頁 選擇你要下載的版本,解壓縮後放到網站目錄即可。後台登入網址是 http://domain.com/?admin,預設帳密為 admin /12345

剛裝好一定要記得先從後台 Domains 頁面新增你的網域,不然前台是沒有辦法登入的。只要 Domains 這邊的 IMAP 和 SMTP 測試正常,Rainloop 和 Mail Server 的對接應該就沒有太大問題;如果有上 SSL 的話連線類型可以設定為 SSL/TLS、STARTTLS 以增加安全。

使用者直接修改密碼部份,Rainloop 官方列出的 plugin 裡沒有直接支援 MySQL 的選項(但是有用 PDO 的 change-password-custom-sql),我自己是用它的 sample 改了一個醜醜的 rainloop-plugin-mysql-change-password,歡迎拿去用。

Postfix 過濾器(觸發器)

要將 Postfix 收進來的 Email 做某些處理,可以使用過濾器,但是被濾掉的信件等於被派發轉送掉了,所以原本的收信信箱不會收到此封信(也就是說 Postfix 收進來,不是送給指定信箱,而是送給某個 hook / script)。

要掛上過濾器請編輯 master.cf 並加上一行

hook-script unix - n n - - pipe flags=F user=nginx argv=/path/to/filter.php ${sender} ${size} ${recipient}

hook-script 是自己定義的 filter 名稱。因為我是交給 php 處理,所以 user 設成 nginx。如果要過濾所有的信件,可以在 master.cf 裡直接加上針對 smtp 的處理(作用於所有收進來的信件,等於信箱完全收不到信了)。

smtp   inet n - - - - smtpd
-o content_filter=hook-script:dummy

如果只想作用於某個 Email 甚至是某種延伸組合(例如 user+filter+yes@domain.com,啟用延伸組合功能需要在 main.cf中設定 recipient_delimiter)則要用另外一種設定方式:

新增檔案 /etc/postfix/access 並加上

user+filter+yes@domain.com FILTER hook-script:dummy

後面的 hook-script 記得要改成自己的 filter 設定名稱。然後將 access 檔案以 postmap 編碼

$ postmap /etc/postfix/access

這樣會得到 hash 過的檔案 access.db,在 main.cf 內指定給smtpd_recipient_restrictions 當作選項之一

smtpd_recipient_restrictions = check_recipient_access
hash:/etc/postfix/access,
permit_mynetworks,
reject_unauth_destination

然後重載或重開 postfix 就可以了。

如果遇到 454 4.7.0 TLS not available due to local problem

這個問題多半是和 SSL 有關,請檢查 Postfix / Dovecot 的 cert、key、ca 相關 pem 檔案是否有設定好,權限是否開在 600。

如果遇到 Dovecot postmaster_address fatal

Dovecot: Fatal: Error reading configuration: Invalid settings: postmaster_address setting not given

請到 /etc/dovecot/conf.d/15-lad.conf 手動設定postmaster_address

如果寄信到 Gmail 遇到以下錯誤

Our system has detected that this 550–5.7.1 message does not meet IPv6 sending guidelines regarding PTR records 550–5.7.1 and authentication. Please review 550–5.7.1 https://support.google.com/mail/?p=ipv6_authentication_error for more 550 5.7.1 information.

請檢查你的 FQDN 、 PTR 或 SPF 是有否正確設定(什麼是 SPF)。

如果 Dovecot 遇到連線錯誤

Mar 3 02:57:39 mail postfix/smtpd[4479]: connect from localhost[::1] 
Mar 3 02:57:39 mail dovecot: auth: Fatal: Unknown database driver ‘mysql’

請檢查否有安裝 dovecot-mysql

$ yum install dovecot-mysql