僕はメール集約用のIMAPサーバーのLDAとして、Dovecot附属のdeliverを使っている。このdeliverはDovecot附属ということで当然ながらDovecotとの相性は良く、sieveでメールのフィルタリングを行うことが出来るのでprocmailなどと比べて機能上の問題も無い。sieveに対応しているソフトウェアは多く、メールクライアントで対応しているものも有る。
さて、MLからのメールを自動的にMLの名前のフォルダに振り分けるsieveスクリプトが、 http://wiki.exim.org/MailFilteringTips の「here isthe same script translated to Sieve:」以下で公開されていた。ヘッダのlist-idなどや、MLっぽいメールアドレスから正規表現でMLの名前を引っ張り出して、その名前のフォルダに振り分ける。フォルダが存在しない場合の動作はsieveを動かす環境によるだろうが、普通は自動で作成されるとは思う。
そんな感じの便利なスクリプトだが、X-ML-Nameに対応しておらず、またメールアドレスから引っ張り出すのは誤爆の危険が有り、ちゃんとヘッダに情報を入れるMLのみを購読していれば不要なため、少し修正した。
require [ "regex", "variables", "fileinto", "envelope" ];
# lists using x-ml-name
if exists "x-ml-name" {
if header :regex "x-ml-name" "([a-z0-9-]+)" {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
fileinto "list.unknown";
}
stop;}
# Mailman & other lists using list-id
elsif exists "list-id" {
if header :regex "list-id" "<([a-z0-9-]+)[.@]" {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
if header :regex "list-id" "^\\s*<?([a-z0-9-]+)[.@]" {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
fileinto "list.unknown";
}
}
stop;}
# Listar and mailman like
elsif exists "x-list-id" {
if header :regex "x-list-id" "<([a-z0-9-]+)\\\\." {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
fileinto "list.unknown";
}
stop;}
# Ezmlm
elsif exists "mailing-list" {
if header :regex "mailing-list" "([a-z0-9-]+)@" {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
fileinto "list.unknown";
}
stop;}
# York lists service
elsif exists "x-mailing-list" {
if header :regex "x-mailing-list" "^\\s*([a-z0-9-]+)@?" {
set :lower "listname" "${1}";
fileinto "list.${listname}";
} else {
fileinto "list.unknown";
}
stop;}
これを.dovecot.sieveの先頭にでも書いて、貴方も素敵なsieveライフ!