【问题标题】:Procmail Replace / Add Subject to an Empty Subject FieldProcmail 将主题替换/添加到空主题字段
【发布时间】:2019-06-12 09:53:01
【问题描述】:

我的食谱似乎与地址不符。

我试过这些:

* ^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.* 字段时,它可以正常工作,但是这个不......这是我的完整食谱。匹配条件为:当来自address9@gmail.com且主题字段为空时添加标签[New Report]。如果有人能提供建议,我将不胜感激,因为我快要发疯了,试图了解这里的错误在哪里。

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

【问题讨论】:

  • 您能否edit 显示您正在尝试但未能匹配的整个From: 标题行?正则表达式看起来不错,当然不需要反斜杠@
  • 我添加了标题。
  • 谢谢。对我有用 - 现在查看我的答案的更新。 Message-Id:至少看起来不真实(&lt; 之前应该有一个冒号)
  • 这只是我在复制粘贴过程中犯的一个错字。 前面有一个冒号

标签: procmail


【解决方案1】:

正则表达式实际上非常简单。几乎每个角色都简单地匹配自己。因此,如果您有(行首)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

【讨论】:

  • 我想知道你如何将这个正常的正则表达式变成这个“奇怪”的 procmail 的正则表达式,它有奇怪的调整和它自己的规则? /^From:\sName\sLastname\s\
  • Perl 空格简写\s 对应于字符类[ ],括号之间有一个空格和一个制表符,这在几个地方都使用了。 Perl 技术上涵盖了更多字符,但在电子邮件标题中没有任何意义。从正则表达式纯度的角度来看,除了 Procmail 用于捕获匹配的特殊 \/ 运算符之外,这是一种奇怪的 Perl 方言(你永远无法知道反斜杠是否会转义字符或引入新的特殊标记)。
  • 您建议的正则表达式也许应该考虑空格的可能变化。它还应该完全通用地处理几种不同的地址格式(没有真实姓名,真实姓名作为实际地址后括号中的注释等)以及 MIME 编码,这本身就是一个重要的蠕虫罐。
  • 而你缺少最后的&gt;;您的正则表达式中的地址实际上格式错误。也许这一直是你的问题?
  • 你是说我应该用 [ ] 替换我的所有 \s (正则表达式中的空格),并按照前面的示例在空格和制表符之间替换?另外为什么在procmail中 ^From. 之后没有冒号,但 ^To:. 之后总是有冒号?我还没有尝试过这个正则表达式,哪里有这个最后的 > 丢失,我只是在这里快速输入它来询问一般情况。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多