Я пытаюсь настроить Postfix, чтобы пользователи могли отправлять электронную почту через SMTP, имея имя пользователя и пароль. И я пытаюсь сохранить учетные данные в базе данных MySQL. Я пошел по пути saslauthd
и pam
и я застрял на полпути.
Включив функцию отладки pam, я вижу, что когда я пытаюсь отправить электронное письмо с помощью Thunderbird, выполняется запрос для получения пароля:
pam_mysql - SELECT password FROM mailbox WHERE username = 'mehran'
Это в том случае, если имя пользователя содержит значение mehran@example.com
. Но когда я пытаюсь:
# testsaslauthd -u mehran@example.com -p 123 -s smtp
0: OK "Success."
И журнал гласит:
pam_mysql - SELECT password FROM mailbox WHERE username = 'mehran@example.com'
Показывает, что именно Postfix опускает @domain из имени пользователя перед тем, как передать его saslauthd
(или, по крайней мере, я так считаю). Я просмотрел конфигурацию Postfix, но не вижу, что на это влияет !?
Я нашел проблему, так что вот она на случай, если это кому-то поможет:
Есть файл конфигурации для saslauthd
, шахта находится в /etc/sysconfig/saslauthd
:
# Directory in which to place saslauthd's listening socket, pid file, and so
# on. This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam
# Options sent to the saslauthd. If the MECH is other than "pam" uncomment the next line.
# DAEMONOPTS=--user saslauth
# OPTIONS="-c -r -m /var/spool/postfix/var/run/saslauthd"
OPTIONS="-c -m /var/run/saslauthd"
# Additional flags to pass to saslauthd on the command line. See saslauthd(8)
# for the list of accepted flags.
FLAGS=
В OPTIONS
переменная должна содержать параметры, переданные в saslauthd
. Это отсутствует -r
который делает именно то, что я искал. Согласно его документация:
-r Объединить область с логином (со знаком ’@’ между ними). например login: "foo" realm: "bar" будет передан как логин: "foo @ bar". Обратите внимание, что область все равно будет передана, что может привести к неожиданному поведению.
Но моя проблема не была решена только этим изменением! Оказалось, что из-за какой-то ошибки в /etc/init.d/saslauthd
скрипт, хотя упомянутый выше файл конфигурации загружен, но не применяется! В $OPTIONS
никогда не использовался !!!
Вот исходный начальный раздел /etc/init.d/saslauthd
сценарий:
start() {
[ -x $path ] || exit 5
echo -n $"Starting $prog: "
daemon $DAEMONOPTS $path -m $SOCKETDIR -a $MECH $FLAGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
return $RETVAL
}
И вот как я это исправил:
start() {
[ -x $path ] || exit 5
echo -n $"Starting $prog: "
daemon $DAEMONOPTS $path $OPTIONS -a $MECH $FLAGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
return $RETVAL
}
Все сделано! Теперь запрос содержит полный адрес электронной почты для проверки пароля.
Ваш запрос содержит неправильный / неполный параметр для запроса.
Этот запрос добавит домен к локальной части логина:
SELECT password FROM mailbox WHERE username = '%u@%r'
Исправьте запрос в вашей конфигурации SASL для постфикса, например /etc/postfix/sasl/smtpd.conf