帶有虛擬使用者的 Postfix/Dovecot 配置
我按照本教程使用虛擬使用者(在 mysql 數據庫中)配置 Postfix + Dovecot:https ://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot -mysql 和 spamassasin
我可以創建一個使用者(在數據庫中添加一行),然後該使用者可以連接電子郵件客戶端(使用 IMAP)。問題是使用者無法接收電子郵件(我試圖將電子郵件從一個使用者發送給另一個使用者,因此是本地電子郵件)。
我已經創建了 2 個使用者,
bla
並且salut
,使用域isp6.lab
(我在主機 mail.isp6.lab 中添加到 127.0.0.1,本地測試沒有問題)。/var/log/mail.log 看起來像這樣:
Oct 5 13:43:28 debianR postfix/lmtp[6346]: 4284485120: to=<bla@isp6.lab>, relay=mail.isp6.lab[private/dovecot-lmtp], delay=0.12, delays=0.08/0/0/0.04, dsn=5.1.1, status=bounced (host mail.isp6.lab[private/dovecot-lmtp] said: 550 5.1.1 <bla@isp6.lab> User doesn't exist: bla@isp6.lab (in reply to RCPT TO command))
在我的 /etc/dovecot/conf.d/10-mail.conf 中,mail_location 有這一行:
mail_location = maildir:/var/mail/vhosts/%d/%n
在我的 /etc/dovecot/conf.d/auth-sql-conf.ext 中(只是一個範例,而不是完整文件):
userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
當我轉到 /var/mail/vhosts/isp6.lab 時,我看到我的 2 個使用者的文件夾是這樣的:
ls /var/mail/vhosts/isp6.lab bla salut
所以我的使用者可以登錄,他們在系統上有他們的電子郵件文件夾,但不知何故他們無法收到任何電子郵件,因為他們“不存在”。
如果需要,請隨時向我詢問其他資訊,我到處尋找,但找不到問題的原因。
**編輯:**調試日誌提供更多資訊:
發送電子郵件
bla
時salut
:Oct 05 15:12:22 auth: Debug: auth client connected (pid=0) Oct 05 15:12:22 auth: Debug: client in: AUTH 1 LOGIN service=smtp nologin lip=192.168.1.2 rip=192.168.1.3 secured Oct 05 15:12:22 auth: Debug: client out: CONT 1 VXNlcm5hbWU6 Oct 05 15:12:22 auth: Debug: client in: CONT 1 YmxhQGlzcDYubGFi Oct 05 15:12:22 auth: Debug: client out: CONT 1 UGFzc3dvcmQ6 Oct 05 15:12:22 auth: Debug: client in: CONT 1 YmxhYmxh Oct 05 15:12:22 auth-worker(7448): Debug: sql(bla@isp6.lab,192.168.1.3): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'bla@isp6.lab' AND pass = password('***********') Oct 05 15:12:22 auth: Debug: client out: OK 1 user=bla@isp6.lab Oct 05 15:12:22 lmtp(7467): Debug: none: root=, index=, control=, inbox=, alt= Oct 05 15:12:22 lmtp(7467): Info: Connect from local Oct 05 15:12:22 auth: Debug: master in: USER 1 salut@isp6.lab service=lmtp Oct 05 15:12:22 auth-worker(7448): Debug: sql(salut@isp6.lab): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'salut@isp6.lab' AND pass = password('') Oct 05 15:12:22 auth-worker(7448): Info: sql(salut@isp6.lab): unknown user Oct 05 15:12:22 auth: Debug: master out: NOTFOUND 1 Oct 05 15:12:22 lmtp(7467): Debug: auth input: Oct 05 15:12:22 lmtp(7467): Info: Disconnect from local: Client quit (in reset) Oct 05 15:12:22 lmtp(7467): Debug: none: root=, index=, control=, inbox=, alt= Oct 05 15:12:22 lmtp(7467): Info: Connect from local Oct 05 15:12:22 auth: Debug: master in: USER 2 bla@isp6.lab service=lmtp Oct 05 15:12:22 auth-worker(7448): Debug: sql(bla@isp6.lab): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'bla@isp6.lab' AND pass = password('') Oct 05 15:12:22 auth-worker(7448): Info: sql(bla@isp6.lab): unknown user Oct 05 15:12:22 auth: Debug: master out: NOTFOUND 2 Oct 05 15:12:22 lmtp(7467): Debug: auth input: Oct 05 15:12:22 lmtp(7467): Info: Disconnect from local: Client quit (in reset)
似乎是為查找使用者而進行的 SQL 查詢,但沒有任何密碼(當然,發送者沒有接收者的密碼),因此找不到使用者。因為我已經將 userdb 設置為靜態,所以不應該進行任何查詢,不應該有任何查詢來查找使用者。我想我可以通過添加 user_query 來臨時解決。
PS:我的密碼查詢來自這個(與 MySQL PASSWORD 兼容):http ://wiki2.dovecot.org/AuthDatabase/SQL#Password_verification_by_SQL_server
PPS :第二個 sql 請求是針對退回郵件的,該郵件未成功退回以告知郵件無法投遞。
我終於找到了解決方案。Postfix 被配置為查看使用者存在的數據庫以傳遞電子郵件,因此 Dovecot 在接收來自 Postfix 的電子郵件以傳遞時不必這樣做。
這就是它應該如何工作,也是我們定義靜態使用者數據庫的原因。它錯過了一個參數,因此 Dovecot 不會檢查使用者是否存在,因為 Postfix 已經這樣做了:
/etc/dovecot/conf.d/auth-sql.conf.ext
(僅有用的部分):userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n allow_all_users=yes }
添加
allow_all_users=yes
參數解決了這個問題。