Назад | Перейти на главную страницу

сценарий сита регулярных выражений не соответствует

У меня проблема на почтовом сервере 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». Но по какой-то причине вся почта накапливается в почтовом ящике.

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

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

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

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

([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.])

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