我想实施如下规则:
- 如果“To”包括仅有的包含“*@example.com”的地址 -> 丢弃
- 否则 -> 保留
换句话说:
- 如果“To”包括最后一个与“*@example.com”不同的地址 -> 保留
- 否则 -> 丢弃
该语句的问题if not header :contains "To" "@example.com" { keep; } else { discard;}
在于,如果在其他非“*@example.com”地址中有一个“*@example.com”地址,则不会保留邮件。
我需要的是一个否定的选项搜索模式而不是完整的语句,例如:if header :contains "To" NOT "@example.com" { keep; } else { discard;}
有什么想法可以解决这个问题吗?
答案1
这有效:
require "regex";
if header :regex "to" "@[^(example.com)]+" { keep; } else { discard; }
答案2
有一个:count
匹配类型(如:is
和:contains
等)在“关系型“您可以使用:comparator
比较器扩展来执行此操作,实际上您的用例是标准示例为了它!
如果您使用的是 Dovecot Pigeonhole(许多软件包解决方案和提供商(如 RoundCube、FastMail 等)都在使用),则“关系”扩展随附于其中,您只需将它(及其比较器;见下文)与其他文件一起放在 sieve 文件的顶部即可。无论您使用哪种实现,只要扩展受支持,sieve 过滤器的外观都应该相同。
IANA 维护主列表官方扩展。如果您使用 Dovecot Pigeonhole Sieve,请向下滚动到其Github查看哪些扩展受支持(全部受支持,最完整)。这意味着您不必搜索即可找到“关系”扩展。
请注意,虽然:comparator
基本安装(Dovecot 的实现)支持它,但它默认不包含数值比较,并且排序规则本身是必须特别要求的扩展。
require [..., "relational","comparator-i;ascii-numeric"]
# ...
# reject if the number of recipient addresses is greater than 1
if allof(
address :domain ["to","cc"] "example.com",
address :count "gt" :comparator "i;ascii-numeric" ["to","cc"] "1"){
# if you really want it destroyed
# discard;
fileinto :create "Trash"; stop;
}
我做了一些测试,过滤器会结合收件人和抄送人(但不包括密件抄送人)的计数进行比较,因此它适用于(可见的)收件人地址的总数。