Перейти к основному содержимому

Как настроить Exim для работы с Postbox

· 8 мин. чтения

Чтобы отправлять почту через Postbox, нужен почтовый сервер, который будет ходить в Postbox по SMTP с авторизацией и TLS. В этой статье я расскажу, как настроить Exim на Ubuntu 24.04 для отправки почты через Postbox по 587 порту. Покажу два способа: простой режим smarthost от Debian и собственный роутер — на случай, если режима smarthost вам недостаточно.

Начнём с создания виртуальной машины на Ubuntu 24.04. Имя укажем demo, а имя пользователя — yc-user. Они не обязательно должны быть именно такими, но так проще ориентироваться в статье, понимая, откуда взялись эти значения.

Подготовка

Нам потребуется настроенный адрес в Postbox и API-ключ для отправки почты.

Создадим API-ключ

  1. Создайте сервисный аккаунт. Он обязательно должен быть в том же каталоге, что и адрес в Postbox.
  2. Добавьте ему роль postbox.sender.
  3. Создайте 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; собственный роутер пригодится, когда нужен более явный контроль над маршрутизацией.