带有捕获组的 Procmail 配方

带有捕获组的 Procmail 配方

尝试根据正则表达式匹配来定向电子邮件。

我知道我能做到:

echo | mail -s test1 me-route2

使用这个食谱:

* ^To:.*me-route2\@
:0:
/home/me/folder-route2/afile

我想做的是这样的:

* ^To:.*me-(route\d)\@
:0:
/home/me/folder-$MATCH/afile

但我得到了:

procmail: Lock failure on "/home/me/folder-/afile.lock"

答案1

您的序言行和条件顺序错误。但此外,Procmail 无法识别 Perlism \d。(参见例如这里了解一些正则表达式的历史和奥秘。)尝试这个:

:0:
* ^To:.*me-\/route[0-9]
/home/me/folder-$MATCH/afile

或者,如果你确实想验证匹配的表达式后面是否紧跟着一个 @ 符号,

:0:
* ^To:.*me-\/route[0-9]@
* MATCH ?? ^\/route[0-9]
/home/me/folder-$MATCH/afile

从输入中,第一个条件捕获并且第二个条件匹配以便从中删除尾随。To: [email protected]route2@route2@MATCH

我怀疑不需要锁定文件,因此应该删除第二个冒号,但这取决于具体afile是什么。如果是常规 Berkely mbox 文件,则绝对应该使用锁定。如果是 Maildir 文件夹,则不应该。

您可能还想研究^To:.*me用进行替换^TO_me——它将匹配Cc:和其他相关标题以及文字To:标题,并避免匹配reallynotme

答案2

Procmail 不像普通正则表达式那样使用捕获组,至少对于 MATCH 来说是这样。从手册页中:

每当 procmail 被告知从匹配的正则表达式中提取文本时,它都会分配此变量。它将包含与“/”标记后面的正则表达式匹配的所有文本。

因此下面的操作应该可行(未经测试):

* ^To:.*me-\/route\d

MATCH然后将包含与 之后的正则表达式匹配的任何内容\/,所以是“route\d”。

遗憾的是,这可能会对类似 的地址([email protected]MATCH“route2”)造成意想不到的影响。但这可能对您来说是可以接受的。

相关内容