Procmail替换/添加主题到一个空的主题字段

时间:2019-06-12 09:53:01

标签: procmail

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

我尝试了这些:

* ^From.*address9\@gmail\.com

* ^From.*address9@gmail.com

* ^From.*address\[0-9\]\@gmail\.com

* ^From.*address\d\@gmail\.com

* ^From.*address\d@gmail.com

但是上面没有这些作品……我完全迷失了。看起来正则表达式在procmail中具有自己的逻辑和模式。

这是我的完整食谱。匹配的地址末尾有9,这是gmail.com。当我在此* ^ From。*字段中输入任何其他电子邮件地址时,它可以正常工作,但此地址不行。这是我的完整食谱。匹配的条件是:当标签[New Report]来自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: 

1 个答案:

答案 0 :(得分:0)

正则表达式实际上非常简单。几乎每个字符都简单地匹配自己。因此,如果您有(行首)F r o m :,然后跟着a d { {1}} d r e s s ... 应该匹配。

Procmail不支持9\d之类的各种Perl扩展,当然也不需要反斜杠在\t等正则表达式中没有特殊含义的字符。如果您想匹配一个@ 没有的数字,则可以使用任何反斜杠(那些反斜杠会将[0-9][改回原义匹配)。

]检查^Subject:\/.+标头中是否至少有一个字符并将其全部收集到Subject:中。 检查主题是否为空。也许您想要类似的东西

$MATCH

# \t is not supported, replace with a literal tab character * ^Subject:[ \t]+$ 应该用文字标签代替。每条消息都应包含一个\t头,因此它将始终存在,但是如果其值完全由空格组成,则将其视为空主题。当然,如果标头为空,则无需捕获其内容。

话虽如此,如果Subject:中的冒号后面至少有一个空格,则您的表达式将匹配,因此,再次,在测试用例中,它应该匹配,除非确实存在Subject:标头中完全没有任何内容。

因此,无论如何,如果这是您的问题,Subject:配方实际上可能已经匹配,但是From:条件却不匹配。使用Procmail Subject进行日志记录,您将在日志文件中看到每个带有“匹配”或“不匹配”的正则表达式。

VERBOSE

或者您想使用任何:0 fhw * ^From.*address9@gmail\.com * ^Subject:[ ]*$ | /usr/bin/formail -i "Subject: [New Report]" 标头来执行此操作? (这一次我使用的是正确的文字标签-不过请检查您是否正确复制/粘贴了此标签!Subject:[之间应该有一个空格和一个标签。)

]

要进行故障排除,请看一下http://www.iki.fi/era/mail/procmail-debug.html

堆栈溢出Minimal Reproducible Example指南也很有用。简而言之,尝试将问题简化为最简单的输入消息和行为不如您期望的最简单的配方,然后一旦无法进一步降低问题,请仔细看一下剩下的内容。造成混乱的常见原因包括

  • 格式错误的输入消息
    • 标题行中的空行是什么?
    • 标头包裹在多条物理线上吗?
    • 消息或您的Procmail脚本中不应该存在的令人讨厌的控制字符(不要使用Windows编辑器:0 fhw * ^From.*address9@gmail\.com * ^Subject:[ ]*\/.*$ | /usr/bin/formail -i "Subject: [New Report] $MATCH"
  • 无根据的假设
    • 正则表达式无法按照您的想法工作?
    • Procmail的regex方言不同于例如Perl的?在线正则表达式测试人员通常会假设使用Perl(或偶尔使用Javascript)正则表达式功能集
    • 默认情况下,Procmail仅与标题匹配;一些初学者会错过这一点,并且在找不到仅存在于体内的明确字符串的情况下感到惊讶
    • MIME内容传输编码会掩盖您以为您知道的内容?
    • 您的正则表达式实际上必须匹配消息中的文字文本; Procmail不进行规范化,例如以方便的形式仅提取发件人地址以进行匹配。

...哦,每个人都喜欢:确保将^W设置在配方文件的顶部。多年来,这是许多其他完全神秘的失败的根源。

以下是一个快速演示,演示您的测试用例对我有用:

SHELL=/bin/sh