我有一个食谱似乎与地址不匹配。
我试过这些:
* ^From.*address9@gmail.com
* ^From.*address9@gmail.com
* ^From.*address[0-9]@gmail.com
* ^From.*addressd@gmail.com
* ^From.*addressd@gmail.com
但上述作品都没有...我完全迷失了。看起来正则表达式在 procmail 中有自己的逻辑和模式。
这是我的完整食谱。要匹配的地址末尾有这个 9,它 gmail.com 当我将任何其他电子邮件地址放入此 * ^From.* 字段时,它工作正常,但这个没有......这是我的完整食谱。要匹配的条件是:当标签来自 address9@gmail.com 并且主题字段为空时添加标签 [新建报告]。如果有人能提供建议,我将不胜感激,因为我快要发疯了,试图了解这里的错误在哪里。
:0 fhw
* ^From.*address9@gmail.com
* ^Subject:/.+
| /usr/bin/formail -i "Subject: [New Report]$MATCH"
对于如何解决它的任何指示,也将不胜感激。提前非常感谢!
标题如下所示:
From: Name Lastname <address9@gmail.com>
Date: Wed, 12 Jun 2019 20:37:17 +1200
Message-ID<CADxD3vdy5cW55mogOK5+543ngU7iFKjJcpDV3Q4YL772F=LdQ@mail.gmail.com>
Subject:
正则表达式实际上非常简单。几乎每个角色都只是匹配自己。因此,如果您有(行首)F
r
o
m
:
后跟任何内容,后跟a
d
d
r
e
s
s
9
......它应该匹配。
Procmail不支持像d
或t
这样的各种Perl扩展,当然也没有必要像@
那样反斜杠在正则表达式中没有特殊含义的字符。 如果要匹配[0-9]
没有任何反斜杠的单个数字(这些会更改[
并]
回文字匹配)。
^Subject:/.+
检查Subject:
标头中是否至少有一个字符,并将其全部收集到$MATCH
中。这不会检查主题是否为空。也许你想要类似的东西
# t is not supported, replace with a literal tab character
* ^Subject:[ t]+$
其中t
应替换为文本选项卡。每封邮件都应包含一个Subject:
标头,以便它始终存在,但如果其值完全由空格组成,则将其视为空主题。当然,如果标头为空,则无需捕获其内容。
回顾您的尝试,这里有一些关于每个尝试的评论。
^From.*address9@gmail.com
如上所述,
@
前面的反斜杠是多余的,但无害。这应该匹配任何以From
开头的标题行,并且在同一行后面的某个地方包含address99@gmail.com
。^From.*address9@gmail.com
未转义的点匹配任何字符,因此这也将匹配
address9@gmailscom.example.org
例如。^From.*address[0-9]@gmail.com
方括号被转义,因此在字面上匹配。这将匹配任何以
From
开头且包含文本address[0-9]@gmail.com
行后面某处的行,这在实践中不太可能。^From.*addressd@gmail.com
Procmail 不支持数字的 Perl 转义
d
,因此这将与以From
开头的标题行上的字面addressd@gmail.com
匹配。^From.*addressd@gmail.com
如上所述,除了文字点之外,未转义的点再次匹配任何字符。
话虽如此,如果冒号后面至少有一个空格,您的第二个条件将匹配Subject:
,因此,它确实应该在您的测试用例中匹配,除非Subject:
标头中确实没有任何内容。
所以无论如何,如果这是你的问题,From:
配方实际上可能匹配,但Subject
条件不匹配。 使用 ProcmailVERBOSE
日志记录,您将在日志文件中看到每个正则表达式中带有"匹配"或"不匹配"。
:0 fhw
* ^From.*address9@gmail.com>
* ^Subject:[ ]*$
| /usr/bin/formail -i "Subject: [New Report]"
(添加的单词边界>
可防止com
匹配(如果它是较长单词的一部分)。
或者,也许您想使用任何Subject:
标头执行此操作?(这次我使用的是正确的文字选项卡 - 不过,请检查您是否正确复制/粘贴了它![
和]
之间应该有一个空格和一个制表符。
:0 fhw
* ^From.*address9@gmail.com>
* ^Subject:[ ]*/.*$
| /usr/bin/formail -i "Subject: [New Report] $MATCH"
对于故障排除,也许可以查看 http://www.iki.fi/era/mail/procmail-debug.html
堆栈溢出最小可重现示例指南也很有用。简而言之,尝试将问题简化为最简单的输入消息和最简单的配方,这些方法的行为不像您期望的那样,然后一旦您无法进一步减少它,请仔细看看您剩下的内容。意识模糊的常见原因包括
- 格式错误的输入消息 应该是
- 标题中的空行?
- 标题包装在多个物理行上? 讨厌的控制字符,无论是在
- 邮件中还是在 Procmail 脚本中(不要使用 Windows 编辑器
^W
)
- 毫无根据的假设
- 正则表达式不像您想象的那样工作?
- Procmail的正则表达式方言与Perl的方言不同?在线正则表达式测试人员通常假设Perl(或偶尔使用Javascript)正则表达式功能集
- 默认情况下,Procmail 只与标头匹配;一些初学者错过了这一点,当它没有找到一个明显存在的字符串时,只会在正文中感到惊讶
- MIME 内容传输编码掩盖了您认为您知道的内容?
- 您的正则表达式确实必须匹配消息中的文字文本;Procmail不进行规范化,例如以方便的形式仅提取发件人地址以进行匹配。
。哦,还有每个人的最爱:确保将SHELL=/bin/sh
设置在食谱文件的顶部。多年来,这一直是许多完全神秘的失败的根源。
这是一个快速演示,用于演示您的测试用例对我有用:
tripleee@debian$ cat >test.msg
From: Name Lastname <address9@gmail.com>
Date: Wed, 12 Jun 2019 20:37:17 +1200
Message-ID<CADxD3vdy5cW55mogOK5+543ngU7iFKjJcpDV3Q4YL772F=LdQ@mail.gmail.com>
Subject:
No fooling
^D
tripleee@debian$ cat >test.rc
SHELL=/bin/sh
DEFAULT=/dev/null
VERBOSE=yes
:0 fhw
* ^From.*address9@gmail.com
* ^Subject:/.+
| /usr/bin/formail -i "Subject: [New Report]$MATCH"
^D
tripleee@debian$ procmail -m test.rc <test.msg
procmail: [3717] Wed Jun 12 13:38:55 2019
procmail: Match on "^From.*address9@gmail.com"
procmail: Assigning "MATCH="
procmail: Matched " "
procmail: Match on "^Subject:/.+"
procmail: Executing " /usr/bin/formail -i "Subject: [New Report]$MATCH""
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
From address9@gmail.com Wed Jun 12 13:38:55 2019
Subject: [New Report]
Folder: /dev/null 253