claws-mail filter magic
Любой мало-мальски вменяемый почтовый клиент позволяет разделять письма по каким-то признакам. Я всё еще юзаю claws-mail и до недавнего времени использовал Processing правила для списков рассылки, на которые я подписан.
Типичное processing правило (~/.claws-mail/matcherrc):
"maemo" header "List-Id" matchcase "for maemo developers <maemo-developers.maemo.org>" move "#mh/Mailbox/другие/maemo-developers"
enabled rulename "lkml" header "X-List-ID" matchcase "kernelnewbies.nl.linux.org" move "#mh/Mailbox/другие/kernelnewbies"
enabled rulename "mc-bugs" header "List-Id" matchcase "<mc-bugs.googlegroups.com>" move "#mh/Mailbox/mail-lists/mc/mc-bugs"
enabled rulename "mc-commits" header "List-Id" matchcase "<mc-commits.googlegroups.com>" move "#mh/Mailbox/mail-lists/mc/mc-commits"
enabled rulename "haskell-cafe" header "List-Id" matchcase "haskell-cafe.haskell.org" move "#mh/Mailbox/haskell-cafe"
enabled rulename "haskell" header "List-Id" matchcase "haskell.haskell.org" move "#mh/Mailbox/haskell"
enabled rulename "gentoo-commits.gentoo.org" header "List-Id" matchcase "gentoo-commits.gentoo.org" move "#mh/Mailbox/gentoo/commits" enabled rulename
Чтобы создавать/редактировать эти правила можни или править этот файл или кликать мышью. Но иногда хочется выковырять какую-то часть subject или часть другого mime поля и произвести фильтрацию по ней.
К примеру, разбросать по каталогам следующего вида письма:
: [project1 0001]: bug1
Subject: mantis <user@email>
From...
: [project2 0002]: bug1
Subject: mantis <user@email> From
Хочется раскидать их по project1 -> mantis/foo, project2 -> mantis/bar, а остальное - просто в mantis/. Можно руками создать 3 правила, но нельзя использовать в имени каталога-назначения результат сопоставления по regexp (TODO: расширить move до понимания подстановок из regexp). Но можно воспользоваться perl плагином, в котором можно реализовать более развитую логику:
# ~/.claws-mail/perl_filter
my $h = header subject;
my $f = header from;
if ($f eq 'mantis <user@email>') {
# [project_name bug_id]: description
my $target = "#mh/Mailbox/mantis";
if ($h =~ /\[([^\]]+) \d+\]:/) {
my $project = $1;
my %project_map = ( 'project1' => 'foo'
'project2' => 'bar'
,
);# вот она, чудострока:
$target = ($target . "/" . $project_map{$project}) || $target;
}"$target"; # автоматически создает каталог
make_sure_folder_exists "$target"; move
}
Желательно прочитать различия между processing и filtering. Вкратце: filtering автоматически выполняется только на только что вошедших (Inbox) сообщениях и только после всех processing правил.
Можно повторно запустить все filtering правила на выделенные письма или каталог из меню: Tools->Filtering.
В man cm_perl можно почитать про все (их мало) селекторы и действия.