正则表达式筛选脚本不匹配

正则表达式筛选脚本不匹配

我在 dovecot2 邮件服务器上遇到了一个问题,我编写了一个筛选脚本。该脚本应该自动将来自邮件列表的邮件移动到文件夹中(按列表名称,而不是列表 ID)

require ["fileinto", "mailbox", "variables", "regex"];
if exists "list-id" {
    if header :regex "list-id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}

对于带有标题的邮件

List-Id: RZ Monitoring <rz-monitoring.lists.example.com>

此脚本应将所有邮件移至“RZ 监控”文件夹。但由于某种原因,所有邮件都堆积在收件箱中。

脚本正在执行,并且我的日志中没有错误,因此我一定是在脚本本身中犯了错误。

答案1

Dovecot 筛分文档对此并不清楚 - 我认为您必须深入研究 RFC - 但我认为exists运算符区分大小写,尽管:regex事实并非如此。因此您应该使用List-Id而不是list-id

if exists "List-Id" {
    if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}

答案2

因此,以下方法有效:

require ["fileinto", "mailbox", "variables", "regex"];
if exists "List-Id" {
    if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])" {
        fileinto :create "${1}";
        stop;
    }
}

正如 Andrew Schulman 指出的那样,“exists” 似乎区分大小写。修复此问题后,我在日志中遇到了错误。在正则表达式中

([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])
                      ^

这个“-”被解释为从“9”到“_”的范围,这是无效的(尽管就我对正则表达式的理解而言,它不应该有效。可能是 dovecots 正则表达式实现的一个怪癖)。所以这里的“-”必须转义

([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])

相关内容