正则表达式实际上非常简单。几乎每个角色都简单地匹配自己。因此,如果您有(行首)From:,然后是adddds9@8@98765433@98s9@8 9 ...它应该匹配。
Procmail 不支持各种 Perl 扩展,例如 \d 或 \t,当然也不需要像 @ 这样在正则表达式中没有特殊含义的反斜杠字符。如果您想匹配 [0-9] 的单个数字没有任何反斜杠(这些会将 [ 和 ] 更改回文字匹配)。
^Subject:\/.+ 检查Subject: 标头中是否至少有一个字符,并将其全部收集到$MATCH 中。这不检查主题是否为空。也许你想要类似的东西
# \t is not supported, replace with a literal tab character
* ^Subject:[ \t]+$
\t 应替换为文字制表符。每条消息都应该包含一个Subject: 标头,以便它始终存在,但如果它的值完全由空格组成,则被认为是一个空主题。当然,如果 header 为空,则无需捕获其内容。
话虽如此,如果Subject: 中的冒号后至少有一个空格,则您的表达式将匹配,所以再次,它真的应该在您的测试用例中匹配,除非真的什么都没有在Subject: 标头中。
无论如何,如果这是您的问题,From: 配方实际上可能已经匹配,但 Subject 条件不匹配。使用 Procmail VERBOSE 日志记录,您会在日志文件中看到每个正则表达式都带有“匹配”或“不匹配”。
:0 fhw
* ^From.*address9@gmail\.com
* ^Subject:[ ]*$
| /usr/bin/formail -i "Subject: [New Report]"
或者您想对任何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
Stack Overflow Minimal Reproducible Example 指南也很有用。简而言之,尝试将问题简化为最简单的输入消息和最简单的配方,但如果您无法进一步减少它,请仔细查看您剩下的内容。造成混淆的常见原因包括
- 格式错误的输入消息
- 应该是标题中的空行?
- 标题包在多条物理行上?
- 在消息或 Procmail 脚本中不应该出现的讨厌的控制字符(不要使用 Windows 编辑器
^W)
- 无根据的假设
- Regex 不像你想象的那样工作?
- Procmail 的正则表达式方言不同于例如珀尔的?在线正则表达式测试人员通常假设 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