如何过滤Procmail中具有超链接中特定单词的邮件

时间:2013-09-28 08:37:43

标签: procmail

是否可以在Procmail中创建正则表达式来过滤掉包含某些单词的链接?

例如,我想过滤掉所有带有“unsubscribe”字样的超链接的电子邮件(虽然它可能不是唯一的字)。这会过滤掉我在一个子文件夹中发送给我的很多新闻通讯,我可以立即检查。

例如,我试试这个:

.*<a.*unsubscribe.*</a>.*

但是,这只会过滤掉任何带有链接的内容,其中包含一些取消订阅的单词(不一定在链接中),然后是另一个结束链接(不一定是单词之后的第一个)。它不会在单词unsubscribe之前过滤最后打开的超链接,直接后跟第一个结束超链接标记。

我找不到任何有关如何在单词之前找到某些HTML的最后一次出现的信息,然后是单词,然后是单词之后的第一次出现的HTML,我想这就是我需要做的。

1 个答案:

答案 0 :(得分:1)

这不完全准确,但可能足够接近你想要的东西。

:0B
* <a([  ]+[^ > ]+)*[  ]+href="[^>"]*unsubscribe
unsub/

这会在正文(a标志)中查找包含href的双引号中带有unsubscribe属性的HTML B元素。可选组([ ]+[^ > ]+)*href之前允许零个或多个其他属性。

与Procmail中的常规内容一样,[ ][^ > ]中的空格应该是任何顺序的空格和制表符。 (我现在使用的移动设备不会让我轻松输入标签,因此不能复制/粘贴。)

但是,并非所有HTML都格式正确,并非所有href属性都是双引号,并且并非所有HTML附件都是未编码的。实际上,最大的实际缺陷是引用可打印的HTML无法正确处理。一个简单的“80/20”解决方案是将=更改为=(3D)?;一个非常复杂的问题是如何处理所有可能的QP变化(包括可选的equals,newline wrap wrap);真正正确的解决方案是使用一个正确的MIME感知工具来代替或从内部使用Procmail;这样,您还可以透明地处理base64编码的HTML。

从表面上看,通过将重复操作符从贪婪更改为非贪婪来回答您的直接问题。在很多单词中,.*会跳过尽可能多的文本,而[^>]*将永远不会在下一次出现>之前跳过。但是,如上所述,由于MIME允许以不同方式对文本进行编码以便通过电子邮件进行安全传输,因此存在明显的其他复杂情况。