我最近开始完善我的筛选规则,但有点不确定它: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;
}
... 是否符合预期结果?或者两个列表不匹配第一个列表中的每个元素与第二个列表中的每个元素相对应 反正?
注意:我知道逗号分隔的条件分别受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;
}
...或者完全是别的东西。
答案1
anyof
意味着如果任何单个标题包含其中一个备选值,则整个条件变为true
,尽管其余标题包含其他内容。
anyof
当所有标头都包含预定义值时, ALSO 也会变为这样true
。这是宽松的条件。
allof
仅true
当所有标头都包含预定义值时才会生效。这是严格条件。
答案2
作为您所指出的参考以及RFC 3028 规范说测试header
,
如果任何标题名称与任何键匹配,则“标题”测试评估为真。
也就是说,每个标题名称都会与每个值进行比较,如果任何交叉乘积匹配,则测试通过。指定的比较器(:contains
在您的情况下)用于每个单独的比较。基本上,您的第一次重写anyof
是正确的。
当您想要使用多个测试时,可以使用anyof
and allof
,但有时您可以将很多逻辑打包到一个“测试”中,就像这里一样。