from email import message_from_binary_file
from email.policy import default
import sys
for filename in sys.argv[1:]:
with open(filename, "rb") as msg:
message = message_from_binary_file(msg, policy=default)
if "fnord" in message.get_body(preferencelist=('plain', 'html')).get_content():
print(f"{filename}: there")
else:
print(f"{filename}: not there")
Content-type: text/plain; charset="utf-8"
Content-transfer-encoding: quoted-printable
Annoyingly, QP lets you insert a newline in the midd=
le of a word, so you could end up not finding this f=
nord occurrence.
Procmail 本身没有任何功能来循环您已收到的消息,但它的配套实用
formail
程序可以循环 mbox 文件中的消息;或者,当然,如果您使用像 Maildir 这样的邮箱格式,您可以简单地循环包含这些消息的文件。其中
testing.rc
可能包含类似的内容将匹配的消息发送到第一个地址,将其他消息发送到第二个地址。(可能使用不向任何地方发送任何内容的规则进行测试!)
为了操作 mbox 文件,调用将类似于
要查看第一个 MIME 部分,您基本上需要弄清楚如何将该部分提取为 Procmail 可以读取的内容。如果内容可能是 Base64,则需要一个 Base64 解码器,以及一些相当复杂的逻辑来隔离消息部分。也许到了那个时候,可以使用支持更好的第三方工具来检查现代 MIME 消息的内部结构吗?这是一个简单的 Python 工具。
这只是根据是否找到搜索词来打印“那里”或“不在那里”。显然,您可以扩展它以将输入文件移动或复制到另一个目录,或者将消息发送到不同的地址,或者在 Python 脚本本身内执行其他操作;或者从 Bash 脚本运行它并响应其输出。
但回到 Procmail,如果您所需要的只是搜索一个简单的文本/纯文本部分,并且可以忍受不必要地搜索第一个部分之外的其他部分,也许这样说就足够了
(与我的 Python 示例不同,它演示了搜索短语周围的单词边界)。这仍然很脆弱,因为即使是引用的可打印消息也可能包含
上面的简单 Python 工具可以很好地处理这个问题。