Не следует преобразовывать структуру MIME в строку, а затем передавать ее в message_from_string
. Вместо этого сохраните его как bytes
объект.
...
items = items[0].split()
for emailid in items:
resp, data = conn.uid("fetch",emailid, "(RFC822)")
if resp == 'OK':
email_blob = data[0][1]
mail = email.message_from_bytes(email_blob)
if not any(x in mail['subject'] for x in ('PA1', 'PA2')):
continue
Вы не показываете, как вы проходите через структуру MIME, поэтому я полагаю, что вы в настоящее время вообще этого не делаете. Возможно, вы хотите что-то вроде
# continuation for the above code
body = mail.get_body(preferencelist=('plain', 'html'))
for lines in body.split('\n'):
if line.startswith('MACHINE:'):
result = line[8:].strip()
break
Похоже, у вас есть часть тела письма, закодированная с использованием Content-Transfer-Encoding: quoted-printable
. Вышеприведенный код устойчив к различным кодировкам, потому что библиотека email
прозрачно декодирует инкапсуляцию для вас, что избавляет от любых разрывов строк, экранированных QP, как в вашем вопросе. Для справки, quoted-printable
может разбить длинную строку в любом месте, в том числе в середине значения, которое вы пытаетесь извлечь, так что вы действительно хотите расшифровать перед попыткой извлечь что-либо.