Назад | Перейти на главную страницу

Настройте почтовый сервер для ретрансляции через другой почтовый сервер

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

В идеале я хотел бы настроить локальный почтовый сервер (под локальным я имею в виду ферму, на которой размещено мое веб-приложение, а с помощью почтового сервера я открыт для всего, но это магазин Windows, поэтому первое, что я думаю, это Exchange ), который будет выполнять ретрансляцию за нас.

Это возможно? Т.е. тот же почтовый сервер будет повторно отправлять почту через клиентский сервер в зависимости от адреса отправителя - вся почта с @ microsoft.com должна пересылаться повторно через mail.microsoft.com, а вся почта с @ apple.com должна пересылаться повторно через почту. apple.com?

Как лучше всего этого добиться?
Как насчет учетных данных на каждом удаленном почтовом сервере?

Любой приличный MTA (почтовый сервер) должен иметь возможность маршрутизировать почту в соответствии с правилами, а не просто на основе DNS. Мой опыт в основном связан с Exim, но Exim здесь не уникален.

Конечно, с Exim почти тривиально написать маршрутизатор, который смотрит на адрес отправителя, чтобы определить, с какого хоста отправлять, и помещает его перед обычным dnslookup или маршрутизатором smarthost. Добавление учетных данных добавляет немного сложности, но не намного. Самый большой вопрос: как вы хотите хранить данные? LDAP? MySQL? CDB? Плоские файлы? Все работает. Я сам не использую Exchange, но есть много людей, использующих Exim перед Exchange и полагающихся на поддержку LDAP Exim для запроса в AD данных, необходимых для того, чтобы не дублировать информацию.

Например, в качестве нетривиального примера реализации всех ваших пожеланий, с некоторой степенью безопасности наверху, с файлом CDB, сопоставляющим домены клиентов с данными key = "value" для домена, у вас может быть:

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 нескольких атрибутов будет возвращать данные в правильном формате для оператора раскрытия $ {extract ...}, так что это должно быть хорошо, если вы хотите поместить данные в AD.