我正在寻找一种将非常大的 mbox 文件拆分为多个 mbox 文件(每个发件人一个)的方法。
或者,仅提取指定发件人的消息。
在互联网上上下查找,但没有找到任何(或使用错误的搜索词)。
我正在寻找一种将非常大的 mbox 文件拆分为多个 mbox 文件(每个发件人一个)的方法。
或者,仅提取指定发件人的消息。
在互联网上上下查找,但没有找到任何(或使用错误的搜索词)。
如果您有 Procmail,将根据您输入的任何规则formail -s procmail -m simple.rc <mbox
将邮件拆分到单独的文件夹中。(如果没有,请跳至 Awk 替代方案。)例如,mbox
simple.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