Debian.pro/

Про Debian


Отправка писем с сервера сайтами через exim4 и внешний сервер для приема почты. hubbed_hosts в exim4.

Доооолго думал, как назвать статью. В итоге всё-равно получилась хрень. Ну да ладно, в следующем абзаце, думаю, ситуация прояснится.
Типичная ситуация. Приходит человек к админу и говорит: «Слушай, у меня тут сайтик есть на виртуалке, я хочу с него письма о регистрации отправлять». Админ слушает это внимательно и радостно настраивает smtp-отправку с сайта. Я делаю так — https://debian.pro/276 , например. Человека переспрашивают «а ты точно не будешь письма принимать на этом домене?». «Да не, нафиг оно мне…»
Конструкция существует год, второй. Админ, который это настраивал в запое. Человеку с виртуалкой срочно и внезапно хочется заиметь ящик admin@hissite.tld. Он находит другого сисадмина, объясняет ситуацию, говорит, что хочет пользоваться ящиком через гугл/яндекс/web outlook/whatever. А вот тут начинается веселое. Админов ищут подешевле. Соответственно, всю ситуацию целиком видят далеко не все. Каюсь, из-за неопытности сам на такие грабли несколько раз наступал. Админ берет и настраивает почту на гугле. Прописывает MX-записи. Радуется, забирает денежки, уходит в запой.
Человек радостно пользуется своим ящиком ровно до того момента, пока не понимает, что письма с ящика robot@hissite.tld до его admin@ не доходят. А всё просто — локальный smtp-сервер на его виртуалочке (который и шлет роботные письма) считает, что он в полном ответе за домен hissite.tld и плевать ему на то, что написано в MX записях.
Находит человек третьего админа… А вот тут частенько начинается фееричное. Я видел разные подпорки вокруг своих лаконичных мануалов для обработки этой ситуации. Описывать их совсем не хочется. Лучше сразу напишу, как правильно делать с exim4.

Большая часть решений, к счастью, сводилась к использованию и написанию различных почтовых роутеров для exim’a. Разной степени удачности, разной степени быстродействия. Но мало кто догадался почитать доки хотя бы до середины и увидеть описание роутера hubbed_hosts. Суть его примерно в том, что он позволяет вручную определять, куда перенаправлять почту для определенных доменов, если она придет.
Собственно, robot@ отправляет письмо в admin@hisdomain.tld, письмо не улетает наружу (так как домен в exim4 прописан локальным). Но перед тем, как попасть в локальный ящик, письмо проходит через роутер hubbed_hosts. В котором мы напишем, чтобы письмо всё же ушло на правильный сервер.

Создадим файл, в котором будем описывать всё это:

root@server:~# touch /etc/exim4/hubbed_hosts

И напишем в него конфигурацию:


# Для доменов в ПДД Яндекса:
vlad.pro: mx.yandex.ru

# Для доменов в Google Apps:
domain1.tld: ASPMX.L.GOOGLE.COM:ALT1.ASPMX.L.GOOGLE.COM:ALT2.ASPMX.L.GOOGLE.COM:ASPMX2.GOOGLEMAIL.COM:ASPMX3.GOOGLEMAIL.COM:ASPMX4.GOOGLEMAIL.COM:ASPMX5.GOOGLEMAIL.COM

# Для доменов в Office 360:
domain2.tld: domain2-tld.mail.eo.outlook.com.

Комментировать тут особенно нечего. Пачка доменных имен через двоеточие, первое из которых — сам домен, который будет обрабатываться как hubbed, дальше через двоеточия все его MX-хосты в порядке приоритета по убыванию.

Помимо прочего, такую конструкцию можно использовать для организации второго почтового сервера, который будет копить у себя почту во время «отсутствия» основного. И, соответственно, выплевывать её на основной, когда он вернется в сеть. При том такая конструкция будет кушать значительно меньше ресурсов, чем полноценный почтовый сервер. Может быть, для почты это и не очень актуально (почтовые серверы очень редко дропают письмо после первой попытки отправки), но лишним бывает редко.
Можно её использовать и для ручной маршрутизации почты внутри своей сети (например для случая, когда между серверами есть локальный канал, который не будет использоваться, если почту между ними пулять в MX).


Комментарии (34):

  1. Андрей :

    Спасибо очень помогло :)

  2. Та не за чт.

  3. Alfi :

    Наконец-то нормальное решение …
    а то лично я задолбался уже редиректить через внешний ящик

  4. motomac :

    А как сделать то же самое с Postfix?

  5. motomac :

    Что указывать вместо domain1.com и mail.example.com?
    У меня один домен.

  6. domain1.com — домен, почту которого нужно форвардить.
    mail.example.com — smtp-сервер, на который пересылать почту.

  7. motomac :

    В случае с Google Apps это ASPMX.L.GOOGLE.COM?

  8. motomac :

    К сожалению, так ничего и не выходит.

  9. постфикс то порестартили? В логах что?
    Файл покажите, в который писали

  10. motomac :

    Да, перезапускал, конечно.

    Файл transport:
    domain.ru smtp:[aspmx.l.google.com]

    В логе:
    Nov 10 15:43:26 test postfix/error[3471]: 819CC2A40CED: to=, relay=none, delay=0.24, delays=0.14/0/0/0.1, dsn=5.0.0, status=bounced (User unknown in virtual alias table)

  11. А почему у вас to пустое?

  12. в main.cf что добавили?

  13. motomac :

    to вырезал парсер.

    Разобрался. Оказалось, что в конфиге постфикса myhostname был указан как test.com.
    Спасибо!

  14. Не за чт)
    Удачи

  15. mike :

    Спасибо. Очень помогло.

  16. Не за что.

  17. Сергей :

    У меня не получилось.
    В логе все равно пишет R=localuser_fwd_only T=devnull
    Что не так?

  18. В конфиги руками лезли, кроме хаббеда?

  19. Сергей :

    Нет, конфигурацию вообще не менял. А там нужно что-то дописать для хаббеда? Я думал с дефолтной конфигурацией будет работать.

  20. Сергей :

    Нашел такой файл: /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts
    Такое содержимое:
    hubbed_hosts:
    debug_print = «R: hubbed_hosts for $domain»
    driver = manualroute
    domains = «${if exists{CONFDIR/hubbed_hosts}\
    {partial-lsearch;CONFDIR/hubbed_hosts}\
    fail}»
    same_domain_copy_routing = yes
    route_data = ${lookup{$domain}partial-lsearch{CONFDIR/hubbed_hosts}}
    transport = remote_smtp

  21. Хм. А ящик не в fqdn сервера, случаем?
    Вообще я тут гадать не возьмусь, миллион причин может быть.

    Лучше всего попробовать удалить пакеты exim с —purge, удалить /etc/exim4 и попробовать заново (если ничего ценного там не настраивали).

  22. Сергей :

    «Хм. А ящик не в fqdn сервера, случаем?» — не знаю даже как проверить…
    На этом VPS установлена VestaCP и я боюсь удалять почтовик и опять его ставить, вдруг что-то отвалится….
    Я создал тему на форуме панели. Если дадут рабочий ответ то отпишу здесь решение.

  23. Оу. Ну так с панели и надо было начинать )
    Она там что угодно могла устроить в конфигах — нужно пофайлово сравнивать оригинальный конфиг и панельный (ну и проверить, что exim из /etc/exim конфиг берет, если там вообще exim).

  24. Спасибо за полезную инфу. День потратил в поисках решения с exim4, что самое интересное сам сервек выдавал MX-запись домена, а вот exim4 не видел её. Теперь работает.

  25. Алексей :

    Спасибо автору, помогло, благо гугл помог быстро найти.

  26. inkvizitor68sl :

    По какому запросу нашлось-то, хоть?

  27. Евгений :

    Нашел по запросу «exim письмо себе на внешний mail» в гугле)

  28. Евгений :

    Подскажите пожалуйста, почему может не работать? Я создал hubbed_hosts рядом с exim4.conf.template, задал такого же владельца, вписал mydomain.com: emx.mail.ru, сделал service exim4 restart
    Но при попытке отправить письмо с сайта все равно получаю от своего локального МТА ошибку: The following address(es) failed: Unknown user
    Что я делаю не так?

  29. grep -rni hubbed_hosts /etc/exim что говорит?
    debian какой? exim какой?

  30. Евгений :

    exim 4.93, Ubuntu 20.04.1 LTS

    grep -rni hubbed_hosts /etc/exim4
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:2:# router/150_exim4-config_hubbed_hosts
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:10:hubbed_hosts:
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:11: debug_print = «R: hubbed_hosts for $domain»
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:13: domains = «${if exists{CONFDIR/hubbed_hosts}\
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:14: {partial-lsearch;CONFDIR/hubbed_hosts}\
    /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts:17: route_data = ${lookup{$domain}partial-lsearch{CONFDIR/hubbed_hosts}}

  31. > Ubuntu 20.04.1 LTS
    Миллион причин может быть.
    Проверяйте, что 25й порт — это действительно exim, попробуйте его порестартить и тыды.
    Плюс в убунте оно может быть в принципе сломано, у них бывает.

Написать комментарий