将邮件服务器configuration为通过另一个邮件服务

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

理想情况下,我想build立一个本地邮件服务器(本地我的意思是在农场,托pipe我的networking应用程序,并通过邮件服务器我打开任何东西,但这是一个Windows商店,所以我首先想到的是Exchange )会为我们做中继。

这可能吗? 也就是说,相同的邮件服务器将通过客户端的服务器重新发送邮件,这取决于发件人的地址 – 所有来自@ microsoft.com的邮件都应该通过mail.microsoft.com重新发送,所有来自@ apple.com的邮件都应该通过邮件重新发送。 apple.com?

什么是完成这个最好的方法?
那么每台远程邮件服务器上的凭据呢?

任何体面的MTA(邮件服务器)应该能够根据规则路由邮件,而不是简单地基于DNS。 我的经验主要是与Exim,但Exim在这里不是唯一的。

当然,用Exim编写一个路由器几乎是微不足道的,它会查看发送者地址,以确定发送哪个主机,并将其放在正常的dnslookup或smarthost路由器之前。 添加凭证增加了一点复杂性,但不多。 最大的问题是你想如何存储数据? LDAP? MySQL的? CDB? 平面文件? 这一切工作。 我自己不使用Exchange,但有很多人在Exchange前使用Exim,并依靠Exim的LDAP支持来查询AD所需的数据,而不必重复信息。

例如,作为实现所有愿望的一个非常重要的示例,在顶级安全性的情况下,使用将客户域映射到域的key =“value”数据的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的caching结果,这是一个相当完整的,虽然未经testing的例子。

你可以做其他的东西,而不是CDB,我只是随机select。 特别是,LDAPsearch多个属性将以$ {extract …}扩展操作符的正确格式返回数据,所以如果要将数据放入AD,这应该是很好的。