2

我正在寻找一种将非常大的 mbox 文件拆分为多个 mbox 文件(每个发件人一个)的方法。

或者,仅提取指定发件人的消息。

在互联网上上下查找,但没有找到任何(或使用错误的搜索词)。

4

2 回答 2

1

也许archmbox适合您的需求。还有一篇关于它的文章。

于 2015-01-19T16:12:33.400 回答
1

如果您有 Procmail,将根据您输入的任何规则formail -s procmail -m simple.rc <mbox将邮件拆分到单独的文件夹中。(如果没有,请跳至 Awk 替代方案。)例如,mboxsimple.rc

:0:
* ^From:(.*\<)?(billg|william henry gates)
billg

:0:
* ^From steve@(pixar|next|apple)\.com
steve

:0:
* ^Subject: I for one welcome our new lizard overlords
lizard

:0:
unmatched

将依次应用三个正则表达式,并将传入的消息转移到第一个匹配的相应 mbox 文件夹。最终的传递是无条件的,并且会处理任何与条件不匹配的消息。

单一概念“发送者”没有明确定义;您可以检查许多不同的字段,这些字段有时会返回不同的结果,具体取决于消息的发送方式。简单地说,From:标头通常应该包含发件人的姓名和地址(但有些人使用不同的电子邮件客户端,在不同的场合会以不同的方式格式化此信息,有时还会使用多个地址)但至少在名义上您应该检查Sender:Resent-From:或信封的场景发件人(From_在 Procmail 圈子中调用)代替,或者也一样。

formail -s program args <mbox只需读取mbox并将其拆分为单独的消息,然后program args依次在每个提取的消息上运行,将消息作为标准输入传递。

如果 mbox 分隔符中的信封发件人足够准确,可以对邮件进行排序(提示:尝试

LC_ALL=C sed -n '/^From /!d;s///;s/ .*//p' mbox |
sort | uniq -c | sort -r -n >senders

并检查生成的senders文件以查看其中的信封发件人地址。这LC_ALL=C可能不是必需的,但应该可以防止 Unicodesed抱怨非 UTF-8 输入)您可以使用简单的 Awk 脚本来拆分消息:

awk '/^From / {
        if (NR>1) close output
        if ($2 ~ /billg|whgates/) output="billg"
        else if ($2 ~ /steve@(pixar|next|apple)/ output="steve"
        else if ($2 ~ /lizard-l@lizzserv/) output="lizard"
        else output="unmatched"}
    { print >>output }' mbox
于 2019-11-03T14:54:10.490 回答