我一直在關注 workaround.org 上的 ISPMail 教學(2.9 Wheezy 版本),到目前為止一切都正常運作。當我到達「測試電子郵件傳送」步驟時,我注意到 /var/log/mail.log 的輸出日誌中存在有關查詢的錯誤。
May 14 06:48:59 mail postfix/pickup[17704]: EA4AD240A98: uid=0 from=<root>
May 14 06:48:59 mail postfix/cleanup[17776]: EA4AD240A98: message-id=<[email protected]>
May 14 06:48:59 mail postfix/qmgr[17706]: EA4AD240A98: from=<[email protected]>, size=429, nrcpt=1 (queue active)
May 14 06:49:00 mail dovecot: auth-worker(17782): mysql(127.0.0.1): Connected to database mailserver
May 14 06:49:00 mail dovecot: auth-worker(17782): Warning: mysql: Query failed, retrying: Table 'mailserver.users' doesn't exist
May 14 06:49:00 mail dovecot: auth-worker(17782): Error: sql([email protected]): User query failed: Table 'mailserver.users' doesn't exist (using built-in default user_query: SELECT home, uid, gid FROM users WHERE username = '%n' AND domain = '%d')
May 14 06:49:00 mail dovecot: lda([email protected]): msgid=<[email protected]>: saved mail to INBOX
May 14 06:49:00 mail postfix/pipe[17780]: EA4AD240A98: to=<[email protected]>, relay=dovecot, delay=0.09, delays=0.03/0.01/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)
May 14 06:49:00 mail postfix/qmgr[17706]: EA4AD240A98: removed
我發現這很有趣,因為它沒有找到資料庫,所以我回去檢查了我接觸到的涉及資料庫的每個文件(包括後綴cf 檔案),一切都是正確的,所以我在這一點上感到困惑,但奇怪的是看來電子郵件仍然到達了 /var/vmail/domain.com/ 中的正確目的地。
我應該擔心這個還是我在這裡遺漏了一些東西?由於它是來自 dovecot 的訊息,因此它將是來自 dovecot-sql.conf.ext 的查詢,我將其包含在此處
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=blocked password=***REMOVED***
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
答案1
正如您的 mail.log 中所述,未定義 user_query 的值。這就是 Dovecot 回退到預設查詢的原因。
開啟設定檔 /etc/dovecot/dovecot-sql.conf.ext,user_query 的值很可能會被註解掉或為空。用適當的查詢填寫它。
像我一樣,如果您對所有郵件帳戶使用相同的 UID 和 GID(例如 5000),您可以執行以下簡單操作
user_query = SELECT ('5000') as 'uid',('5000') as 'gid'
我在你的設定檔中註意到的另一件事。最好避免使用 PLAIN-MD5 作為 default_pass_scheme。最好改用更強大的東西,例如 SHA512。
希望我的回答對您有幫助。乾杯!
答案2
使用nano或vi(nano儲存=ctrl+o,然後退出=ctrl+x)vi儲存=插入按鈕和esc按鈕然後:wq!輸入它將保存並退出。
/etc/dovecot/conf.d/auth-sql.conf.ext
...
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
...
userdb {
driver = static
args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
}
使用 sql 驅動程式註解掉 userdb 部分:
#userdb {
#driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
#}
systemctl restart dovecot
它應該有效。
問題是 userdb 驅動程式正在使用,它正在資料庫中sql
尋找該表,但該表不存在。users
這是一個流行教程的問題,我發現互聯網上流傳著很多該教程的變體(哪個是原創的?我不知道)。本教學沒有解釋應該註解掉 userdb 行,它僅包含有關在設定檔中新增或修改行的說明。本教學使用 MariaDB 或 MySQL 作為虛擬使用者表。在這種情況下,我們只需要driver = sql
passdb,它會導致dovecot-sql.conf.ext
,其中包含對資料庫的正確查詢以獲取密碼以及獲取 homedir 的靜態方法。
在閱讀了我找到的教程(我認為您使用了相同的教程)之後,我使用我認為應該的設定在我的伺服器上對此進行了測試,並且我遇到了類似的問題。我只是在我自己的伺服器上檢查了三次甚至四次我的後綴和鴿子設置,這個解決方案解決了這個問題。我將 dovecot 和 postfix 與 clamav、spamassassin 和 postgrey 一起設定。一切都工作得非常出色,但我花了 40 多個小時來一步步檢查 dovecot 和 postfix 設定檔中的每一行。
2019 年 3 月 22 日編輯
我讀過一本書,其中對 pam 驅動程式有另一種解釋。
在 /etc/dovecot/conf.d/10-auth.conf 檔案最後有一行:
!include auth-system.conf.ext
在檔案 /etc/dovecot/conf.d/auth-system.conf.ext 中,有一個預設註解掉的部分,如下所示。
#passdb {
#driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
# [cache_key=<key>] [<service name>]
#args = dovecot
#}
#userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
#driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
#}
如果您想使用靜態本機帳戶而不是手動在資料庫中建立的帳戶(我沒有找到任何自動方法將大量電子郵件帳戶放入MariaDB),您的程式碼位於/etc/dovecot/conf.d/auth-system 中。
passdb {
driver = pam
# [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
# [cache_key=<key>] [<service name>]
#args = dovecot
}
userdb {
# <doc/wiki/AuthDatabase.Passwd.txt>
driver = passwd
# [blocking=no]
#args =
#override_fields = home=/home/virtual/%u
}
這是一個非常簡短的解釋。 Dovecot 可以使用您建立使用者的 SQL 資料庫,也可以使用 PAM 來驗證系統中的本機使用者帳戶。這僅取決於管理員,選擇哪種方式。在我看來,SQL 比 PAM 和 /etc/shadow 安全得多,因為如果您想在 MySQL/MariaDB 中建立用戶,您可以選擇 SHA,如下例所示:
INSERT INTO Users_tbl (DomainId, password, Email) VALUES (1, ENCRYPT('yourdifficultpasswordphrase', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]');
進而:
nano /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=yourdbname user=dbuser
password=yourdifficultpassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT Email as User, password FROM Users_tbl WHERE
Email='%u';
SHA-512 可以完成這項工作。當然,這是一個很簡短的解釋,但希望它能解釋其中的差異以及為什麼 SQL 是更好的選擇。
答案3
Dovecot 正在尋找一個名為的表,users
而表中似乎有數據virtual_users
:
Query failed, retrying: Table 'mailserver.users' doesn't exist
重新命名該表或配置 dovecot 以使用virtual_users
表。
答案4
這不是確切的答案,但可能與您的問題相關,以便新訪客可以排除故障。請參閱下面的鏈接