Якщо вашому застосунку на VPS потрібно надсилати листи (реєстрація, паролі, сповіщення), Postfix — стандартний вибір. Налаштуйте його правильно, інакше листи потраплятимуть у спам.
Встановлення Postfix
sudo apt update
sudo apt install -y postfix
# Тип: "Internet Site"
# Mail name: mail.example.com
Базовий /etc/postfix/main.cf
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = loopback-only # Лише локальна відправка
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
smtpd_banner = $myhostname ESMTP
# Обмеження
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
Налаштування DKIM через OpenDKIM
sudo apt install -y opendkim opendkim-tools
# Генерація ключів
sudo opendkim-genkey -s mail -d example.com -D /etc/opendkim/keys/example.com/
# Додати в DNS TXT:
# mail._domainkey.example.com → вміст mail.txt
# /etc/opendkim.conf:
Domain example.com
KeyFile /etc/opendkim/keys/example.com/mail.private
Selector mail
Тест відправки
sudo apt install -y mailutils
# Тест
echo "Test email from VPS" | mail -s "Test" your@gmail.com
# Логи
sudo tail -f /var/log/mail.log
Альтернатива: SMTP Relay через зовнішній сервіс
| Сервіс | Безкоштовний ліміт | Переваги |
|---|---|---|
| SendGrid | 100 листів/день | Висока доставність |
| Mailgun | 5000 листів/міс | Гарне API |
| Amazon SES | 62000 листів/міс | Найдешевше |
Часті помилки при налаштуванні relay
Більшість повідомлень у черзі Postfix на VPS ZevsHost пояснюються однією з трьох причин.
status=deferred (delivery temporarily suspended: connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out)
Саме так проявляється блокування портів 25/465/587 на вихідних з'єднаннях, про яку попереджає панель вище: Postfix намагається доставити лист напряму, з'єднання зависає, і зрештою лист залишається в черзі. Якщо порт для зовнішнього relay ще не відкритий за заявкою, листи накопичуватимуться в черзі, а не прийдуть з помилкою одразу — це збиває з пантелику під час діагностики.
SASL authentication failed; server smtp.sendgrid.net[...] said: 535 Authentication failed
Невірний логін або пароль у /etc/postfix/sasl_passwd для зовнішнього relay, або файл не перезібраний після правки: після будь-якої зміни обов'язково виконайте postmap /etc/postfix/sasl_passwd — Postfix читає не сам файл, а скомпільовану базу .db поруч із ним.
Client host rejected: cannot find your reverse hostname, [203.0.113.10]
Сервер-отримувач не знайшов PTR-запис для IP-адреси вашого VPS і відхилив з'єднання — це окрема від блокування firewall проблема, актуальна навіть при відкритих портах. PTR налаштовується через підтримку хостингу, а не через DNS-панель домену.
Порти для надсилання пошти
| Порт | Протокол | Коли використовується | Шифрування |
|---|---|---|---|
| 25 | SMTP | Сервер-сервер, пряма доставка | STARTTLS опційно |
| 465 | SMTPS | Надсилання із застосунку (implicit TLS) | TLS з початку з'єднання |
| 587 | Submission | Рекомендований порт для застосунків | STARTTLS обов'язковий |
Для relay через зовнішній сервіс використовуйте 587 або 465 — 25-й порт потрібен лише для прямої доставки між поштовими серверами і на VDS ZevsHost закритий за замовчуванням для всіх трьох, див. попередження на початку статті.
Коли власний Postfix не підходить
Якщо застосунок надсилає маркетингові або масові розсилки, а не транзакційні листи — Postfix і relay через SMTP вирішують лише частину завдання: без керування відписками, обробкою відмов (bounce) і репутацією відправника розсилка швидко потрапить у спам-фільтри отримувачів. Для таких завдань використовуйте HTTP API спеціалізованого сервісу розсилок, а не SMTP взагалі. Якщо застосунок уже вміє надсилати листи через HTTP API поштового провайдера — не розгортайте Postfix зовсім, це зайвий компонент для моніторингу й оновлень без вигоди.
Як перевірити результат
Перевіряйте не факт надсилання одного листа, а те, що черга не зростає і листи реально йдуть через relay:
# Черга: кількість deferred не повинна зростати
mailq | tail -20
# Тест SASL-авторизації до relay
swaks --to test@example.com --from you@example.com --server smtp.sendgrid.net:587 --auth LOGIN --auth-user apikey --auth-password YOUR_API_KEY --tls
# Перевірити, що лист реально пішов через relay, а не напряму
grep "relay=" /var/log/mail.log | tail -5
У логі після успішного надсилання через relay рядок має містити relay=smtp.sendgrid.net[...]:587, а не IP отримувача напряму. Якщо бачите прямий IP отримувача замість relay-хоста, значить relayhost у main.cf не застосувався — перевірте синтаксис і перезапустіть Postfix.