![Exim 设置大型外发邮件队列](https://linux22.com/image/1273599/Exim%20%E8%AE%BE%E7%BD%AE%E5%A4%A7%E5%9E%8B%E5%A4%96%E5%8F%91%E9%82%AE%E4%BB%B6%E9%98%9F%E5%88%97.png)
我有一个相当标准的 Exim 设置,用于接收和发送邮件。最近,我们的开发团队整合了一个 PHP 应用程序,允许我们向客户发送批量邮件。该 PHP 应用程序使用标准 PEAR 库来启动到本地主机的 SMTP 连接(应用程序和邮件服务器位于同一台机器上)。这里的想法是,该应用程序将在很短的时间内(大约 60 秒)发送大约 10,000 封电子邮件,然后 Exim 会将这些电子邮件保留在其队列中等待发送。
问题出现在大约 50 封电子邮件之后,Exim 停止接受邮件并在 exim_main.log 文件中记录以下错误:
SMTP command timeout on connection from localhost [127.0.0.1]
这可能是因为 Exim 立即开始投递邮件,然后停止接受新的传入连接?我认为增加 SMTP 限制可能是这里的问题,但即使在 exim.conf 文件中将新值设置为以下值后,我仍然遇到同样的问题:
queue_run_max = 5000
smtp_accept_max = 5000
smtp_accept_queue = 5000
这引出了两个问题:
- 我该如何解决这个问题?
- 配置 Exim 的最佳方式是什么,使其能够在很短的时间内将大量邮件接收至队列,然后在所有邮件进入队列后逐渐发送?我见过一些人为接收和发送邮件运行单独的 Exim 守护程序;这是一个好的解决方案吗?
答案1
默认情况下,exim 会在电子邮件到达时立即尝试发送电子邮件,以避免将其排队。
如果不能立即传送,它就会进入假脱机目录。
默认情况下,所有这些消息文件都保存在通用 Exim 假脱机目录内的单个目录中,名为 input。如果目录中的文件数量很大,某些操作系统的性能会不佳;为了在这种情况下提高性能,拆分池目录可以使用选项。这会导致 Exim 将输入文件拆分为 62 个子目录,这些子目录的名称为单个字母或数字。完成此操作后,队列将一次处理一个子目录,而不是一次处理所有子目录,这样即使每个目录中的文件数量不足以影响文件系统性能,也可以提高整体性能。
有一些选项可以控制 Exim 是否尝试立即交付:
- 队列仅加载- 如果负载高则排队接收
- 队列仅加载闩锁- 无需重新评估每条消息的负载
- 队列运行最大值- 最大同时排队人数
最重要的是:
- 仅限队列- 根本没有立即交货
所有这些设置都详细说明Exim 规范手册