Dovecot не может выполнить запрос MySQL

Dovecot не может выполнить запрос MySQL

Я следовал руководствам ISPMail на workaround.org (версия 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, скорее всего, будет закомментировано или пусто. Заполните его соответствующим запросом.

Как и я, если вы используете одинаковые 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! enter Сохранение и выход.

/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
}

Закомментируйте раздел userdb с драйвером sql:

#userdb {
#driver = sql
#args = /etc/dovecot/dovecot-sql.conf.ext
#}

systemctl restart dovecotи это должно работать.

Проблема в том, что драйвер userdb использует sqlи ищет таблицу usersв базе данных, но эта таблица не существует.

Это проблема популярного руководства, множество вариаций которого я нашел в интернете (какое из них оригинальное? Я не знаю). В этом руководстве не объясняется, что строки userdb следует закомментировать, оно содержит только инструкции по добавлению или изменению строк в файлах конфигурации. В руководстве для таблицы виртуальных пользователей используются MariaDB или MySQL. В этом случае нам нужна только driver = sqlpassdb, которая ведет к dovecot-sql.conf.ext, которая содержит правильный запрос к базе данных для пароля и статический способ получения homedir.

Я протестировал это на своем сервере с настройками, которые, как я думаю, должны быть, после прочтения руководства, которое я нашел (я думаю, вы использовали то же руководство), и у меня была похожая проблема. Я только что трижды или даже четырежды проверил свои настройки postfix и dovecot на своем собственном сервере, и это решение решило проблему. Я настроил dovecot и postfix вместе с clamav, spamassassin и postgrey. Все работает довольно блестяще, но я потратил более 40 часов, чтобы проверить шаг за шагом каждую отдельную строку в файлах конфигурации dovecot и postfix.

Отредактировано 22 марта 2019 г.

Я читал книгу, в которой есть другое объяснение драйвера 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

Это не точный ответ, но он может иметь отношение к вашей проблеме, чтобы новые посетители могли ее устранить. см. ссылку ниже.

https://www.dovecot.org/list/dovecot/2013-March/089342.html

Связанный контент