web-dev-qa-db-ja.com

正規表現のふるいスクリプトが一致しません

私が書いたふるいスクリプトでdovecot2メールサーバーに問題があります。スクリプトは、メーリングリストからのメールを(リストIDではなくリスト名で)フォルダに自動的に移動する必要があります。

require ["fileinto", "mailbox", "variables", "regex"];
if exists "list-id" {
    if header :regex "list-id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}

ヘッダー付きのメールの場合

List-Id: RZ Monitoring <rz-monitoring.lists.example.com>

このスクリプトは、すべてのメールを「RZMonitoring」フォルダに移動する必要があります。しかし、何らかの理由で、代わりにすべてのメールが受信トレイに蓄積されています。

スクリプトが実行されており、ログにエラーがないため、スクリプト自体に誤りがあったに違いありません。

1
M1k3y

したがって、以下が機能しました。

require ["fileinto", "mailbox", "variables", "regex"];
if exists "List-Id" {
    if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}

Andrew Schulmanが指摘したように、「存在する」は大文字と小文字を区別するようです。これを修正した後、ログにエラーが発生しました。正規表現で

([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])
                      ^

この「-」は「9」から「_」までの範囲として解釈されますが、これは無効です(正規表現についての私の理解では、そうではありません。おそらく、ダブコットの正規表現の実装の癖です)。したがって、ここの「-」はエスケープする必要があります

([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])
0
M1k3y

Dovecot sieve docs これについては明確ではありません-RFCを掘り下げる必要があると思います-しかし、exists演算子は大文字と小文字が区別されますが、:regexではありません。したがって、List-Idの代わりにlist-idを使用する必要があります。

if exists "List-Id" {
    if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}
0
Andrew Schulman