Linux

Отправка почты из Linux через SMTP: установка и настройка msmtp и swaks

Ниже — рабочая настройка отправки писем из Linux через внешний SMTP-сервер. msmtp используем для скриптов и cron, swaks — для проверки соединения, TLS и авторизации.

1. Устанавливаем пакеты

Debian/Ubuntu:

apt update
apt install msmtp msmtp-mta swaks ca-certificates

RHEL/AlmaLinux/Rocky Linux:

dnf install msmtp swaks ca-certificates

2. Проверяем 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.com

3. Создаём конфигурацию 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.net

5. Отправляем тестовое письмо

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.log

6. Диагностика через 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.sh

8. Типовые ошибки

  • 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, письмо приходит получателю, а пароль не хранится в открытом скрипте или командной строке.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *