Эти конфликты обычно разрешаются через блокировки. Это согласно приложению для обеспечения надлежащей блокировки. Тем не менее нужно отметить, что большинство приложений действительно имеет тенденцию блокировать файлы, особенно во время записей.
Любой достойный MTA (почтовый сервер) должен смочь направить почту согласно правилам, вместо просто на основе DNS. Мой опыт главным образом с Exim, но Exim не уникален здесь.
Конечно, с Exim это почти тривиально для записи Маршрутизатора, который смотрит на адрес отправителя для определения который хост отослать и поместить это перед нормальным dnslookup или smarthost Маршрутизатором. Добавьте, что учетные данные добавляют немного сложности, но не очень. Самый большой вопрос состоит действительно в том, как Вы хотите хранить данные? LDAP? MySQL? CDB? Плоские файлы? Все это работает. Я не использую Exchange сам, но существует много людей использование, Exim перед Exchange и доверием поддержке LDAP Exim для запросов AD для данных не придется копировать информацию.
Например, как нетривиальный пример, реализовывая все Ваши пожелания, с некоторой безопасностью на вершине, с файлом CDB, отображающим домены абонента для манипулирования =, "оценивают" данные за домен, Вы могли бы иметь:
key: example.com
value: server="smtp.example.com" user="fred" pass="s3kr3t" submission=t
и затем:
# after "begin routers" and before the normal remote mail sending Router:
via_customer_server:
driver = manualroute
senders = *@cdb;/etc/mail/customers.cdb
transport = customer_server_t
address_data = ${lookup{$sender_address_domain}cdb{/etc/mail/customers.cdb}}
route_data = ${extract{server}{${lookup{$sender_address_domain}cdb{/etc/mail/customers.cdb}}}
# after "begin transports"
customer_service_t:
driver = smtp
hosts_require_auth = ${extract{user}{$address_data}{*}{}}
port = ${extract{submission}{$address_data}{587}{25}}
# these next two will mandate TLS if tls is present, and turn on cert verification
hosts_require_tls = ${extract{tls}{$address_data}{*}{}}
tls_verify_certificates = ${extract{tls}{$address_data}{/etc/ssl/certs}{}}
# after "begin authenticators"
auth_plain:
driver = plaintext
public_name = PLAIN
client_condition = ${if def:tls_cipher}
client_send = ^${extract{user}{$address_data}}^${extract{pass}{$address_data}}
Как несколько примечаний: address_data
на Маршрутизаторе сохранил результаты поиска для легкого доступа позже, route_data
сделал тот же поиск, но на практике который будет использованием кэшируемые результаты address_data
, и это довольно завершено, хотя не протестировано, пример.
Можно сделать другой материал вместо cdb, я просто выбрал это наугад. В частности, LDAP ищет несколько атрибутов, возвратит данные в правильном формате за $ {извлечение...} оператор расширения для работы с, таким образом, это должно быть хорошо, если Вы хотите поместить данные в AD.