使用正则表达式的 Procmail 规则

使用正则表达式的 Procmail 规则

这是我的procmail食谱:

:0
* ^Subject: [JIRA] (EDRV-*) *$
.JIRA.edrive/new

:0
* ^Subject: [SPAM] *$
.SPAM/new

:0
* ^X-Spam-Status: Yes
.SPAM/new

:0
* .*
new

我想将主题为 [JIRA](EDRV-XXX)的邮件放入邮箱的 JIRA/edrive 文件夹,将主题为 [SPAM] 的邮件放入 SPAM 文件夹。

但我现在得到的是:

procmail: [8652] Sat Aug 27 19:08:19 2016
procmail: Assigning "SHELL=/bin/bash"
procmail: No match on "^Subject: [JIRA] (EDRV-*) *$"
procmail: No match on "^Subject: [SPAM] *$"
procmail: No match on "^X-Spam-Status: Yes"
procmail: Match on ".*"
procmail: Assigning "LASTFOLDER=new/msg.qVktB"
procmail: Opening "new/msg.qVktB"
procmail: Acquiring kernel-lock
 Subject: [JIRA] (EDRV-100) xxxxxxx
  Folder: new/msg.qVktB><------><------><------><------><------><------>   2795

哪里有错误?

答案1

这是一个非常基本的正则表达式错误。为了匹配[(字面意思,您必须使用反斜杠对其进行转义。

这同样适用于任何正则表达式元字符 - ,,,.等等。*|

另外,要想无条件匹配,只需不设置任何条件即可。

我猜你并不是真的想只允许匹配后的空格,所以我也把它们去掉了。如果你想说“任何东西”,那是.*在正则表达式中,但没有必要设置匹配任何东西的条件。

:0
* ^Subject: \[JIRA] \(EDRV-.*\)
.JIRA.edrive/new

:0
* ^Subject: \[SPAM]
.SPAM/new

:0
* ^X-Spam-Status: Yes
.SPAM/new

:0
new

答案2

您需要使用反斜杠转义要作为文字匹配的正则表达式字符。

看起来您正在使用的邮件是以 Maildir 格式存储的。我不知道您是否排除了邮件头或没有邮件头。这会将文件传送到相应的邮件子目录。它包含一个日志文件,以便您可以验证邮件是否得到正确处理。

#.procmailrc-procmail 配置文件

# 变量定义
MAILDIR=$HOME/Maildir/
LOGFILE=$MAILDIR/procmail.log
默认值=$MAILDIR

这些规则应该与消息匹配并将其传递到new指定邮箱的子文件夹中。

:0
* ^主题:\[JIRA\] \(EDRV-.*\)
.JIRA.edrive/

:0
* ^主题:\[垃圾邮件\]
。垃圾邮件/

:0
* ^X-Spam-Status:是
。垃圾邮件/

# 剩余内容将进入收件箱

相关内容