Отправка почты из Linux через SMTP: установка и настройка msmtp и swaks
Ниже — рабочая настройка отправки писем из Linux через внешний SMTP-сервер. msmtp используем для скриптов и cron, swaks — для проверки соединения, TLS и авторизации.
1. Устанавливаем пакеты
Debian/Ubuntu:
apt update
apt install msmtp msmtp-mta swaks ca-certificatesRHEL/AlmaLinux/Rocky Linux:
dnf install msmtp swaks ca-certificates2. Проверяем DNS и доступность SMTP
getent hosts smtp.example.com
nc -vz smtp.example.com 587
openssl s_client -connect smtp.example.com:587 -starttls smtp -servername smtp.example.comДля implicit TLS на 465 используйте:
openssl s_client -connect smtp.example.com:465 -servername smtp.example.com3. Создаём конфигурацию msmtp
Для системного сервиса используйте отдельный файл, например /etc/msmtprc:
cat > /etc/msmtprc <<'EOF'
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account relay
host smtp.example.com
port 587
from alerts@example.com
user alerts@example.com
passwordeval "cat /etc/msmtp-secret"
tls_starttls on
account default : relay
EOF
install -m 600 /dev/null /etc/msmtp-secret
printf '%s\n' 'CHANGE_ME_APP_PASSWORD' > /etc/msmtp-secret
chmod 600 /etc/msmtprc /etc/msmtp-secret
touch /var/log/msmtp.log
chmod 600 /var/log/msmtp.logДля порта 465 замените порт и укажите tls_starttls off.
4. Проверяем конфигурацию без отправки
msmtp --version
msmtp --pretend -a relay recipient@example.net5. Отправляем тестовое письмо
printf 'From: alerts@example.com\nTo: recipient@example.net\nSubject: msmtp test\n\nTest message from server.\n' \
| msmtp -a relay recipient@example.net
echo $?Код возврата 0 означает, что SMTP-сервер принял сообщение. Затем проверьте лог:
tail -n 50 /var/log/msmtp.log6. Диагностика через swaks
swaks --server smtp.example.com --port 587 --tls \
--auth LOGIN --auth-user alerts@example.com \
--auth-password 'APP_PASSWORD' \
--from alerts@example.com --to recipient@example.netПароль в аргументах виден в истории и списке процессов, поэтому такой запуск годится только для разовой диагностики. После теста очистите shell history при необходимости и используйте секретный файл для production.
7. Подключаем к скрипту или cron
cat > /usr/local/sbin/send-alert.sh <<'EOF'
#!/bin/sh
TO='recipient@example.net'
SUBJECT="Server alert: $(hostname)"
printf 'From: alerts@example.com\nTo: %s\nSubject: %s\n\nBackup completed on %s at %s.\n' \
"$TO" "$SUBJECT" "$(hostname)" "$(date -Is)" | msmtp -a relay "$TO"
EOF
chmod 750 /usr/local/sbin/send-alert.sh
/usr/local/sbin/send-alert.sh8. Типовые ошибки
authentication failed— неверный login/app password или запрещён SMTP AUTH;certificate verification failed— неверное имя сервера, старая CA-база или перехват TLS;relay access denied— адрес From/получатель не разрешены политикой relay;connection timed out— firewall, DNS, неверный порт или блокировка провайдера;- порт 465 с
tls_starttls on— неправильный TLS-режим.
9. Rollback
cp -a /etc/msmtprc /root/msmtprc.backup 2>/dev/null || true
rm -f /etc/msmtprc /etc/msmtp-secret
apt remove msmtp msmtp-mta swaks # Debian/Ubuntu, если пакеты больше не нужныКритерий успеха: TLS-проверка проходит, swaks получает SMTP 250 после DATA, msmtp возвращает код 0, письмо приходит получателю, а пароль не хранится в открытом скрипте или командной строке.