![Dovecot 无法执行 mysql 查询](https://linux22.com/image/632817/Dovecot%20%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%20mysql%20%E6%9F%A5%E8%AF%A2.png)
我一直在关注 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
我发现这很有趣,它没有找到数据库,所以我回去检查了我接触的每个涉及数据库的文件(包括 postfix 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 的值很可能被注释掉或为空。用适当的查询填充它。
像我一样,如果你对所有邮件帐户(例如 5000 个)使用相同的 UID 和 GID,你可以做一些简单的事情
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
,其中包含对数据库的正确查询以获取密码以及获取主目录的静态方法。
在阅读我找到的教程(我认为您使用的是同一个教程)后,我按照我认为应该的设置在我的服务器上测试了此问题,并且我遇到了类似的问题。我只是在自己的服务器上三次甚至四次检查了我的 postfix 和 dovecot 设置,这个解决方案解决了这个问题。我配置了 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.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
}
这真的很简短。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
这不是一个确切的答案,但可能与您的问题相关,以便新访问者可以排除故障。请参阅下面的链接