Sieve过滤器body扩展正则捕获变量$1、$2未正常赋值问题
Sieve过滤器正则捕获变量为空的问题
尝试使用body、regex和variables扩展编写Sieve邮件过滤器,极简测试代码如下:
require ["body", "regex", "variables", "vnd.cyrus.log"]; if allof ( address :is "from" "no_reply@yabbadabba.doo", body :regex "message from ([0-9]+) to 456:(.+)" ) { log "1 = \"${1}\""; log "2 = \"${2}\""; }
测试邮件原始内容:
To: fred@theflintston.es Subject: New message from 123 to 456 From: <no_reply@yabbadabba.doo> Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=UTF-8 ----------------------------------------------------------------------------- message from 123 to 456:hello world
使用Fastmail的Sieve测试工具测试后,输出中$1和$2为空值,但预期应捕获到"123"和"hello world",为何这两个变量未被赋值?
原因及解决方法
核心原因
Sieve的body :regex仅用于判断邮件正文是否匹配指定正则表达式,不会自动将正则捕获组的内容赋值给$1、$2这类全局变量。条件判断阶段的正则匹配仅返回布尔结果,不会存储捕获的分组内容,因此后续代码无法直接引用这些捕获值。
修正方案
需要使用match命令显式执行正则匹配,并将捕获组的内容存入对应变量。修正后的代码示例如下:
require ["body", "regex", "variables", "vnd.cyrus.log"]; if address :is "from" "no_reply@yabbadabba.doo" { # 直接对邮件正文执行正则匹配,将捕获组存入$1、$2 match "${body}" :regex "message from ([0-9]+) to 456:(.+)" into $1, $2; # 验证捕获结果并输出日志 if allof(not string :is "${1}" "", not string :is "${2}" "") { log "1 = \"${1}\""; log "2 = \"${2}\""; } }
修改后,测试工具将正确捕获到"123"和"hello world"并输出对应的日志内容。
内容的提问来源于stack exchange,提问作者Matthew B
相关产品推荐
相关产品推荐

