Как я могу удалить дубликаты (дедупликацию) почтового ящика в формате mbox?

У меня есть почтовый ящик mbox, содержащий дубликаты сообщений, которые отличаются только своим заголовком "X-Evolution:".

Я хочу удалить дубликаты как можно быстрее и проще. Кажется, что это уже было бы написано, но я не нашел его, хотя я посмотрел на модуль почтового ящика Python, различные парсеры perl mbox, formail и так далее.

У кого-нибудь есть предложения?

3 ответа

Это то, что я использовал:

rm -f idcache; \
zcat archive_2012.gz  | \
formail -D $((1024*1024*10)) idcache -s | \
gzip -9c  > archive_2012-dedup.gz
  1. удаляет старые записи в кэше
  2. распаковывает старый файл на стандартный вывод
  3. запускает formail как фильтр (с кешем 10 мегабайт, называется idcache, stdout-to-stdout)
  4. на лету повторно сжимает дедуплицированный поток и выгружает его в новый файл

После некоторой проверки я перезаписываю старый файл новым.

formail является частью утилит procmail

Я не смотрел на formail (часть procmail) достаточно подробно. У него есть такая опция, как упомянуто в таких местах, как: http://hints.macworld.com/comment.php?mode=view&cid=115683 и http://us.generation-nt.com/answer/deleting-duplicate-mail-messages-help-172481881.html

"formail -D" и "reformail -D" могут обрабатывать только одно письмо за одно выполнение. Каждое письмо должно быть отделено от mbox перед обработкой. Вместо этого я использую reformail от maildrop, так как он все еще находится в активной разработке.

  1. удалить старый idcache, tmpmail, nmbox
  2. запустить dedup.sh.
  3. nmbox - это выход с удаленными дублирующимися сообщениями.

dedup.sh

#! /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
Другие вопросы по тегам