我正在尝试使用 Postfix 设置传入 MTA 服务器。我有特定要求,即某些用户的电子邮件不应经过邮件过滤器。有什么方法可以在 Postfix 中完成此操作吗?我认为一种方法是通过编辑邮件过滤器,但这将是一项更大的任务,因此,就像可以有用于访问检查的白名单表一样,是否可以跳过某些收件人的邮件过滤器?我能想到的另一种方法是使用 header_checks 并使用单独的 smtp 进程,但我无法实现它。
答案1
不,原则上这是不可能的;这不是 Postfix 特有的。
Milter 基本上是函数集合在 SMTP 会话的相应阶段调用:一个在客户端连接时调用,下一个在发出 HELO/EHLO 时调用,下一个在发出 MAIL FROM 时调用,依此类推;但您可能无法知道谁是收件人,直到客户端发出 RCPT TO 命令。因此,在您的案例中,邮件发送器必须固有地运行前您可以确定是否运行它们,这是合乎逻辑的无稽之谈。
此外,如果客户端在会话期间发出多个 RCPT TO 命令,则单个 SMTP 会话可能会指定多个收件人。当不同收件人的策略不同时,在这种情况下该怎么做尚不明确。
这甚至不是 milters 所独有的;任何邮件过滤在服务器收到连接时立即开始,但只有在 RCPT TO 之后才能做出基于收件人的决定。Postfix 可能会延迟拒绝通知直到收到 RCPT TO 之后,但即使在这种情况下,内部也可能决定尽早拒绝。只有通知会被延迟,限制列表的处理和决定不会延迟。但在这里你至少可以设置限制列表,这样就不会在早期阶段拒绝任何东西。这不是你用过滤器可以轻松做到的。
关于 milter,你能做的最好的事情就是开发一个代理过滤器应用程序在早期会话阶段不执行任何操作,并在后期将调用代理到一些真正的 milter。请注意,许多真正的 milter预计它们的组件函数必须按特定顺序调用,如果您在未调用 xxfi_connect 的会话中调用它们的 xxfi_envrcpt,则可能会出现错误行为。因此,您的代理 milter 应该堆叠这些早期调用,并在所有 xxfi_envrcpt 调用完成后将它们刷新到真正的 milter 中,然后它可以决定“milter 应该运行”。
我没有听说过这种现成的代理邮件解决方案;可能是因为任何头脑正常的人都不需要这种晦涩难懂的软件。你认为你需要这个,这让我认为你可能不完全了解电子邮件技术的工作原理、用途以及如何正确保护它。