Скрипт регулярных выражений sieve не соответствует

Скрипт регулярных выражений sieve не соответствует

У меня проблема на почтовом сервере dovecot2 с написанным мной скриптом sieve. Скрипт должен автоматически перемещать почту, приходящую из списка рассылки, в папку (по имени списка, а не по идентификатору списка)

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>

Этот скрипт должен перемещать всю почту в папку "RZ Monitoring". Но по какой-то причине вся почта вместо этого скапливается во входящих.

Скрипт выполняется, и в моих журналах нет ошибок, так что, должно быть, я допустил ошибку в самом скрипте.

решение1

TheDovecot сито документыне совсем ясно об этом - я думаю, вам придется покопаться в 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;
    }
}

решение2

Итак, сработало следующее:

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;
    }
}

Как указал Эндрю Шульман, похоже, что "exists" чувствителен к регистру. После исправления этого я столкнулся с ошибкой в ​​логах. В регулярном выражении

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

этот "-" интерпретируется как диапазон от "9" до "_", что недопустимо (хотя, насколько я понимаю регулярные выражения, так быть не должно. Возможно, это особенность реализации регулярных выражений Dovecots). Поэтому "-" здесь нужно экранировать

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

Связанный контент