Отправляет email-рассылки с помощью сервиса Sendsay

сортировка писем в mbox

i686-suse-linux)

Hello!

Может кто подскажет, есть ли в природе утилита, которая может
отсортировать сообщения в mbox файле по цепочкам (aka тредам)?

Т.е. надо сделать так, чтобы сообщения в mbox-файле шли в том же
порядке, что и при отображении их в мейлере (по цепочкам).

Опробовал несколько мейлеров, они экпортируют фиг пойми в каком порядке.

Заранее спасибо.

Ответить   "B." Fri, 27 May 2005 11:44:50 +0400 (#374741)

 

Ответы:

В сообщении от 1117183490 секунд после начала Эпохи Unix Вы написали:

Perl ;)

Ответить   Konstantin Korikov Fri, 27 May 2005 18:40:16 +0300 (#374802)

 

В сообщении от 1117183490 секунд после начала Эпохи Unix Вы написали:

begin mbox-sort-thread.pl #!/usr/bin/perl

use Mail::Util qw(read_mbox);
use Date::Parse;

$tree = {};
$unsorted = [];

for $lines(read_mbox("-")) {
$_ = join('', @$lines);
# get message id
my $id = (/^Message-ID: <(.*?)>/mi) ? $1 : undef;
# get references
my $references = [];
if (/^References: ((<.*?>(\s|\n)*)+)/mi) {
my $refstr = $1;
while ($refstr =~ /<(.*?)>/) {
push(@$references, $1);
$refstr = $';
}
}
# get date
my $date = (/^Date: (.+)$/mi) ? str2time($1) : undef;

# no comment
unless (defined($id)) {
push(@$unsorted, $_);
next;
}
my $t = $tree;
if (@$references) {
for my $i(@$references) {
$$t{$i} = {
msg => '',
date => $date,
childs => {},
} unless exists($$t{$i});
$t = $$t{$i}{childs};
}
}
$$t{$id} = {
msg => $_,
date => $date,
childs => {},
};
}

sub print_tree {
my $tree = shift;
for my $id(sort {$$tree{$main::a}{date} <=> $$tree{$main::b}{date}}
keys(%$tree)) { print $$tree{$id}{msg};
print_tree($$tree{$id}{childs});
}
}

print_tree($tree);
print for(@$unsorted);
end mbox-sort-thread.pl ИСПОЛЬЗОВАТЬ

mbox-sort-thread.pl < входной_файл > выходной_файл

ЗАМЕТКИ

Особо не тестировалось. Может глючить.

ГЛЮКИ

Удаляет дубликаты сообщений (т.е. в выходной_файл не попадают два
или более сообщения с одинаковым идентификатором).

На здоровье.

P.S. Когда приходится выбирать между двумя задачами, выбери третью ;)

Ответить   Konstantin Korikov Sat, 28 May 2005 01:39:40 +0300 (#374982)

 

i686-suse-linux)

Hello, Konstantin!

On Sat, 28 May 2005 01:39:40 +0300 you wrote:

Спасибо! Я уже собирался сам писать (но лень :))

Имхо, надо так: my $id = (/^Message-ID:\n? <(.*?)>/mi) ? $1 : undef;
^^^
Иногда так бывает. Аналогично и ниже в парсинге других заголовков.

<skip>

Это не глюк, это фича :)

Ответить   "B." Sat, 28 May 2005 09:33:06 +0400 (#375091)