筛:过滤规则

筛:过滤规则

我想实施如下规则:

  • 如果“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;
  }

我做了一些测试,过滤器会结合收件人和抄送人(但不包括密件抄送人)的计数进行比较,因此它适用于(可见的)收件人地址的总数。

RFC 5228:筛子
RFC 5231:关系扩展

相关内容