linux-labs

Вики / Службы и systemd

Postfix (почтовый сервер)

Сервис Ubuntu 24.04 · Postfix СлужбыПочтаСеть

Отправка и приём почты — конфиг, очередь, логи, типичная отладка доставки.

Postfix — MTA (агент пересылки почты): отправляет, принимает и маршрутизирует email по SMTP. Часто ставят просто для исходящих уведомлений с сервера. Служба postfix под systemd; конфиг /etc/postfix/main.cf.

systemctl status postfix
postconf -n                        # действующая конфигурация (только изменённое от дефолта)
ss -tlnp | grep -E ':25|:587'      # слушает ли SMTP (см. ss)
postconf -n                        # текущие настройки (изменённые)
postconf inet_interfaces mynetworks relayhost   # конкретные параметры
sudo postconf -e 'myhostname=mail.example.com'  # изменить параметр
sudo postconf -e 'relayhost=[smtp.provider.com]:587'   # слать через смартхост
sudo systemctl reload postfix

# очередь писем
mailq                              # = postqueue -p — что застряло и почему
postqueue -f                       # форсировать повторную отправку всей очереди
postqueue -i <QUEUEID>             # один конкретный элемент
postcat -q <QUEUEID>               # посмотреть содержимое письма в очереди
sudo postsuper -d ALL              # удалить ВСЁ из очереди (осторожно!)
sudo postsuper -d ALL deferred     # только отложенные
echo "test" | mail -s "тема" you@example.com   # тестовое письмо (пакет mailutils)

Типовой кейс «сервер шлёт уведомления через внешний SMTP» (main.cf):

relayhost = [smtp.provider.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
echo '[smtp.provider.com]:587 user:pass' | sudo tee /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd      # собрать .db (после ЛЮБОЙ правки map!)
sudo systemctl reload postfix

Письма не уходят / висят в очереди

mailq покажет причину рядом с каждым письмом. Лог: journalctl -u postfix или /var/log/mail.log. Частое: получатель отверг, нет обратного DNS (PTR), порт 25 закрыт провайдером (тогда слать через relayhost:587).

Relay access denied

Postfix не пересылает чужую почту (anti-relay). Для своих сетей — mynetworks; для аутентифицированных — SASL. Не делай открытый релей (спам/блок-листы).

Письма попадают в спам

Нужны SPF/DKIM/DMARC-записи в DNS и корректный PTR (rDNS). Без них крупные провайдеры режут.

Поменял map, а не применилось

После правки sasl_passwd/transport/virtual всегда postmap файл (пересобрать .db) и reload.

Connection refused на 25

Слушает только localhost (inet_interfaces = loopback-only) или порт закрыт (firewall). Проверь ss -tlnp | grep :25 и postconf inet_interfaces.

postconf -n                        # действующий конфиг
mailq ; postqueue -f               # очередь / форс отправки
postcat -q ID                      # посмотреть письмо в очереди
journalctl -u postfix             # или /var/log/mail.log
sudo postmap /etc/postfix/sasl_passwd && sudo systemctl reload postfix
echo body | mail -s subj to@x      # тест

См. также