procmail 替换/添加主题到空主题字段



我有一个食谱似乎与地址不匹配。

我试过这些:

* ^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: 

正则表达式实际上非常简单。几乎每个角色都只是匹配自己。因此,如果您有(行首)From:后跟任何内容,后跟address9......它应该匹配。

Procmail不支持像dt这样的各种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

最新更新