Разъяснение о необходимых правилах сита...: содержит с или без anyof/allof?
Недавно я начал совершенствовать свои правила сита и стал немного неуверенным в том, как :contains
на самом деле работает. Я проверил http://sieve.mozdev.org/reference.html но это все еще не прояснило мой вопрос.
Скажем, у меня есть следующее правило:
if
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] [
"ros-dev.reactos.org",
"ros-general.reactos.org"
]
{
fileinto "Lists/ReactOS";
stop;
}
означает ли это (и это было бы моей идеей о том, как я хочу, чтобы это работало) автоматически, что любое из перечисленных полей заголовка ["List-Id", "X-Mailinglist", "X-Mailing-List"]
должен содержать любое из заданных значений ["ros-dev.reactos.org", "ros-general.reactos.org"]
или я должен сказать прямо if anyof (...)
как это?:
if anyof (
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] [
"ros-dev.reactos.org",
"ros-general.reactos.org"
]
)
{
fileinto "Lists/ReactOS";
stop;
}
... для этого желаемого результата? Или два списка не совпадают каждый элемент первого с каждым элементом второго списка в любом случае?
NB: я знаю, что на условия, разделенные запятыми, влияют anyof
а также allof
соответственно. Так if anyof (condition1, condition2)
означает (псевдокод) if (condition1 or condition2)
а также if allof (condition1, condition2)
средства if (condition1 and condition2)
, Понимание этого аспекта - не моя проблема.
Что я не понимаю, так это anyof
а также allof
соответственно влияет на один или оба списка в :contains
оговорка В приведенном выше примере есть список полей заголовка и список значений для сравнения.
По сути, вопрос сводится к тому, есть ли смысловая разница между двумя приведенными выше фрагментами. А если нет, то означает ли первый:
if anyof (
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-dev.reactos.org",
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-general.reactos.org"
)
{
fileinto "Lists/ReactOS";
stop;
}
... или это:
if allof (
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-dev.reactos.org",
header :contains ["List-Id", "X-Mailinglist", "X-Mailing-List"] "ros-general.reactos.org"
)
{
fileinto "Lists/ReactOS";
stop;
}
... или что-то совсем другое.
2 ответа
anyof
означает, что если любой отдельный заголовок содержит одно из альтернативных значений, тогда все условие становится true
Тем не менее, остальные заголовки содержат что-то еще.
anyof
ТАКЖЕ становится true
когда все заголовки содержат предопределенные значения. Это расслабленное состояние.
allof
ТОЛЬКО становится true
когда все заголовки содержат предопределенные значения. Это строгое условие.
Как указано в справочной информации, указанной вами, а также в спецификации RFC 3028 для header
тестовое задание,
Тест "header" оценивается как true, если какое-либо имя заголовка соответствует какому-либо ключу.
То есть каждое имя заголовка сравнивается с каждым значением, и, если какой-либо из перекрестных продуктов является совпадением, тогда тест проходит. Указанный компаратор (:contains
в вашем случае) используется для каждого отдельного сравнения. По сути, ваш первый переписать в anyof
верно.
Использование anyof
а также allof
это когда вы хотите использовать несколько тестов, но иногда вы можете собрать много логики в один "тест", как здесь.