我有一个 mbox 邮箱,其中包含重复的邮件副本,它们的不同之处仅在于它们的“X-Evolution:”标题。
我想以尽可能快速和简单的方式删除重复的。好像这已经写好了,但我还没有找到它,虽然我看过 Python 邮箱模块、各种 perl mbox 解析器、formail 等等。
有没有人有什么建议?
我有一个 mbox 邮箱,其中包含重复的邮件副本,它们的不同之处仅在于它们的“X-Evolution:”标题。
我想以尽可能快速和简单的方式删除重复的。好像这已经写好了,但我还没有找到它,虽然我看过 Python 邮箱模块、各种 perl mbox 解析器、formail 等等。
有没有人有什么建议?
这是一个小脚本,我用它:
#!/bin/bash
IDCACHE=$(mktemp -p /tmp)
formail -D $((1024*1024*10)) ${IDCACHE} -s
rm ${IDCACHE}
邮箱需要通过它进行管道传输,同时将对其进行重复数据删除。
-D $((1024*1024*10))
设置一个 10 MB 的缓存,这是对我一整年的邮件进行重复数据删除所需数量的 10 倍以上。YMMV,所以相应地调整它。将其设置得太高会导致一些性能损失,将其设置为低会使其重复。
formail
是procmail
实用程序包mktemp
的一部分,是coreutils
.
我没有足够详细地查看 formail(procmail 的一部分)。它确实有这样一个选项,如以下地方所述:http ://hints.macworld.com/comment.php?mode=view&cid=115683和http://us.generation-nt.com/answer/deleting-重复邮件消息帮助172481881.html
“formail -D”和“reformail -D”每次执行只能处理一封电子邮件。每封邮件在处理前都需要先从 mbox 中分离出来。我使用 maildrop 中的重新邮寄,因为它仍在积极开发中。
去重
#! /bin/sh
# $1 = mbox, thunderbird mailbox
# wmbox.sh is called for each mail.
cat $1 | reformail -s ./wmbox.sh
wmbox.sh
#! /bin/sh
# stdin: a email
# called by dedup.sh
TM=tmpmail
if [ -f $TM ] ; then
echo error!
exit 1
fi
cat > $TM
# mbox format, each mail end with a blank line
echo "" >> $TM
cat $TM | reformail -D 99999999 idcache
# if this mail isn't a dup (reformail return 1 if message-id is not found)
if [ $? != 0 ]; then
# each mail shall have a message-id
if grep -q -i '^message-id:' $TM; then
cat tmpmail >> nmbox
fi
fi
rm $TM