我在 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.])