用于从多个 IP 地址发送电子邮件的 Linux 电子邮件服务器

用于从多个 IP 地址发送电子邮件的 Linux 电子邮件服务器

我正在尝试设置一个电子邮件服务器,使其能够从多个 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:}

相关内容