尝试根据正则表达式匹配来定向电子邮件。
我知道我能做到:
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”)造成意想不到的影响。但这可能对您来说是可以接受的。