Procmail配方与捕获组

尝试基于正则expression式匹配来引导电子邮件。

我知道我可以做到这一点:

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" 

你有序号和顺序错误的条件。 但是另外,Procmail不能识别Perlism \d 。 (请参阅这里有一些正则expression式的历史和奥秘。)试试这个:

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

或者,如果您确实想validation匹配的expression式是否紧跟@符号,

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

从inputTo: [email protected] ,第一个条件捕获route2@ ,第二个条件通过route2匹配,以便从MATCH删除尾部@

我的怀疑是没有锁文件是必要的,所以第二个冒号应该被删除,但这取决于什么afile 。 如果它是一个普通的Berkely mbox文件,你应该使用locking。 如果这是一个Maildir文件夹,你不应该。

您可能还想考虑用^TO_mereplace^To:.*me – 它会匹配Cc:和其他相关的头文件以及To:头文件,并避免匹配reallynotme

Procmail不像正常的正则expression式那样使用捕获组,至less对于MATCH来说。 从手册页:

当被告知从匹配的正则expression式中提取文本时,这个variables被procmail分配给它。 它将包含与通过`/'标记的正则expression式匹配的所有文本。

所以下面应该工作(未经testing):

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

然后, MATCH将包含与\/之后的正则expression式匹配的所有内容,如“route \ d”。

不幸的是,这可能会做一些像[email protected]这样的地址, MATCH是“route2”。 但这可能是你可以接受的。