目标
我正在寻找一种解决方案,以每小时为单位限制向特定电子邮件运营商(几个顶级域名,我都知道)发送的电子邮件的速率。我还需要某种方法来控制每封邮件的速率,以允许 Postfix 每小时发送更多的电子邮件。限制是针对此运营商维护的所有地址的全局限制,每整小时重置一次。
我目前所做的
我使用 postfix after_queue 自定义过滤器,查找指示优先级的自定义标头。过滤器接受的邮件数量保存在脚本之外,在 PostgreSQL 数据库内。符合当前时间范围配额的邮件将作为已接受邮件传递给 postfix,超出配额的邮件将使用 tempfail 返回代码进行延迟。
用于向该特定运营商发送电子邮件的 SMTP 中继是单独的虚拟机,仅用于有限的电子邮件和来自运营商的退回邮件。根据要求,自定义过滤器效率已经足够好。
问题
基本上,有两个问题:
- 我找不到任何在 postfix 队列中对电子邮件消息进行优先级排序的方法。如果我可以使用我们的自定义标题作为优先级指示器或向电子邮件消息添加另一个优先级标记,并保证它将在非优先级消息之前被过滤和发送,那就更好了。我考虑过使用多个实例 (postmulti),但优先级必须是相对的、数字的 - 它们用作外发邮件的配额修饰符。基本上:优先级为 N 的电子邮件使用无优先级电子邮件所用配额的 1/N。优先级排序是一项很好的功能,因此如果时间框架配额正常工作,我们可以不用它。
- 由于电子邮件在应用过滤器后会返回队列,因此我们无法保证电子邮件会在被接受的时间范围内真正发送。Postfix 队列似乎无法控制和控制实际吞吐量。
我的解决方案
从 after-queue 自定义过滤器,无需将消息返回到 postfix 队列,只需使用另一个工具将其直接发送到目标 SMTP 并完全跳过 postfix。我不知道 Linux 上是否有任何现成的 smtp 客户端可用于完成此类任务。此外,我们需要处理同步(作为 SMTP 通信中的响应)和异步(作为发送到 Return-Path 地址的状态电子邮件)的退回消息。我们还需要控制此类工具的 Return-Path 以指向发送电子邮件的服务器。
作为最后的机会解决方案,我们的想法是推出自己的 SMTP 服务器,或者根据我们的需求修改 sendmail/postfix 源。除非没有其他选择,否则这样做是多余的。
问题
哪种 Linux 工具可以立即(无需排队)将电子邮件转发到收件人 SMTP 服务器并提供有效的退回消息?或者,如果有更好的解决方案,我应该查看哪些工具?
答案1
问题
哪种 Linux 工具可以立即(无需排队)将电子邮件转发到收件人 SMTP 服务器并提供有效的退回消息?或者,如果有更好的解决方案,我应该查看哪些工具?
后缀本身有多重实例功能。它将允许您定义具有自己的队列和配置文件的单独的 Postfix 实例。您可以将此实例用作 SMTP 处理的最后一条链。是的,因为它有单独的队列,所以这个特殊实例可以发送您的电子邮件而无需等待和修改另一个队列。
答案2
查看 postfix 策略守护进程。它具有按您描述的方式工作的配额。
https://www.policyd.org/content/features
答案3
要优先递送给定的邮件消息,您可以定期 grep 延迟队列中的项目以读取您的自定义标头并构建需要立即递送的消息列表。对于该列表中的每个待处理邮件,运行以下命令。
postqueue -i 队列id
这应该会导致 postfix 尝试传递具有给定queueid 的邮件。
这可能可行也可能不可行,具体取决于邮件量和系统性能。但是,您需要考虑系统的增长并测试系统需要处理的最大吞吐量。
注意:在 Centos 上,延迟邮件内容存储在以下目录下。
/var/spool/postfix/deferred