sieve: is it possible to filter ALL mailing lists (with header List-Id) to their folders with ONE rule?
Darac Marjal
mailinglist at darac.org.uk
Mon Sep 15 09:12:11 UTC 2014
On Fri, Sep 12, 2014 at 10:25:19PM +0400, Lev Serebryakov wrote:
> Hello, Dovecot.
>
>
> Is it possible to write one rule in sieve, which will:
>
> (1) Trigger on any message with "List-Id" header
>
> AND
>
> (2) Put this message to folder with name build from content of "List-Id"
> header, in such way, that message with List-Id
>
> List-Id: This is decription of list <list-name.host.org>
>
> will be put into folder "org.host.list-name" where "." is namespace
> separator (so, such folders will be shown as hierarchy in mail client)?
>
> I don't want to write ~50 rules by hands and add new ones from time to
> time.
>
> I'm speaking about dovecot/pigeonhole sieve implementation, of course. All
> examples on net shows only manual one-rule-per-list approach :(
Not one rule, but I use the following script to filter mailing lists
into folders. It handles most mailing list types and, for consistency,
the folder name is case-folded to title case.
##
require [ "regex", "variables", "fileinto", "envelope", "mailbox", "imap4flags" ];
# Mailinglist Killfile
if anyof (header :contains "from" "unwanted at example.com",
header :contains "from" "spammer at example.net",
header :contains "from" "troll at example.org"){
discard;
stop;
}
if anyof (header :contains "x-spam-flag" "yes",
allof (header :regex "X-DSPAM-Result" "^(Spam|Virus|Bl[ao]cklisted)$",
not header :contains "X-DSPAM-Reclassified" "Innocent")){
# Spam goes into the spam folder
setflag "\\Seen";
fileinto :create "spam";
stop;
}
# split out the various list forms
# Mailman & other lists using list-id
if exists "list-id" {
if header :regex "list-id" "<([a-z_0-9-]+)[.@]" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
if header :regex "list-id" "^\\s*<?([a-z_0-9-]+)[.@]" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
}
stop;}
# Listar and mailman like
elsif exists "x-list-id" {
if header :regex "x-list-id" "<([a-z_0-9-]+)\\\\." {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;}
# Ezmlm
elsif exists "mailing-list" {
if header :regex "mailing-list" "([a-z_0-9-]+)@" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;}
# York lists service
elsif exists "x-mailing-list" {
if header :regex "x-mailing-list" "^\\s*([a-z_0-9-]+)@?" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;}
# Smartlist
elsif exists "x-loop" {
if header :regex "x-loop" "^\\s*(a-z_0-9-]+)@?" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;}
# poorly identified
elsif envelope :contains "from" "owner-" {
if envelope :regex "from" "owner-([a-z_0-9-]+)-outgoing@" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} elsif envelope :regex "from" "owner-([a-z_0-9-]+)@" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} elsif header :regex "Sender" "owner-([a-z_0-9-]+)@" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;}
# other poorly identified
elsif envelope :contains "from" "-request" {
if envelope :regex "from" "([a-z_0-9-]+)-request@" {
set :lower "listname" "${1}";
fileinto :create "${listname}";
} else {
keep;
}
stop;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://dovecot.org/pipermail/dovecot/attachments/20140915/1265369b/attachment-0001.sig>
More information about the dovecot
mailing list