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