列出标题中的第一个中继邮件服务器

列出标题中的第一个中继邮件服务器

邮件以完整的标题存储在文本文件中。 (该文件是来自 Thunderbird 邮件客户端的收件箱。文件格式是姆博克斯德变化。)

如何列出每封邮件在到达收件箱之前经过的第一个服务器? “已接收”行列出了电子邮件经过的服务器。您从下到上阅读“已收到”行。最底下一行是发起者。

一种选择是通过sedgrepawk等进行文本处理的自定义脚本。还搜索了邮件分析器并发现电子邮件标头分析器 (MHA),邮件目录工具nmh - 消息处理系统。使用这些工具之一来查询我的文件以完成首先中继电子邮件的服务器列表是否更容易?

答案1

我会根据出现的情况将 mbox 文件分割为其组成消息的近似值(没有冒号)。然后我会迭代整个集合,选出最后一个已收到每个的标题。

mbox=/path/to/mbox/file

mkdir xx
(
    cd xx
    csplit -ksz -n5 "$mbox" '/^From /' '{*}'

    for m in *
    do
        awk '
            /^\r?$/ { gsub(/[\r\n[:space:]]+/, " ", received); print received; exit }
            /^[^[:space:]]/ { flag = 0 }
            /^Received:/ { received = $0; flag = 1 }
            /^[[:space:]]/ && flag { received = received " " $0 }
        ' "$m"
    done
)
rm -rf xx

阅读原始 mbox 文件并不困难awk,但当我开始创建解决方案时,我使用的是一条消息。使用 shell 循环扩展该解决方案似乎比扩展 更容易awk,但事后看来,无论哪种方式都可能只有 60:40 左右。

鉴于awk脚本确实一次处理一条消息,诸如formail(最初在评论作为来自procmail套房) 可用于迭代 mbox 格式文件中的消息:

formail < "$mbox" -s awk '....'

答案2

awk '/^Received: / {
   LASTREAD=$0
   exit
}
/^\r{0,1}$/ {
   if "" == LASTREAD {
      exit 1
   }
   print LASTREAD
   exit 0
}
END {
   if "" == LASTREAD {
      exit 1
   }
   print LASTREAD
}'

(未测试)。

这将提取第一个匹配的行。这是否是第一跳是另一回事。内容的结构可能会有所不同。

相关内容