Как настроить Exim для работы с Postbox
Чтобы отправлять почту через Postbox, нужен почтовый сервер, который будет
ходить в Postbox по SMTP с авторизацией и TLS. В этой статье я расскажу, как настроить Exim на Ubuntu 24.04 для
отправки почты через Postbox по 587 порту. Покажу два способа: простой режим smarthost от Debian и собственный роутер —
на случай, если режима smarthost вам недостаточно.
Начнём с создания виртуальной машины на Ubuntu 24.04. Имя укажем demo, а имя пользователя — yc-user. Они не
обязательно должны быть именно такими, но так проще ориентироваться в статье, понимая, откуда взялись эти значения.
Подготовка
Нам потребуется настроенный адрес в Postbox и API-ключ для отправки почты.
Создадим API-ключ
- Создайте сервисный аккаунт. Он обязательно должен быть в том же каталоге, что и адрес в Postbox.
- Добавьте ему роль
postbox.sender. - Создайте API-ключ и скопируйте его. Для большей безопасности можно ограничить скоуп прав ключа той же ролью
postbox.sender.
В дальнейшем нам понадобятся два значения:
- Идентификатор ключа вида
aje***— это будет имя пользователя при авторизации, как указано в документации. - API-ключ вида
AQVN***— это будет пароль.
Про сетевую доступность
В Yandex Cloud исходящий 25 порт заблокирован на публичный интернет, поэтому отправлять почту напрямую на MX-серверы получателей не получится — нужен релей. А вот до самого Postbox можно ходить и по 587, и по 25 порту: оба открыты на исходящие соединения и принимают почту с STARTTLS и авторизацией. Проверить это можно прямо с виртуальной машины:
# 25 порт на публичный MX — закрыт (соединение не устанавливается)
timeout 8 bash -c 'exec 3<>/dev/tcp/gmail-smtp-in.l.google.com/25' || echo "публичный 25 заблокирован"
# 587 порт до Postbox — открыт
timeout 8 bash -c 'exec 3<>/dev/tcp/postbox.cloud.yandex.net/587' && echo "Postbox 587 доступен"
# 25 порт до самого Postbox — тоже открыт
timeout 8 bash -c 'exec 3<>/dev/tcp/postbox.cloud.yandex.net/25' && echo "Postbox 25 доступен"
В этой статье мы используем порт 587 как рекомендуемый порт submission, но если вам нужен 25 — просто замените ::587
на ::25 в настройках ниже, всё будет работать так же (STARTTLS и авторизация остаются обязательными).
Так как мы только отправляем почту (релеим через Postbox), а не принимаем входящие подключения, никаких правил во входящем фаерволе или группе безопасности открывать не нужно.
Установка Exim
Установим exim4:
sudo apt-get update
sudo apt-get install -y exim4
На Ubuntu 24.04 ставится Exim 4.97. Проверить версию:
exim4 --version | head -n 1
# Exim version 4.97 ...
Дальше можно пойти двумя путями. Способ A (smarthost) — самый простой и рекомендуемый: вся неместная почта уходит в Postbox с авторизацией и TLS. Способ B (собственный роутер) — для тех случаев, когда нужно больше контроля над маршрутизацией.
В обоих способах учётные данные Postbox лежат в одном и том же файле /etc/exim4/passwd.client.
Способ A: режим smarthost (рекомендуется)
Настройка через мастер
Конфигурацию Exim в Debian/Ubuntu удобно менять через мастер:
sudo dpkg-reconfigure exim4-config
В мастере выберите «mail sent by smarthost; no local mail» (или «mail sent by smarthost; received via SMTP or fetchmail»),
а в качестве smarthost укажите postbox.cloud.yandex.net::587 (обратите внимание на двойное двоеточие перед портом —
это синтаксис Exim).
Настройка через файл
То же самое можно сделать, отредактировав /etc/exim4/update-exim4.conf.conf:
sudo vim /etc/exim4/update-exim4.conf.conf
dc_eximconfig_configtype='smarthost'
dc_other_hostnames='nikolaymatrosov.ru'
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost='nikolaymatrosov.ru'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='postbox.cloud.yandex.net::587'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
Не забудьте заменить nikolaymatrosov.ru на ваш домен. Здесь важны:
dc_smarthost='postbox.cloud.yandex.net::587'— релей и порт.dc_readhostиdc_hide_mailname='true'— Exim перепишет домен отправителя вnikolaymatrosov.ru. Это нужно, чтобы вMAIL FROMоказался подтверждённый в Postbox адрес, а неyc-user@demo.ru-central1.internal.
Запишите ваш домен в /etc/mailname:
echo 'nikolaymatrosov.ru' | sudo tee /etc/mailname
Учётные данные Postbox
Положите идентификатор ключа и API-ключ в /etc/exim4/passwd.client:
sudo vim /etc/exim4/passwd.client
postbox.cloud.yandex.net:aje***:AQVN***
Где aje*** — идентификатор ключа, а AQVN*** — сам API-ключ. Выставьте права, чтобы файл с секретом не читал кто попало:
sudo chown root:Debian-exim /etc/exim4/passwd.client
sudo chmod 640 /etc/exim4/passwd.client
Отдельный аутентификатор настраивать не нужно — конфигурация Debian по умолчанию уже умеет авторизоваться через
PLAIN/LOGIN, считывая логин и пароль из passwd.client. Причём PLAIN/LOGIN отправляются только поверх TLS, что
как раз требует Postbox.
Применение и проверка
Соберите конфигурацию и перезапустите Exim:
sudo update-exim4.conf
sudo systemctl restart exim4
Проверьте маршрутизацию — куда пойдёт письмо для внешнего адреса:
exim4 -bt nikolaymatrosov@gmail.com
Должно получиться примерно так:
R: smarthost for nikolaymatrosov@gmail.com
nikolaymatrosov@gmail.com
router = smarthost, transport = remote_smtp_smarthost
host postbox.cloud.yandex.net [158.160.78.193] port=587
Тестовое письмо
Создайте файл с письмом:
vim email.txt
From: "Exim test" <exim@nikolaymatrosov.ru>
To: reciver@example.com
Subject: Demo from Exim
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Hello,
This is a test email sent using Exim.
Не забудьте заменить адреса отправителя и получателя на свои. Адрес отправителя должен быть подтверждён в Postbox.
Отправьте письмо. Флаг -v покажет SMTP-диалог, а -f задаёт адрес в конверте (MAIL FROM):
sudo exim4 -v -f exim@nikolaymatrosov.ru reciver@example.com < email.txt
Если всё настроено правильно, в выводе будет видно установление TLS, успешную авторизацию и приём письма:
Connecting to postbox.cloud.yandex.net [158.160.78.193]:587 ... connected
SMTP<< 220 postbox.cloud.yandex.net ESMTP Service Ready
SMTP>> EHLO exim.ru-central1.internal
SMTP<< 250-STARTTLS
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Ready to start TLS
SMTP>> EHLO exim.ru-central1.internal
SMTP<< 250-AUTH LOGIN PLAIN
SMTP>> AUTH PLAIN ****
SMTP<< 235 2.0.0 Authentication succeeded
SMTP|> MAIL FROM:<exim@nikolaymatrosov.ru> SIZE=1599
SMTP|> RCPT TO:<reciver@example.com>
SMTP<< 250 2.0.0 Roger, accepting mail from <exim@nikolaymatrosov.ru>
SMTP<< 250 2.0.0 I'll make sure <reciver@example.com> gets this
SMTP<< 250 2.6.0 OK: queued as DJBBPS38THHD.UW03LRMW9CP7@ingress2-vla
А в /var/log/exim4/mainlog появится запись об успешной доставке:
=> reciver@example.com R=smarthost T=remote_smtp_smarthost
H=postbox.cloud.yandex.net [158.160.78.193]
X=TLS1.3:...:128 CV=yes A=plain
C="250 2.6.0 OK: queued as DJBBPS38THHD.UW03LRMW9CP7@ingress2-vla"
Ключевые признаки успеха: A=plain (прошла авторизация), CV=yes (сертификат Postbox проверен) и 250 ... OK: queued.
Способ B: собственный роутер (для тонкой настройки)
Если режима smarthost мало (например, нужно явно управлять маршрутом и не давать почте «провалиться» в dnslookup),
можно описать собственный роутер. Для этого включим раздельную конфигурацию Debian (split config).
Отредактируйте /etc/exim4/update-exim4.conf.conf:
dc_eximconfig_configtype='internet'
dc_other_hostnames='nikolaymatrosov.ru'
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost='nikolaymatrosov.ru'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
Сгенерируйте дерево конфигурации:
sudo update-exim4.conf
Создайте роутер /etc/exim4/conf.d/router/050_send_via_postbox. Префикс 050 важен: он меньше, чем у штатного
роутера 200_exim4-config_primary (dnslookup), поэтому наш роутер сработает раньше:
send_via_postbox:
driver = manualroute
domains = ! +local_domains
transport = postbox_smtp
# ходим в Postbox напрямую, без MX, на 587 порт
route_list = * postbox.cloud.yandex.net::587 byname
# не проваливаемся в dnslookup, даже если что-то пойдёт не так
host_find_failed = ignore
no_more
Создайте транспорт /etc/exim4/conf.d/transport/05_postbox_smtp:
postbox_smtp:
driver = smtp
hosts_require_auth = postbox.cloud.yandex.net
hosts_require_tls = postbox.cloud.yandex.net
Порт указывать в транспорте не нужно — он уже задан в route_list (::587). Авторизацию, как и в способе A, возьмёт на
себя штатный аутентификатор Debian, читающий /etc/exim4/passwd.client. Если вы ещё не создали этот файл — сделайте это
по инструкции из способа A.
Примените конфигурацию и перезапустите Exim:
sudo update-exim4.conf
sudo systemctl restart exim4
Убедитесь, что ваш роутер стоит перед dnslookup:
exim4 -bP routers | grep router:
# send_via_postbox router: <-- должен быть первым
# ...
# dnslookup router:
И проверьте маршрут:
exim4 -bt nikolaymatrosov@gmail.com
# router = send_via_postbox, transport = postbox_smtp
# host postbox.cloud.yandex.net [158.160.78.193] port=587
Дальше отправьте тестовое письмо так же, как в способе A:
sudo exim4 -v -f exim@nikolaymatrosov.ru reciver@example.com < email.txt
В логе доставка пойдёт уже через ваш роутер:
=> reciver@example.com R=send_via_postbox T=postbox_smtp
H=postbox.cloud.yandex.net [158.160.78.193] X=TLS1.3:...:128 CV=yes A=plain
C="250 2.6.0 OK: queued as ..."
Возможные проблемы
identity not found
Если в SMTP-диалоге вы видите примерно такое:
MAIL From:<yc-user@demo.ru-central1.internal> ...
550 5.4.1 identity not found RequestID: ...
значит, в конверте оказался не подтверждённый в Postbox адрес. Проверьте, что:
- адрес отправителя (
-fи/или заголовокFrom) — это подтверждённый в Postbox адрес; - в
update-exim4.conf.confзаданdc_readhost(ваш домен) иdc_hide_mailname='true', чтобы Exim переписывал домен отправителя.
Письмо всё равно уходит в dnslookup
Если exim4 -bt показывает R: dnslookup вместо send_via_postbox, ваш роутер либо не загрузился (неверный путь/имя
файла), либо стоит после dnslookup. Префикс 050_ и директива no_more как раз и нужны, чтобы этого не происходило.
В режиме smarthost (способ A) такой проблемы нет — там вся неместная почта по умолчанию уходит в smarthost.
Итого
Мы установили Exim на Ubuntu 24.04 и настроили отправку почты через Postbox по 587 порту с TLS и авторизацией. В большинстве случаев достаточно простого режима smarthost; собственный роутер пригодится, когда нужен более явный контроль над маршрутизацией.