在我澄清我的问题之前,我需要解释当前的设置。
我们有 1 台 Postfix 服务器,可以接收邮件并将其存储在邮箱中。我们的一些客户有自己的 Exchange 服务器,但我们仍在 Postfix 服务器上提供 POP3 信箱。他们的域的 DNS 设置为首先尝试将邮件发送到 Exchange 服务器,如果无法访问该服务器,则将其发送到我们的 Postfix 服务器。如果邮件被发送到 Postfix 服务器,则邮件将存储在 POP3 帐户中。当 Exchange 服务器再次联机时,它使用 POP-Locator 读取 POP3 邮箱的内容,下载邮件并将其分发到 Exchange 服务器上的邮箱中。
这一切都非常顺利。因为在停机期间,客户仍然可以登录我们的网络邮件并阅读重要邮件。这是我们想要保留的功能。
但问题是,大多数客户的网站也托管在运行 Postfix 的同一台服务器上。当运行在该服务器上的软件尝试将邮件发送到某个客户的电子邮件地址时,它会在本地发送。我们希望 Postfix 使用 MX 查找来查看应该将邮件发送到哪个服务器。
很长一段时间以来,我一直在想办法做到这一点。我有一本 Postfix 书,并通读了它。在互联网上查找了许多配置示例和其他资源。
到目前为止,我一直在尝试使用transport_maps = hash:/etc/postfix/transport
并列出其中的特定域,运行postmap
以重新生成查找表并执行postfix reload
。无论我尝试做什么,邮件都会在本地传递。
为了添加更多背景信息,我们使用 Courier 并列出了所有域virtual_alias_maps = hash:/etc/postfix/virtual
。
任何帮助将非常感激。
/etc/postfix/transport
example.com smtp
/etc/postfix/虚拟
example.com postmaster
@example.com someuseraccount
答案1
您之所以觉得很难做到,是因为这本质上是不可能的,因为它与 Postfix 所采用的 MTS 模型相矛盾。邮箱要么是本地的,要么是远程的;它们不能同时是本地的。本地机器要么是这最终目的地用于邮件或者不是。 本地和虚拟域地址类是“最终目的地”,远程域(“中继”/“默认”)地址类则不是。 单个邮箱的最终目的地不能同时是本地计算机上的 maildir 或远程传输到其他计算机。只能是其中之一。域可以是本地/托管域,在这种情况下,该域中邮箱的邮件将传递到本地 maildir 以供 POP3 接收;也可以是远程域,在这种情况下,该域中邮箱的邮件将传输到另一台计算机,而不是本地传递。
你唯一真正的选择是运行两个独立的 MTS —两个不同的 Postfix 实例。其中一个为整个 Internet 提供 SMTP 中继服务,并将相关域配置为虚拟域,本地托管,所有邮件都传送到 maildir,以便随后通过 POP3 检索。另一个提供sendmail
、postdrop
和本地 SMTP 提交服务,并将相关域配置为中继域,远程托管,其邮件将传输到 Exchange 服务器。
摘要:要拥有两条截然不同且相互矛盾的邮件“纸质路径”,就需要有两个 MTS 实例。
答案2
请显示你的 /etc/postfix/transport 文件的内容。我无法判断该文件是否正确。
另外,请澄清...您是否希望 Postfix 尝试为这些域进行 MX 传送,并且只有失败时才进行本地传送?
谢谢您提供补充信息。
你想要做的事情非常棘手,甚至可能无法直接实现。我认为实现此目的的最简单方法是运行两个 postfix 实例。请参见此处http://www.postfix.org/MULTI_INSTANCE_README.html了解详细信息。
您可以配置一个 postfix 实例来接受来自世界各地的邮件,并传送到本地邮箱进行 POP3 检索等。
另一个实例将接受来自本地进程的邮件,然后尝试通过 MX 传递——甚至可能传递到第一个 postfix 实例。
在第二个实例中,您将禁用 master.cf 中的 smtp 服务,以便两个实例都不会尝试侦听端口 25。有关所有详细信息,请阅读上面的链接。
我希望这有帮助!