我正在尝试设置一个电子邮件服务器,使其能够从多个 IP 地址发送电子邮件,这样我们的营销系统就可以从多个域发送电子邮件,同时保持反向 DNS 查找的一致性。例如,domain1.com 解析为 10.0.0.1,domain2.com 解析为 10.0.0.2,等等。
理想情况下,邮件服务器会检查from
邮件头中的域,然后从池中选择正确的 IP 地址,并使用该地址进行实际发送。目前,我们正在使用 Exim,我认为一种解决方案是在不同的接口上运行多个 Exim 实例,然后编写一个 SMTP 代理来执行邮件头检查并将电子邮件转发到正确的 Exim 实例,但我认为可能存在比这更简单的解决方案。
为了让大家知道,这并不涉及垃圾邮件,我们拥有我们将使用的所有域名和 IP 地址。
答案1
如果我理解错了,您的邮件位于服务器上,并且该服务器上配置了 4 个 IP 地址。您希望您的邮件服务器在向互联网发送邮件时使用这四个 IP 中的一个作为出站接口。如果这是错误的解释,请告诉我。
可以配置 Exim SMTP 传输以通过不同的接口发送电子邮件。以硬编码方式,您可以执行以下操作:
routers:
send_domaina_com:
driver = dnslookup
domains = domaina.com
transport = domaina_com_smtp
send_domainb_com:
driver = dnslookup
domains = domainb.com
transport = domainb_com_smtp
send_domainc_com:
driver = dnslookup
domains = domainc.com
transport = domainc_com_smtp
send_domaind_com:
driver = dnslookup
domains = domaind.com
transport = domaind_com_smtp
TRANSPORTS:
domaina_com_smtp:
driver = smtp
interface = 10.0.0.1
domainb_com_smtp:
driver = smtp
interface = 10.0.0.2
domainc_com_smtp:
driver = smtp
interface = 10.0.0.3
domaind_com_smtp:
driver = smtp
interface = 10.0.0.4
我相信上面的代码 99.99% 可以工作,尽管它显然很丑陋。我认为动态处理所需的一切都在那里(“接口”是可扩展的)。
答案2
为了保持路线完整性,我认为您必须将不同的 exim 实例绑定到不同的接口(正如您所说)
代理并不是真正需要的,您只需使用路由器(每个域/来自:匹配)并设置条件来指示通过哪个“主机”进行中继即可。
从来没有尝试过。很想知道它是否有效。
答案3
Exim 可以根据“发件人:”标头中的域名从不同的 IP 地址发送电子邮件。无需对每个域单独进行硬编码。传输接口remote_smtp
应设置如下:
interface = "${lookup{${lc:${domain:${address:$h_from:}}}}lsearch{/etc/exim/domainips}{$value}}"
/etc/exim/domainips
需要按照以下格式创建域-IP 对列表:
domain1.com: 10.0.0.1
domain2.com: 10.0.0.2
此外,如果 10.0.0.1 的 PTR 记录指向 domain1.com,那么最好相应地设置 HELO:
helo_data = ${lc:${domain:${address:$h_from:}}}
如果电子邮件由 PHP/Apache 发送,则无论“发件人:”标头是什么,实际的信封发件人始终是相同的(例如 apache@primary_hostname.com)。为了解决此问题,可以设置 return_path:
return_path = ${address:$h_from:}
理想情况下,remote_smtp
运输将是这样的:
remote_smtp:
driver = smtp
interface = "${lookup{${lc:${domain:${address:$h_from:}}}}lsearch{/etc/exim/domainips}{$value}}"
helo_data = ${lc:${domain:${address:$h_from:}}}
return_path = ${address:$h_from:}