Я следовал этому руководству по настройке Postfix + Dovecot с виртуальными пользователями (в базе данных mysql): https://www.digitalocean.com/community/tutorials/how-to-configure-a-mail-server-using-postfix-dovecot-mysql-and-spamassasin
Я могу создать пользователя (добавить строку в базу данных), а затем этот пользователь сможет подключиться к почтовому клиенту (используя IMAP). Проблема в том, что пользователь не может получать электронные письма (я пытался отправить электронные письма от одного пользователя другому, поэтому локальные электронные письма).
Я создал 2 пользователей, bla
и salut
, с доменом isp6.lab
(Я добавил в хосты mail.isp6.lab до 127.0.0.1, никаких проблем с этой стороны для локального тестирования).
/Var/log/mail.log выглядит так:
Oct 5 13:43:28 debianR postfix/lmtp[6346]: 4284485120: to=<bla@isp6.lab>, relay=mail.isp6.lab[private/dovecot-lmtp], delay=0.12, delays=0.08/0/0/0.04, dsn=5.1.1, status=bounced (host mail.isp6.lab[private/dovecot-lmtp] said: 550 5.1.1 <bla@isp6.lab> User doesn't exist: bla@isp6.lab (in reply to RCPT TO command))
В моем /etc/dovecot/conf.d/10-mail.conf у меня есть эта строка для mail_location:
mail_location = maildir:/var/mail/vhosts/%d/%n
И в моем /etc/dovecot/conf.d/auth-sql-conf.ext (только образец, а не полный файл):
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
Когда я захожу в /var/mail/vhosts/isp6.lab, я вижу папки двух моих пользователей, например:
ls /var/mail/vhosts/isp6.lab
bla
salut
Так что мои пользователи могут войти в систему, у них есть папки электронной почты в системе, но они почему-то не могут получать электронную почту, потому что они «не существуют».
Не стесняйтесь спрашивать меня о другой информации, если это необходимо, я искал везде, но не могу найти причину своей проблемы.
РЕДАКТИРОВАТЬ : Журналы отладки предоставляют дополнительную информацию:
При отправке электронного письма от bla
к salut
:
Oct 05 15:12:22 auth: Debug: auth client connected (pid=0)
Oct 05 15:12:22 auth: Debug: client in: AUTH 1 LOGIN service=smtp nologin lip=192.168.1.2 rip=192.168.1.3 secured
Oct 05 15:12:22 auth: Debug: client out: CONT 1 VXNlcm5hbWU6
Oct 05 15:12:22 auth: Debug: client in: CONT 1 YmxhQGlzcDYubGFi
Oct 05 15:12:22 auth: Debug: client out: CONT 1 UGFzc3dvcmQ6
Oct 05 15:12:22 auth: Debug: client in: CONT 1 YmxhYmxh
Oct 05 15:12:22 auth-worker(7448): Debug: sql(bla@isp6.lab,192.168.1.3): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'bla@isp6.lab' AND pass = password('***********')
Oct 05 15:12:22 auth: Debug: client out: OK 1 user=bla@isp6.lab
Oct 05 15:12:22 lmtp(7467): Debug: none: root=, index=, control=, inbox=, alt=
Oct 05 15:12:22 lmtp(7467): Info: Connect from local
Oct 05 15:12:22 auth: Debug: master in: USER 1 salut@isp6.lab service=lmtp
Oct 05 15:12:22 auth-worker(7448): Debug: sql(salut@isp6.lab): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'salut@isp6.lab' AND pass = password('')
Oct 05 15:12:22 auth-worker(7448): Info: sql(salut@isp6.lab): unknown user
Oct 05 15:12:22 auth: Debug: master out: NOTFOUND 1
Oct 05 15:12:22 lmtp(7467): Debug: auth input:
Oct 05 15:12:22 lmtp(7467): Info: Disconnect from local: Client quit (in reset)
Oct 05 15:12:22 lmtp(7467): Debug: none: root=, index=, control=, inbox=, alt=
Oct 05 15:12:22 lmtp(7467): Info: Connect from local
Oct 05 15:12:22 auth: Debug: master in: USER 2 bla@isp6.lab service=lmtp
Oct 05 15:12:22 auth-worker(7448): Debug: sql(bla@isp6.lab): query: SELECT NULL AS password, 'Y' as nopassword, email AS user FROM accounts WHERE email = 'bla@isp6.lab' AND pass = password('')
Oct 05 15:12:22 auth-worker(7448): Info: sql(bla@isp6.lab): unknown user
Oct 05 15:12:22 auth: Debug: master out: NOTFOUND 2
Oct 05 15:12:22 lmtp(7467): Debug: auth input:
Oct 05 15:12:22 lmtp(7467): Info: Disconnect from local: Client quit (in reset)
Похоже, что для поиска пользователя сделан SQL-запрос, но без пароля (конечно, у отправителя нет пароля получателя), поэтому пользователь не найден. Никаких запросов выполнять не следует, поскольку я установил userdb как статический, не должно быть никаких запросов для поиска пользователей. Думаю, я мог бы временно решить, добавив user_query.
PS: мой запрос пароля исходит из этого (для совместимости с MySQL PASSWORD): http://wiki2.dovecot.org/AuthDatabase/SQL#Password_verification_by_SQL_server
PPS: второй запрос sql предназначен для возвратного сообщения, которое безуспешно возвращается, чтобы сообщить, что почта не может быть доставлена.
Я наконец нашел решение. Postfix настроен на поиск в базе данных, в которой существует пользователь для доставки электронной почты, поэтому Dovecot не должен делать это при получении электронной почты от Postfix для доставки.
Вот как он должен работать и почему мы определяем статический user_db. Он пропустил один параметр, чтобы Dovecot не проверял, существует ли пользователь, потому что Postfix уже делает это:
/etc/dovecot/conf.d/auth-sql.conf.ext (только полезная часть):
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n allow_all_users=yes
}
Добавление allow_all_users=yes
параметр решил проблему.