我可以使用什么命令在 sendmail 日志中搜索涉及特定收件人的所有邮件详细信息。

Mik*_*e B 5 linux bash sendmail centos awk

CentOS 5.x | 发邮件

有时,我需要搜索 sendmail 传送日志以找出丢失邮件的原因。这通常涉及两个(或更多)步骤:

第 1 步:在 /var/log/maillog 中搜索用户的电子邮件地址。例如grep -i "someuser@recipientdomain.com" /var/log/maillog

这通常会返回如下内容:

  Jan 11 07:43:34 server-example sendmail[12732]: p937blksdh3: to=<someuser@recipientdomain.com>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=102537, relay=mta.recipientdomain.com. [12.34.56.78], dsn=5.7.1, stat=Service unavailable
Run Code Online (Sandbox Code Playgroud)

第 2 步:然后我将获取唯一的消息名称(在本例中为 p937blksdh3)并进行搜索。例如:grep -i p937blksdh3 /var/log/maillog

我想将第 1 步和第 2 步合并为一个单行代码,并让它自动对其他 id 执行相同的搜索。因此,在单个命令中,我想执行以下操作:

  1. 在 sendmail maillog 中搜索特定字符串。
  2. 确定电子邮件的消息 ID(在上面的示例中,这是 p937blksdh3)。(我猜awk '{print $}'会被使用?)
  3. 搜索相同的日志,但搜索消息 ID(在上面的示例中基本上是grep -i p937blksdh3 /var/log/maillog
  4. 输出步骤 3 的结果。对其他消息 ID 重复此操作。

小智 7

你可以做类似的事情。

for i in `grep -i "someuser@recipientdomain.com" /var/log/maillog | awk '{print $5}'`; do grep -i $i /var/log/maillog; done
Run Code Online (Sandbox Code Playgroud)

这将为您正在查找的用户搜索出该行,然后选择该行上的第 5 个项目(以空格 iirc 分隔)。然后对于该列表中的每个消息 ID,将 grep 包含消息 ID 的行。

如果您想从消息 ID 的末尾删除 :,您可以执行类似 for i in 的操作grep -i "someuser@recipientdomain.com" /var/log/maillog | awk '{print $5}' | sed 's/\://。做 grep -i $i /var/log/maillog; 完毕

希望有帮助。