Страница 1 из 2

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 9:15:54
Иван Петров
Нужно сделать почту внутри локальной сети плюс возможность посылать и получать внешнюю почту через smarthost на ящик mail.ru.

Похоже, что ни одно из известных мне решений в exim не работает как следует.
Вроде задача элементарная. Но осложняется тем, что mail.ru требует совпадения SMTP-аутентификации, поля MAIL FROM (envelope from) и наверное еще поля From письма.

Самым логичным было бы изменение полей в транспорте с помощью headers_rewrite, но exim почему-то не поддерживает изменение envelope-полей в headers_rewrite.

Есть другое решение - изменение адреса в /etc/email-addresses или в rewrite, что по-сути одно. Это работает. Но в этом случае адреса изменяются и у локальной почты, и у всех становится один исходящий адрес, что совершенно не нужно. Нужно для локальной почты иметь локальные адреса, а для почты снаружи - внешние.

Вариант с заменой адреса отправителя в почтовой программе пользователя не вариант - нужно иметь и локальный адрес, и внешний, а значит будет неизбежна путаница. Да и не правильно обременять пользователей выбором правильного исходящего адреса.

Попутно, вырисовывается еще одна проблема - если получится как-то заранее поменять адреса в исходящей через smarthost почте (на адрес mail.ru), то в случае ошибок отправки еще на этапе передачи на mail.ru (не удалось отправить на mail.ru - превышен размер, нет адресата, сбой) сообщения будут направляться не автору письма в локальной сети, а на внешний почтовый ящик mail.ru - это плохо, отправитель не узнает об ошибке.

В транспорте нашел transport_filter - запуск внешней программы-фильтра. Попробовал поменять им адреса. Не помогает, MAIL FROM остается исходным.

Подскажите, как эту проблему наиболее корректно решить? Быть может, можно скрипт perl куда-то подключить? У exim очень много возможностей, я только начинаю кое-что понимать.

Я подобную задачу сначала попробовал реализовать на Postfix, все получилось и довольно быстро. Но в будущем понадобится реализовывать нестандартные алгоритмы работы с почтой (отправка почты после утверждения проверяющим, "пре-модерация" сообщений от некоторых пользователей, разные алгоритмы прохождения почты для разных подразделений, отчеты об отправленной почте и ее вложениях), и думаю, EXIM тут будет более гибок.
Примечание - работать потом это будет не с mail.ru, его я выбрал для освоения почтовой системы и поиска решений задач. Но может, и mail.ru тоже будет участвовать в работе системы.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 21:31:33
xM
По поводу перезаписи заголовков см.
http://www.exim.org/exim-html-current/d ... iting.html

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 22:15:26
Иван Петров
xM писал(а): По поводу перезаписи заголовков см.
http://www.exim.org/exim-html-current/d ... iting.html
Спасибо, я сам с этого и начинал.
Вот цитата из этой страницы:
For rules that are part of the headers_rewrite generic transport option, E, F, T, and S are not permitted.
Я это и сам проверил на практике - действительно, поле конверта FROM (the envelope From field) не меняется в транспорте.
А поменять его можно в rewrite, но это не транспорт, и изменяется From конверта во ВСЕХ письмах, включая локальные.

Кстати, появилась идея, не правильная, но на самый крайний случай может пригодиться. Можно поменять в rewrite поле From конверта ВСЕХ писем (и локальных, и предназначенных наружу), а в исходящем транспорте менять поле From письма.
Но тогда придется отказаться от проверки для локальных пользователей соответствия имени аутентификации и поля From, что может быть использовано для отправки писем от чужого имени.
А вот еще кажется проблема поважнее появится - ответы о статусе доставки (об ошибках) будут отправляться не локальным пользователям, а внешнему пользователю. Так как они кажется отправляются на адрес from конверта.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 22:45:43
xM
envelope вы не поменяете, а From вполне (f). По идее, при наличии авторизации на отправку (а она там, вроде бы, обязательна) этого должно быть достаточно.

Отправлено спустя 4 минуты 37 секунд:
UPD. Или посмотрите вариант с biz.mail.ru для вашего домена. Тогда я думаю вообще ничего переписывать не придётся.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 22:50:01
Иван Петров
xM писал(а): envelope вы не поменяете, а From вполне (f). По идее, при наличии авторизации на отправку (а она там, вроде бы, обязательна) этого должно быть достаточно.
Нет, сессия прерывается еще на этапе конверта из-за несоответствия From конверта и имени в аутентификации:

Код: Выделить всё

1chjZW-0000j3-7F ** user1@mail.ru R=smarthost T=remote_smtp_smarthost: SMTP error from remote mail server after RCPT TO:<user1@mail.ru>: host smtp.mail.ru [217.69.139.160]: 501 sender address must match authenticated user
Имя отправителя может отличаться, например в gmail.com - они просто сами переписывают его за вас.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:00:13
xM
А попробуйте таки в вашем транспорте для смартхоста

Код: Выделить всё

headers_rewrite       = *@your.domain foo@mail.ru Ffr
И проверьте трассировкой сессии проходит ли у вас аутентификация.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:12:58
Иван Петров
xM писал(а): А попробуйте таки в вашем транспорте для смартхоста
headers_rewrite = *@your.domain foo@mail.ru Ffr
И проверьте трассировкой сессии проходит ли у вас аутентификация.
Да, я с headers_rewrite уже испробовал множество раз в разных вариантах. Менял и в smtp_транспорте, и в локальном, и даже посылал на свой рукописный smtp-сервер, чтобы лучше понять, что происходит. И даже такой вариант, который меняет все возможные заголовки:

Код: Выделить всё

headers_rewrite       = *@* foo@mail.ru
Авторизация происходит, тут проблем нет.
Когда я с помощью rewrite менял заголовоки "rewrite = *@* foo@mail.ru Ffr" (включая From конверта), письмо успешно отправлялось.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:14:14
xM
Иван Петров писал(а): Когда я с помощью rewrite менял заголовоки "rewrite = *@* foo@mail.ru Ffr" (включая From конверта), письмо успешно отправлялось.
Тогда я не понимаю в чём проблема

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:19:43
Иван Петров
xM писал(а): Тогда я не понимаю в чём проблема
Иван Петров писал(а): Есть другое решение - изменение адреса в /etc/email-addresses или в rewrite, что по-сути одно. Это работает. Но в этом случае адреса изменяются и у локальной почты, и у всех становится один исходящий адрес, что совершенно не нужно. Нужно для локальной почты иметь локальные адреса, а для почты снаружи - внешние.
...
Попутно, вырисовывается еще одна проблема - если получится как-то заранее поменять адреса в исходящей через smarthost почте (на адрес mail.ru), то в случае ошибок отправки еще на этапе передачи на mail.ru (не удалось отправить на mail.ru - превышен размер, нет адресата, сбой) сообщения будут направляться не автору письма в локальной сети, а на внешний почтовый ящик mail.ru - это плохо, отправитель не узнает об ошибке.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:22:56
xM
У локальной при использовании headers_rewrite ничего не меняется. Потому что она через этот транспорт ходить не будет.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-01 23:46:00
Иван Петров
xM писал(а): У локальной при использовании headers_rewrite ничего не меняется. Потому что она через этот транспорт ходить не будет.
Совершенно верно. Но headers_rewrite не умеет менять адрес From конверта, так что нам от него сейчас мало толка. А менять его умеет begin rewrite, который находится в файле 00_exim4-config_header, и вот этот меняет везде, включая локальные письма.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-02 1:13:22
xM
Иван Петров писал(а): то в случае ошибок отправки еще на этапе передачи
Попробуйте error_to в роутере.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-02 10:20:02
Иван Петров
xM писал(а): Попробуйте error_to в роутере.
Хорошо, спасибо, буду иметь в виду.

Просто сейчас уже немного устал от борьбы с EXIM, от поисков, как преодолеть его ограничения.
Возможно, я ошибся, когда решил, что EXIM более гибок и удобен для реализации нестандартных схем работы с почтой.

Опять попробовал Postfix - там все просто, и почта отправляется через mail.ru, и адреса правильные - и локальные, и внешние, и сообщения о ошибках доставки приходят как и положено, локальным пользователям (правда, я пока не пытался сделать что-то действительно нестандартное).

Зачем он такой EXIM нужен (в моем случае), если с ним постоянно нужно бороться? Наверное проще использовать какую-то простую программу для отправки почты (таких кажется много, например, msmtp). Или самому на Python3 написать smtp-сервер, для него есть готовая качественная библиотека, и в программе обрабатывать адреса и заголовки именно так, как это нужно.

Еще вариант - доработать исходники Exim. Но это создаст проблему на всю жизнь - вместо простого обновления на новую версию нужно будет патчить исходники, дорабатывать их, компилировать.

Я пока еще ничего не решил, просто размышляю.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-06 9:59:55
Иван Петров
Проверил, должно ли при отправке на smtp.mail.ru поле From письма быть равно полям конверта и аутентификации сессии (про последние уже писал выше).
Должно. В скрипте на Perl указал другой адрес From письма, и вот что получил:

Код: Выделить всё

550 Message was not accepted -- it contains invalid headers.  More specially, 'From:' header must match user you are sending mail from.  See http://help.mail.ru/mail-help/mailer/popsmtp for details.
По указанной ссылке ничего интересного нет - там указаны адреса серверов и номера портов для настройки почтовых клиентов.

В Postfix с настройкой этих адресов проблем нет. Случайное совпадение, или нет? Кажется, больше программ тоже предпочитают Postfix - сразу вспоминаются Postfix Admin, iRedMail, по Posfix больше материалов в интернет. Случайно ли? Вот, я только начал настраивать Exim, и сразу столкнулся с кажется неразрешимой проблемой. А если бы я попытался реализовать более сложные схемы? Или это фича Exim - трудная настройка и невозможность решения некоторых задач? У меня нет опыта работы с разными MTA, поэтому и спрашиваю.

Стоящую передо мной задачу я описал в прошлых сообщениях.
Если я выберу Postfix, что я потеряю по сравнению с Exim? Какие самые яркие преимущества Exim? Что из важного и нужного он умеет, чего не может Postfix?

Сейчас у меня складывается такое впечатление.
Подход Postfix - у вас проблема? Вот вам опция, которая разрешает именно эту проблему. Другая проблема - вот вам другая опция.
Подход Exim - вот вам куча возможностей, с помощью которых вы наверняка найдете способ решить любую проблему. Проблема не решается? Увы, вам не повезло.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-06 11:49:08
xM
Попробуйте обратиться за советом к техническому директору mail.ru Владимиру Дубровину.
Он отвечает на Хабре и Тостере.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-06 15:50:14
Иван Петров
xM писал(а): Попробуйте обратиться за советом к техническому директору mail.ru Владимиру Дубровину.
Ого, да это автор 3proxy?! Пользуюсь его программой, очень доволен.
А mail.ru все делают правильно, защищают почту от подделки адресов.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-06 18:29:06
xM
Иван Петров писал(а): А mail.ru все делают правильно, защищают почту от подделки адресов.
Они то правильно делают, а вот вы что-то неправильно, видимо.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-07 0:38:39
Иван Петров
xM писал(а): Они то правильно делают, а вот вы что-то неправильно, видимо.
А можно узнать, что я делаю неправильно?

Та схема, которую я пытаюсь реализовать, предусмотрена в настройках Exim, наряду с обычным почтовым узлом, и называется smarthost.
Мне кажется, тут проявился эффект разработки студентов - не все продумали, что-то реализовали не лучшим образом.
Во времена, когда проектировали EXIM, считалось что почтовые сервера от своих клиентов должны принимать почту вообще без авторизации.
А теперь времена изменились, приходится защищаться от спама, делать авторизацию и дополнительные проверки.
Казалось бы, что проще - разрешить headers_rewrite для всех полей. Но раз не разрешили, значит что-то мешает. Возможно, внутри программы на эти поля что-то завязано, и их просто так не изменишь - нарушится логика работы других частей.

А я да, неправильно делаю. Я пытаюсь реализовать локальный почтовый сервер. Делай я обычный почтовый сервер или хотя бы с доменной почтой у хостера или мейла/яндекса/гугла, то скорей всего все бы заработало.
Но что еще важно - мне хотелось бы знать, что сделав шаг в сторону, я не наткнусь на неразрешимые проблемы.
Я пытаюсь на личном опыте понять, на что способна почтовая система.
Так что, даже если реальная система будет работать через сервер хостера (а сейчас она именно так работает), я вряд ли стану использовать EXIM после проблем с его настройкой в тестовом варианте. Если конечно, не узнаю, что есть простое и красивое решение, о котором я не знаю.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-07 11:15:29
xM
Ваша патетика понятна, но вряд ли уместна.
Думаю, что имеет смысл продолжить дискуссию после получения дополнительной информации.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-11 12:50:05
globus
Здравия!
Извините за вмешательство, но надеюсь принести пользу. Взаимовыгодно :-)
Надо же, и у меня та же проблема. Переписывается всё, кроме "Envelope-From", который можно косвенно переписать установкой "Return-Path" в транспорте.
Вот так работает, но только для одного:

Код: Выделить всё

remote_smtp:
  return_path = ext-user@smarthost.ru
  headers_rewrite = * ${lookup{$1}lsearch{/etc/email-addresses}{$value}fail} frs
Можно ли в транспорте завести переменную, чтобы считывать реквизиты из /etc/email-addresses и потом эту переменную вставлять в return_path и в headers_rewrite? Во избежание многократых чтений файла.
Вот так:

Код: Выделить всё

RMSMTPHDR=(после $local_part: из /etc/email-addresses)
 headers_rewrite = * $RMSMTPHDR frs
 return_path = $RMSMTPHDR
Формат /etc/email-addresses:

Код: Выделить всё

local_user: ext-user@smarthost.ru

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-15 8:59:19
globus
Почему в транспорте не работает такая конструкция:

Код: Выделить всё

return_path = ${lookup{$1}lsearch{/etc/email-addresses}{$value}fail}
, а прямая подстановка адреса работает?

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-15 12:55:05
xM
globus писал(а): return_path = ${lookup{$1}lsearch{/etc/email-addresses}{$value}fail}
Вероятно, потому, что переменные типа $1 работают только в headers rewrite. Используйте стандартную $local_part.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-15 14:09:45
globus

Код: Выделить всё

return_path = ${lookup{$local_part}lsearch{/etc/email-addresses}{$value}fail}
не работает опять-таки...

Кстати, лопатя документацию, обнаружил несоответствие с прямо противоположным переводом. Exim 4.7 $ 31.4:

Код: Выделить всё

Отметьте, что управляемая поиском перезапись [b][u]НЕ[/u][/b] может быть сделана правилом в форме
*@*   ${lookup ...
где ключ поиска использует “$1” и “$2”, или “$local_part” и “$domain” для ссылки на перезаписываемый адрес.
Exim 4.88 spec.txt:

Код: Выделить всё

 Note that lookup-driven rewriting can be done by a rule of the form
*@*   ${lookup ...
where the lookup key uses $1 and $2 or $local_part and $domain to refer to the address that is being rewritten.
С английским у меня, конечно, не очень, но тут случай вопиющий)) Куда просигнализировать?

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-15 14:13:49
xM
Не понимаю, где вы увидели несоответствие. Перевод точный.
Если не работает - дебажьте. Там будет видно как раскрываются переменные и почему у вас это не срабатывает.

EXIM - локальная почта + smarthost на mail.ru - неужели нельзя?

Добавлено: 2017-03-15 16:06:04
globus
А отрицательная частица "НЕ" в первом предложении перевода - разве так и надо? А если так надо, так может и из-за этого и не работает у меня?

Посоветуйте, пож-ста, как дебажить это дело. Поиски веду, но за час рытья документации однозначного ответа пока не нашёл.