Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的脚本不能始终如一地检测电子邮件正文中的内容?_Python_Email_Sieve Language - Fatal编程技术网

Python 为什么我的脚本不能始终如一地检测电子邮件正文中的内容?

Python 为什么我的脚本不能始终如一地检测电子邮件正文中的内容?,python,email,sieve-language,Python,Email,Sieve Language,我已经设置了一个sieve过滤器,当它检测到关于包裹递送的邮政服务电子邮件时,它会调用Python脚本。sieve过滤器工作正常,可以可靠地调用Python脚本。但是,Python脚本不能可靠地完成其工作。以下是我的Python脚本,简化为相关部分: #!/usr/bin/env python3 import sys from email import message_from_file from email import policy import subprocess msg = mes

我已经设置了一个sieve过滤器,当它检测到关于包裹递送的邮政服务电子邮件时,它会调用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")
我收到的电子邮件在邮件正文中有要发送的字符串,但脚本没有打印出来,而是要发送。我已经检查了邮件中的HTML,以确保它是一致的,并且是100%一致的。但令人沮丧的是,如果我从邮件阅读器中保存了应该触发脚本的消息,并手动将其提供给筛选测试,那么脚本在100%的时间内都能正常工作

为什么我的脚本在实际邮件传递过程中不起作用,但在我使用筛子测试时总是起作用

注:

电子邮件只包含一个部分,即HTML,因此我必须使用HTML部分

我知道我可以用筛子做身体测试。我在Python中这样做的原因超出了这个问题的范围


问题是您使用strmsg.get_bodyhtml,这对于您的目的来说是不可靠的。你得到的是一个字符串形式的消息体,但是它被编码以包含在电子邮件消息中。您要处理的是MIME部分,它可能是用带引号的printable编码的,在这种情况下,您测试的要交付的字符串在编码时可能被分割成多行。测试所针对的字符串可以将要查找的文本编码为:

[other text] out for=
delivery [more text]
=符号是编码的一部分,表示后面的换行是因为编码而不是因为编码之前的换行

好的,但为什么在使用筛分测试时它总是有效?所发生的事情是,您的邮件阅读器以不同的方式对邮件进行编码,并且按照编码方式,您要查找的文本不会跨行分割,而且您的脚本可以正常工作!邮件阅读器以不同的编码保存邮件是完全正确的,只要邮件解码后其内容没有改变

您应该使用msg.get\u bodyhtml.get\u content。这将以解码形式获取正文,与邮政服务编写电子邮件时完全相同