Признаться честно, точно не вспомню, когда в последний раз заморачивался с настройками полноценного почтового сервера. Помнится, были потуги и с Communigate Pro и c Qmail, но с приходом почтовых сервисов от Google, Yandex, Mail и т.д, - необходимость в поддержке почты сама собой отпала, а "дефолтная" установка очередной FreeBSD само собой подразумевало отключенный sendmail.
Понятное дело, жить без почты совсем было не всегда удобно и на помощь приходили различные библиотеки и модули, позволявшие эту, по-большому счету, не самую сложную функцию реализовать. Все выше сказанное можно смело назвать "небольшим лирическим отступлением", так как дальше речь пойдет совсем о другом, а именно в подмене штатного freebsd-шного sendmail на ssmtp.
Принцип работы SSMTP
Стандартное описание почтового агента, которое можно почерпнуть, например, при поиске его в пакетах, гласит примерно следующее: простейший MTA для выброски писем из системы через почтовый хаб (Extremely simple MTA to get mail off the system to a mail hub). Именно этим ssmtp и занимается: рассылает сообщения, через сторонний smtp-сервер.
Написано про это было много, но без трудностей, как водится не обошлось, поэтому пишу и я - может кому будет полезно. Ну, да хватит "воды", задача стояла следующая: настроить ssmtp в Freebsd с рассылкой через почтовый ящик в G-Suite.
Шаг 1. Выключаем sendmail
Для этого в /etc/rc.conf должны появиться следующие строки:
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
На самом деле в FreeBSD 12, которая использовалась в конкретном примере, так много писать уже не нужно, достаточно:
sendmail_enable="NONE"
остальные строки предусмотрены в сценарии: /etc/rc.d/sendmail
Шаг 2. Устанавливаем ssmtp из пакетов
> pkg install ssmtp
Шаг 3. Добиваем штатный sendmail
Убиваем процессы, если они остались
> killall sendmail
Правим /etc/mail/mailer.conf
> vi /etc/mail/mailer.conf
sendmail /usr/local/sbin/ssmtp
send-mail /usr/local/sbin/ssmtp
mailq /usr/local/sbin/ssmtp
newaliases /usr/local/sbin/ssmtp
hoststat /usr/bin/true
purgestat /usr/bin/true
Переименовываем оригинальный sendmail и делаем линк с ssmtp
> mv /usr/sbin/sendmail /usr/sbin/sendmail.old
> ln -s /usr/local/sbin/ssmtp /usr/sbin/sendmail
Шаг 4. Настраиваем права
Добавляем пользователя ssmtp, включаем его в группу ssmtp (которая уже создалась при установке из пакетов)
> pw useradd ssmtp -g ssmtp -h - -s /usr/sbin/nologin -d /nonexistent -c "sSMTP"
Переходим в каталог ssmtp
> cd /usr/local/etc/ssmtp
Создаем конфигурационный файл
> cp ssmtp.conf.sample ssmtp.conf
Устанавливаем владельцев и права для каталога и конфига
> chown ssmtp:ssmtp . ssmtp.conf
> chmod 4750 . ssmtp.conf
Шаг 5. Правим конфиг
> vi /usr/local/etc/ssmtp/ssmtp.conf
root=
rewriteDomain=domain.com
mailhub=smtp.gmail.com:587
hostname=smtp.gmail.com:587
AuthUser=hub@domain.com
AuthPass=password
FromLineOverride=YES
UseTLS=YES
UseSTARTTLS=Yes
В моем случае (G-Suite на домене domain.com) почта для root-а будет приходить на root@domain.com, для user1 - на user1@domain.com и так далее. Если почта всего одна (hub@domain.com), следует поменять две первые строки на:
root=hub@domain.com
rewriteDomain=
Конечно, в этом случае мониторинг будет, мягко говоря, не полным и, понятное дело, вместо "hub@domain.com" и "password" будет имя почтового ящика на Gmail и пароль.
Шаг 6. Письмо другу
Вроде всё готово, пытаемся отправить письмо другу:
> echo "Test" | mail -s "Hello, friend!" friend@myfriends.com
И получаем в ответ: sendmail: Authorization failed (535 5.7.8 https://support.google.com/mail/?p=BadCredentials)
Шаг 7. Корректируем настройки аккаунта Google
В двух словах, нам нужно разрешить доступ к почтовому аккаунту для "ненадежных приложений". Конечно, звучит это жутковато, но если вдуматься, то мы всего-навсего настраиваем почтовый ящик-посредник или "хаб", через который ssmtp будет слать почту.
Как это сделать ниже в серии скриншотов (жмем, чтобы увеличить).
Если Вы настраиваете ящик в G-Suite, пригодятся все, если просто на gmail - последние четыре.
Шаг 8. Проверка работы
Если всё сделали правильно, Ваш друг получит на ящик friend@myfriends.com письмо от hub@domain.com, причем имя отправителя будет соответствовать имени пользователя системы, от которого Вы выполнили эту команду:
> echo "Test" | mail -s "Hello, friend!" friend@myfriends.com
P.S.
Какие ещё могут быть ошибки
sendmail: Cannot open mailhub:25 - намудрили в правах (см. Шаг 4)
sendmail: Cannot open smtp.gmail.com:587 - что-то не так в конфиге (см. Шаг.5)
И, конечно, установку и настройку осуществляем через sudo (или под root-ом, как у Вас это настроено)