這就是我們的最後一塊拼圖:Dovecot。
如果說 Postfix 是在大門口負責收發信件的「郵差」,那 Dovecot 就是在屋內負責管理的「全能管家」。它有兩個核心任務:
- 驗收與倉儲 (LMTP/Mail Location):把郵差收進來的信,依照收件人分門別類,整齊地存進硬碟的資料夾裡。
- 身分驗證與取信 (Auth/IMAP):幫郵差查驗寄信人的密碼 (SASL),並讓主人(你)能透過手機或電腦把信取出來看。
讓我們開始安裝並設定這位管家吧!
1. 建立系統專用帳號 (vmail)
在安裝軟體前,我們需要先解決一個 Linux 的權限問題。 雖然我們的使用者是「虛擬」的(在資料庫裡),但信件最終還是要存成硬碟上的「檔案」。Linux 的檔案系統需要有一個真實的擁有者來管理這些檔案。
我們建立一個名為 vmail 的系統帳號,專門用來持有所有人的信件檔案:
# 建立群組 vmail (GID 5000)
sudo groupadd -g 5000 vmail
# 建立使用者 vmail (UID 5000),並指定它的家目錄在 /var/mail/vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail/vmail -m
2. 安裝 Dovecot 套件
我們需要安裝核心服務、IMAP 服務、LMTP 服務(接收 Postfix 轉交的信),以及 MySQL 驅動。
sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql -y
3. 設定資料庫連線 (dovecot-sql.conf.ext)
這一步是讓 Dovecot 能夠讀取我們在第二章建立的資料庫。
備份並建立設定檔:
sudo cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.bak
sudo nano /etc/dovecot/dovecot-sql.conf.ext
請清空內容,貼上以下設定(請記得修改 password):
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailserver password=password
# [密碼加密方式]
# 目前我們先用 PLAIN (明碼) 方便測試。
# 未來若要加密,這裡改成 SHA512-CRYPT (那資料庫裡的密碼也要換成加密字串)
default_pass_scheme = PLAIN
# [驗證查詢]:Dovecot 用這行來檢查帳號密碼是否正確
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
# [使用者查詢]:驗證通過後,Dovecot 用這行知道信箱檔案要放在哪裡
# 這裡我們回傳了固定的 uid/gid (5000),以及動態的路徑 (domain/user)
user_query = SELECT 5000 as uid, 5000 as gid, 'maildir:/var/mail/vmail/%d/%n' as mail FROM virtual_users WHERE email='%u';
注意:
%d代表網域 (mydomain.com),%n代表使用者名稱 (user)。所以信件會存在/var/mail/vmail/mydomain.com/user/裡面,結構非常清晰。
修改權限(保護密碼):
sudo chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext
4. 設定 Dovecot 核心模組
Dovecot 的設定檔分散在 /etc/dovecot/conf.d/ 裡。我們需要修改其中的四個檔案。
A. 修改 10-auth.conf (啟用 SQL 認證)
sudo nano /etc/dovecot/conf.d/10-auth.conf
- 找到
disable_plaintext_auth,確認它是no(或是註解掉),因為我們之後會強制用 SSL,所以這裡設 no 沒關係,方便除錯。 - 找到
auth_mechanisms,修改為:auth_mechanisms = plain login - 註解掉 (加上 #):
!include auth-system.conf.ext(我們不用 Linux 系統帳號) - 取消註解 (拿掉 #):
!include auth-sql.conf.ext(我們要用 SQL)
B. 修改 10-mail.conf (設定信箱位置)
sudo nano /etc/dovecot/conf.d/10-mail.conf
- 找到
mail_location,修改為:
mail_location = maildir:/var/mail/vmail/%d/%n
- 找到
mail_uid和mail_gid,修改為我們剛建的vmail帳號 ID:
mail_uid = 5000 mail_gid = 5000
C. 修改 10-master.conf (打開與 Postfix 的溝通大門) 這是最重要的一步!
這裡定義了 Postfix 第三章設定檔裡寫的 private/auth 和 private/dovecot-lmtp 是什麼。
sudo nano /etc/dovecot/conf.d/10-master.conf
請找到 service lmtp 和 service auth 區塊,修改成下面這樣(小心大括號的位置):
# 1. 讓 Postfix 把信塞進來的接口 (LMTP)
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
# 2. 讓 Postfix 來問密碼的接口 (Auth)
service auth {
# 給 Postfix 用的 (SMTP Auth)
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
# 給 Dovecot 自己用的
unix_listener auth-userdb {
mode = 0600
user = vmail
}
user = dovecot
}
D. 修改 10-ssl.conf (掛載 Let’s Encrypt)
sudo nano /etc/dovecot/conf.d/10-ssl.conf
- 找到
ssl,確認是yes或required。 - 修改憑證路徑(換成你的真實路徑):
ssl_cert = </etc/letsencrypt/live/mail.mydomain.com/fullchain.pemssl_key = </etc/letsencrypt/live/mail.mydomain.com/privkey.pem
5. 權限修正與啟動
我們需要告訴 Dovecot 它的 SQL 設定檔在哪裡(因為我們剛剛是在 conf.d/10-auth.conf 裡 include 了 auth-sql.conf.ext,我們要去編輯那個檔案指向我們的 dovecot-sql.conf.ext)。
更簡單的做法,直接編輯 /etc/dovecot/conf.d/auth-sql.conf.ext:
sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
確保內容如下:
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
最後,重啟 Dovecot 並檢查狀態:
sudo systemctl restart dovecot
sudo systemctl status dovecot
如果看到綠色的 active (running),恭喜你!所有安裝步驟已全部完成!
最後我們將要進入驗收環節!