配置邮件服务器通过另一个邮件服务器进行中继

配置邮件服务器通过另一个邮件服务器进行中继

我是一名开发人员,目前正在构建一个托管电子商务解决方案。该软件必须做的一件事就是代表供应商向客户发送电子邮件。但是,业务要求之一是我们使用供应商的电子邮件服务器进行所有电子邮件通信。但由于我们不能让 Web 应用程序等待远程邮件服务器的响应,因此我们需要一个本地服务器,通过供应商的邮件服务器重新发送或路由该电子邮件。

理想情况下,我想设置一个本地邮件服务器(本地是指托管我的 Web 应用程序的服务器场中,对于邮件服务器,我可以接受任何服务器,但这是一家 Windows 商店,所以我首先想到的是 Exchange),它将为我们进行中继。

这可能吗?也就是说,同一个邮件服务器会根据发件人地址通过客户端服务器重新发送邮件 - 所有来自 @microsoft.com 的邮件都应通过 mail.microsoft.com 重新发送,所有来自 @apple.com 的邮件都应通过 mail.apple.com 重新发送?

实现此目标的最佳方法是什么?
每个远程邮件服务器上的凭据如何?

答案1

任何像样的 MTA(邮件服务器)都应该能够根据规则路由邮件,而不是仅仅基于 DNS。我的经验主要是使用 Exim,但 Exim 并不是唯一的。

当然,使用 Exim,编写一个路由器几乎是小菜一碟,它会查看发件人地址以确定要通过哪个主机发送,并将其放在正常的 dnslookup 或 smarthost 路由器之前。添加凭据会增加一点复杂性,但不会太多。最大的问题实际上是您想如何存储数据?LDAP?MySQL?CDB?平面文件?都可以。我自己不使用 Exchange,但有很多人在 Exchange 前面使用 Exim,并依靠 Exim 的 LDAP 支持来查询 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,这应该是不错的选择。

相关内容