Проблема в том, что вы используете 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()
. Получает тело в декодированном виде точно в байтовом выражении так же, как когда почтовая служба составляла письмо.