Ваши электронные письма имеют кодировку передачи контента , в частности, цитируемую-кодируемую кодировку , которая используется для обеспечения безопасности потока данных электронной почты в формате ASCII.
Просто скажите Python для декодирования полезной нагрузки, передав decode=True
методу Message.get_payload()
:
body_data = part.get_payload(decode=True)
charset = part.get_param("charset", "ASCII")
body = body_data.decode(charset, errors="replace")
Однако это означает, что выданные двоичные , даже для типов текстового содержимого и, следовательно, должны явно декодировать данные. get_payload()
здесь не так уж полезно. Это также часть устаревшего API;Вы хотите переключиться на более новый Unicode-дружественный API. При загрузке сообщения используйте политику, отличную от compat32
(по умолчанию):
from email import policy
# ...
raw_email = data[0][1]
# you may have to use policy.default instead, depending on the line endings
# convention used.
email_message = email.message_from_bytes(raw_email, policy=policy.SMTP)
и далее вниз
msg = email.message_from_bytes(response_part[1], policy=policy.SMTP)
Обратите внимание, что я не декодируюсначала значение bytes
. Используя email.message_from_bytes()
вместо email.message_from_string()
, вы делегируете декодирование данных парсеру email
.
Теперь email_message
- это email.message.EmailMessage
экземпляр вместо старого email.message.Message()
типа , и вы можете использовать EmailMessage.get_content()
метод , который для текстовых типов MIME возвращает текстовую строку Unicode:
body = part.get_content()