Я следовал руководствам 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 = 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 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
Это не точный ответ, но он может иметь отношение к вашей проблеме, чтобы новые посетители могли ее устранить. см. ссылку ниже.