exim 过滤中的正则表达式用法

exim 过滤中的正则表达式用法

我正在尝试创建一个 exim 过滤器来阻止包含以下内容的垃圾邮件

“ 85% 折扣”

在主题行中。这是一个空格,然后是任意两位数字,然后是百分号、一个空格和全部大写的“OFF”一词。这是我写的:

# Exim filter
if
  $header_subject: contains " \\d{2}% OFF"
then
   fail text "no spam please"
   seen finish
endif

然而,这似乎不起作用,并且允许匹配消息通过,尽管它传递了正则表达式101测试。我缺少什么?正确的语法是什么?

答案1

我暂时.forward用你的文件替换了我的文件,并确认它不起作用。

有两个问题。

  1. contains执行子字符串匹配,并且不理解正则表达式。对于您想要的正则表达式matches而不是contains.

  2. PCRE 风格的字符类\d似乎被破坏了,{N}语法也是如此!我尝试了各种组合。唯一有效的语法是[0-9][0-9].即使[0-9]{2}没有工作,也没有[0-9]\\{2\\},也没有\\d\\d。 (我运行的是 4.72 版本。)编辑:原因如下: Exim 过滤器文件中的正则表达式不必使用引号,除非正则表达式包含空格。然而,即使在不带引号的正则表达式中,反斜杠也必须加倍。在引用的正则表达式中,它们必须再次加倍:$header_subject: matches "\\\\d{2}% OFF".数一下 `em:四个反斜杠。

使用 测试您的脚本/usr/sbin/exim -bF <scriptfile> -f <sender>。必须在标准输入上提供测试消息(例如从文件重定向)。

对于测试Subject:处理,它可以只包含该标题行,而不包含其他内容。F中的大写字母-bF用于启用fail命令的处理,如果您使用 则该命令将被禁用-bf

相关内容