У меня проблема на почтовом сервере 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.])