我正在尝试创建一个 exim 过滤器来阻止包含以下内容的垃圾邮件
“ 85% 折扣”
在主题行中。这是一个空格,然后是任意两位数字,然后是百分号、一个空格和全部大写的“OFF”一词。这是我写的:
# Exim filter
if
$header_subject: contains " \\d{2}% OFF"
then
fail text "no spam please"
seen finish
endif
然而,这似乎不起作用,并且允许匹配消息通过,尽管它传递了正则表达式101测试。我缺少什么?正确的语法是什么?
答案1
我暂时.forward
用你的文件替换了我的文件,并确认它不起作用。
有两个问题。
contains
执行子字符串匹配,并且不理解正则表达式。对于您想要的正则表达式matches
而不是contains
.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
。