为什么我的脚本不能持续检测电子邮件正文中的内容?

Why is my script is not consistently detecting contents in email bodies?

我设置了一个筛选器,它在检测到有关包裹递送的邮政服务电子邮件时调用 Python 脚本。 sieve 过滤器工作正常并可靠地调用 Python 脚本。然而,Python 脚本并不能可靠地完成它的工作。这是我的 Python 脚本,简化为相关部分:

#!/usr/bin/env python3

import sys
from email import message_from_file
from email import policy
import subprocess

msg = message_from_file(sys.stdin, policy=policy.default)
if " out for delivery " in str(msg.get_body(("html"))):
    print("It is out for delivery")

我收到的电子邮件在消息的 body 中包含字符串 " out for delivery ",但脚本没有打印出 "It is out for delivery"。我已经检查了消息中的 HTML 以确保它是一致的并且是 100% 一致的。令人沮丧的是,如果我从我的邮件 reader 中保存本应触发脚本的消息,然后手动将其提供给 sieve-test,那么该脚本将在 100% 的时间内运行!

为什么我的脚本 在实际邮件投递期间从不工作 总是工作 每当我用 sieve-test 测试它时?

备注:

  1. 邮件只包含一个部分,即HTML,所以我必须使用HTML部分。

  2. 我知道我可以在筛子上进行 body 测试。由于超出此问题范围的原因,我在 Python 中进行了此操作。

问题是您使用 str(msg.get_body(("html"))),这对您的目的来说是不可靠的。您得到的是作为字符串的消息正文,但是 它被编码以包含在电子邮件消息中 。您正在处理 MIME 部分,它可能用 quoted-printable 编码,在这种情况下,您测试的字符串 (" out for delivery ") 在编码时可能会分成多行。您测试的字符串可能包含您要查找的编码如下的文本:

[other text] out for=
delivery [more text]

= 符号是编码的一部分,表示后面的换行符存在 因为编码 而不是因为它在编码之前存在。

好的,但是为什么在您使用 sieve-test 总是 有效?发生的情况是您的邮件 reader 以不同的方式 对消息进行编码 ,并且它的编码方式是,您要查找的文本不会跨行拆分,并且您的脚本可以正常工作!邮件 reader 使用不同的编码保存邮件是完全正确的,只要 一旦电子邮件被解码 它的内容没有改变。

你应该做的是使用 msg.get_body(("html")).get_content(). 这将以解码形式获取正文,与邮政服务撰写电子邮件时完全相同。 .