通过发件人拆分大型mbox

时间:2015-01-18 21:03:02

标签: mbox

我正在寻找一种方法将一个非常大的mbox文件切割成几个mbox文件(每个发件人一个)。

或者,仅指定发件人提取邮件。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

也许archmbox符合您的需求。关于它还有一个article

答案 1 :(得分:0)

如果您具有Procmail,则formail -s procmail -m simple.rc <mbox会根据您在mbox中设置的任何规则将simple.rc中的邮件拆分到单独的文件夹中。 (否则,请跳至Awk替代方法。)例如,

: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:或信封发件人(在Procmail圈子中称为From_)。

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可能不是必需的,但是可以防止Unicode sed抱怨非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