Почему мой сценарий не постоянно обнаруживает содержимое в телах электронной почты? - PullRequest
0 голосов
/ 12 января 2020

Я установил ситовый фильтр, который запускает сценарий Python, когда обнаруживает почтовое сообщение о доставке посылок. Ситовый фильтр работает нормально и надежно вызывает скрипт 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")

Я получаю сообщения электронной почты, в тексте которых есть строка " out for delivery ", но сценарий не печатает "It is out for delivery" , Я уже проверил HTML в сообщениях, чтобы убедиться, что он согласован и на 100% согласован. Однако разочаровывает то, что если я сохраню сообщение из своей программы чтения почты, которое должно было запустить сценарий, и вручную введу его в sieve-test, то сценарий будет работать 100% времени!

Как получится Мой скрипт никогда не работает во время фактической доставки почты, но всегда работает всякий раз, когда я проверяю его с sieve-test?

Примечания:

  1. В электронном письме содержится только одна часть, а это HTML, поэтому я должен использовать HTML деталь.

  2. Я знаю, что могу провести тест на тело в сите. Я делаю это в Python по причинам, выходящим за рамки этого вопроса.

1 Ответ

1 голос
/ 12 января 2020

Проблема в том, что вы используете str(msg.get_body(("html"))), что ненадежно для вашей цели. То, что вы получаете, это тело сообщения в виде строки, но оно кодируется для включения в сообщение электронной почты . Вы имеете дело с частью MIME, которая может быть закодирована с quoted-printable, и в этом случае строка, которую вы проверяете (" out for delivery "), может быть разбита на несколько строк при кодировании. Строка, с которой вы тестируете, может иметь код, который вы ищете, закодированный следующим образом:

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

Знак = является частью кодировки и указывает на то, что следующий символ новой строки кодировки , а не потому, что она была там до кодирования.

Хорошо, но почему всегда работает, когда вы используете sieve-test? Что происходит, так это то, что ваш почтовый ридер кодирует сообщение по-другому , и то, как оно кодируется, искомый текст не разбивается на строки, и ваш скрипт работает! Для почтового читателя совершенно правильно сохранить сообщение с другой кодировкой, если после того, как электронное письмо декодировано, его содержимое не изменилось.

Что вы должны сделать, это use msg.get_body(("html")).get_content(). Получает тело в декодированном виде точно в байтовом выражении так же, как когда почтовая служба составляла письмо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...