Назад | Перейти на главную страницу

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=<20140514064859.EA4AD240A98@mail.domain.com>
May 14 06:48:59 mail postfix/qmgr[17706]: EA4AD240A98: from=<root@domain.com>, 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(john@example.org): 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(john@example.org): msgid=<20140514064859.EA4AD240A98@mail.domain.com>: saved mail to INBOX
May 14 06:49:00 mail postfix/pipe[17780]: EA4AD240A98: to=<john@example.org>, 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';

Как говорится в вашем 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.

Надеюсь, вы найдете мой ответ полезным. Ура!

используйте nano или vi (nano save = ctrl + o, затем exit = ctrl + x) vi save = кнопка вставки и кнопка 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 = sql для passdb, что приводит к 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@example.com');

А потом:

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 - лучший выбор.

Dovecot ищет стол под названием users пока у вас есть данные в virtual_users стол:

Query failed, retrying: Table 'mailserver.users' doesn't exist

Переименуйте таблицу или настройте dovecot для использования virtual_users стол.