Если вы используете Python3.6 или новее, вы можете использовать метод email.message.Message.get_content()
для автоматического декодирования текста.Этот метод заменяет get_payload()
, хотя get_payload()
все еще доступен.
Скажем, у вас есть строка s
, содержащая это сообщение электронной почты (на основе примеров в документах):
Subject: Ayons asperges pour le =?utf-8?q?d=C3=A9jeuner?=
From: =?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>
To: Penelope Pussycat <penelope@example.com>,
Fabrette Pussycat <fabrette@example.com>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Salut!
Cela ressemble =C3=A0 un excellent recipie[1] d=C3=A9jeuner.
[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718
--Pep=C3=A9
=20
Не-ascii символы в строке были закодированы с кодировкой quoted-printable
, как указано в заголовке Content-Transfer-Encoding
.
Создать объект электронной почты:
import email
from email import policy
msg = email.message_from_string(s, policy=policy.default)
Здесь требуется настройка политики;в противном случае используется policy.compat32
, который возвращает устаревший экземпляр сообщения, у которого нет метода get_content.policy.default
в конечном итоге станет политикой по умолчанию, но на Python3.7 он все еще policy.compat32
.
Метод get_content()
автоматически обрабатывает декодирование:
print(msg.get_content())
Salut!
Cela ressemble à un excellent recipie[1] déjeuner.
[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718
--Pepé
Если у вас есть составное сообщение, необходимо вызвать get_content()
для отдельных частей, например:
for part in message.iter_parts():
print(part.get_content())