Давно уже использую
sieve для раскладывания личной почты по папочкам, но только недавно наткнулся на спрятанные грабли неочевидный момент. Две очень похожих конструкции работают по разному.
Условие
address :is "From" [
"do-not-reply@example.ru",
"webmaster@example.org"
],
истинно, если в заголовке From адрес do-not-reply@example.ru ИЛИ webmaster@example.org.
Я думал что похожее на вид условие
exists ["X-BeenThere", "List-Post"]
тоже сработает при наличии в письме любого из указанных заголовков. Но оказалась что exists работает наоборот - условие истинно, если в письме есть заголовки X-BeenThere И List-Post.
В итоге чтобы получить нужный мне эффект написал
header :matches ["X-BeenThere", "List-Post"] "?*"
Хорошо, что в составе
Pigeonhole Sieve есть утилита sieve-test. Если набор правил работает не так как нужно, то можно запустить
sieve-test -t debug.log -Tlevel=matching -a me@example.ru sieve.script saved_mail.msg
и посмотреть почему именно. Без неё пришлось бы наверно RFC от корки до корки перечитывать. В те времена, когда приходилось использовать cyrus sieve такой утилиты мне сильно не хватало.