19.4. 邮件传递模式

如前所述,Exim 能够立即传递消息或将其排队以供稍后处理。所有传入的邮件都存储在input目录下的/var/spool/exim。当排队未运行时,一旦收到每封邮件,就会启动一个传递进程。否则,它会留在队列中,直到 queue-runner 进程将其取出。可以通过在配置文件中设置queue_only来使排队成为无条件的,或者可以通过诸如以下设置,使其有条件地取决于 1 分钟的系统负载
queue_only_load = 4
这会导致系统负载超过 4 时,消息排队。[1]

如果您的主机没有永久连接到互联网,您可能希望为远程地址启用排队,同时允许 Exim 立即执行本地传递。您可以通过在配置文件中设置
queue_remote_domains = *
来实现此目的。

如果您启用了任何形式的排队,您必须确保定期检查队列,可能每 10 或 15 分钟一次。即使没有任何显式的排队选项,也需要检查队列中因临时传递失败而被延迟的消息。如果您在守护进程模式下运行 Exim,则必须在命令行中添加–q15m选项,以每 15 分钟处理一次队列。您也可以在这些时间间隔内从 cron 调用 exim –q

您可以通过使用–bp选项调用 Exim 来显示当前的邮件队列。等效地,您可以将 mailq 链接到 Exim,然后调用 mailq
$ mailq
 2h   52K 12EwGE-0005jD-00 <sam@vbrew.com>
        D bob@vbrew.com
          harry@example.net  

这显示了来自 sam@vbrew.com 的一条消息,其中有两个收件人位于消息队列中。 它已成功传递到 bob@vbrew.com,但尚未传递到 harry@example.net,尽管它已在队列中待了两个小时。 消息的大小为 52K,Exim 用来标识此消息的 ID 是12EwGE-0005jD-00。您可以通过查看消息的单个日志文件来找出传递尚未完成的原因,该日志文件保存在 Exim 的假脱机目录中的msglog目录中。–Mvl选项是执行此操作的简便方法
$ exim –Mvl 12EwGE-0005jD-00
2000-01-30 17:28:13 example.net [192.168.8.2]: Connection timed out
2000-01-30 17:28:13 harry@example.net: remote_smtp transport deferred: 
  Connection timed out
各个日志文件保留每个消息的日志条目的副本,以便您可以轻松地检查它们。 可以使用 exigrep 实用程序从主日志文件中提取相同的信息
$ exigrep 12EwGE-0005jD-00 /var/log/exim/exim_mainlog
那会花费更长的时间,尤其是在繁忙的系统中,日志文件可能会变得很大。 当查找有关多个消息的信息时,exigrep 实用程序将发挥作用。 它的第一个参数是一个正则表达式,并且它挑选出与至少具有一条与该表达式匹配的日志行的任何消息有关的所有日志行。 因此,它可用于挑选出特定地址的所有消息,或来自或发往特定主机的消息。

您可以通过在主日志文件上运行 tail 来持续监视正在运行的 Exim 的操作。 另一种方法是运行 Exim 随附的 eximon 实用程序。 这是一个 X11 应用程序,它显示主日志的滚动显示,并显示正在等待传递的消息的列表,以及有关传递活动的一些带状图。

注释

[1]

系统负载是标准 Unix 用于衡量排队等待运行的进程平均数量的指标。 uptime 显示了过去 1 分钟、5 分钟和 15 分钟的平均负载。