Mysql

帶有虛擬使用者的 Postfix/Dovecot 配置

  • October 21, 2020

我按照本教程使用虛擬使用者(在 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

所以我的使用者可以登錄,他們在系統上有他們的電子郵件文件夾,但不知何故他們無法收到任何電子郵件,因為他們“不存在”。

如果需要,請隨時向我詢問其他資訊,我到處尋找,但找不到問題的原因。

**編輯:**調試日誌提供更多資訊:

發送電子郵件blasalut

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參數解決了這個問題。

引用自:https://serverfault.com/questions/633655