Стало быть потребовалась smtp авторизация. Делал на базе уже существующего почтового сервера (FreeBSD+postfix)
Для начала необходимо дополнительно установить из портов cyrus-sasl2, saslauthd и pam_mysql. При помощи двух последних защифрованая пара логин/пароль будет передаваться в базу данных mysql, где хранятся почтовые акааунты пользователей зашифрованные функцией encrypt
Основная задача — сделать защищенную передачу пароля от пользователя к БД
Делаем
portinstall pam_mysql
Линкуем на /usr/lib, потому что система система ищет pam-модули именно там
ln -sf /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so
В /etc/pam.d создаём файл smtp со следующим содержимым
auth required pam_mysql.so user=mailer passwd=pwd host=127.0.0.1 db=mail table=users usercolumn=login passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mailer passwd=pwd host=127.0.0.1 db=mail table=users usercolumn=login passwdcolumn=password crypt=1
crypt=1 — именно этот параметр отвечает за щифрование
cyrus-sasl2 собираем без поддержки mysql и с поддержкой механизмов авторизации login/plain. Устанавливаем cyrus-sasl2-saslauthd
portinstall cyrus-sasl2-saslauthd cyrus-sasl2
В /etc/rc.conf.local пишем
saslauthd_enable="YES" saslauthd_flags="-n 10 -r -a pam"
Ключ -r полезен тем, у кого мульти-доменный почтовый сервер и в логине должна передаваться доменная часть почтового адреса
в /usr/local/lib/sasl2 создаём файл smtpd.conf, в который пишем следующее:
pwcheck_method: saslauthd mech_list: login plain sql_engine: mysql sql_user: mailer sql_passwd: pwd sql_hostnames: localhost sql_database: mail sql_verbose: true sql_select: select password from users where login = '%u@%r'
К рассмотрению принимаются два механизма авторизации login — пара логин/пароль передаётся в две строки, и plain — пара логин/пароль передаётся одной строкой. Все они шифруются base64
%u@%r — формат передачи в БД, пользователь@доменная_часть
Запуск
service saslauthd restart
В main.cf postfix’а нужно добавить параметры:
smtp_sasl_security_options = noanonymous smtp_sasl_auth_enable = yes smtp_sasl_password_maps = mysql:/usr/local/etc/postfix/sql/users.cf smtp_sasl_security_options = noplaintext, noanonymous smtpd_sasl_auth_enable = yes smtpd_sasl_path = smtpd smtpd_sasl_security_options = noanonymous smtpd_sasl_exceptions_networks = 192.168.4.40, 192.168.4.195 broken_sasl_auth_clients = yes
Перегрузка postfix и проверка. Для проверки механизма plain сначала сгенерируем пару логин/пароль средствами перла
perl -MMIME::Base64 -e 'print encode_base64("\0test\@mymailserver\000qqqqqq");’
Пользователь test экранируется нулем, пароль экранируется тремя нулями. В результатте получаем
AHRlc3RAbXltYWlsc2VydmVyAHFxcXFxcQ==
Соединяемся
telnet mymailserver 25
220 mymailserver ESMTP service ready (Postfix)
ehlo test
250-mymailserver
250-PIPELINING
250-SIZE 50000000
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth plain
334
AHRlc3RAbXltYWlsc2VydmVyAHFxcXFxcQ==
235 2.7.0 Authentication successful
Работает. Можно настраивать почтовый клиент. Еще всё это дело можно закрепить шифрованием канала между клиентом и сервером по SSL/TLS. Если что-то не заработало — смотрим maillog и messages

- Системный администратор с 2000 года
- Участник Freelancehunt, Хабр Q&A, cyberforum
- Кейсы