Как получить электронную почту в UTF-8? - PullRequest
0 голосов
/ 21 сентября 2018

Я делаю сценарий Python для получения почты, отправленной людьми на мой адрес электронной почты.

Я использую модуль ImapClient, и я получил содержимое электронной почты, но, как ни странно, прототипирован, все моиUTF-8 Символы кодируются следующим образом:

Нет = C3 = ABl

Вот мой кусок кода:

    email_message = email.message_from_bytes(message_data[b'RFC822'])
    print(email_message.get_payload(0))

Iпопытался также добавить decode=True аргументы в мой get_payload, но он возвращает мне NoneType.

1 Ответ

0 голосов
/ 21 сентября 2018

Сначала вам нужно будет указать интересующую вас часть электронной почты. Затем вы расшифруете содержимое этой части в соответствии с кодировкой этой части.Каждая часть может иметь различную кодировку и / или набор символов.Если вас интересует основная часть письма, обычно это первая часть, которая может быть html или может быть простым текстом, в зависимости от программы, которая его отправила (некоторые пользовательские агенты, такие как gmail, будут включать обе формы).

Вы можете использовать функцию EmailMessage.walk () модуля электронной почты над объектом сообщения, чтобы увидеть различные вложения и соответствующие им типы контента.Части отделены друг от друга специальной «граничной» строкой (часто случайной), которая отсутствует в теле сообщения (чтобы избежать неоднозначности).Модуль электронной почты проще разрешить обходить детали за вас, тем более что детали могут быть вложенными.

Фрагмент текста, который вы показываете в своем вопросе, выглядит закодированным для печати в кавычках.Вы можете найти пример преобразования из quoted-printable в utf-8 здесь: Измените кодировку «Quoted-printable» на «utf-8»

Пример :

Я добавляю пример ложного необработанного сообщения, которое будет представлять байты, формирующие объект EmailMessage.В электронном письме каждый раздел / часть (основной текст, вложения и т. Д.) Может иметь различный тип содержимого, кодировку и кодировку передачи.Части могут включать в себя части, но сообщения электронной почты обычно имеют просто плоскую структуру.Для частей, которые являются вложениями, было бы также обычно найти значение расположения содержимого, которое указывало бы на предлагаемое имя файла для содержимого файла.

Subject: Woah
From: "Sébastien" <seb@example.org>
To: Bob <bob@example.org>
Content-Type: multipart/alternative; boundary="000000000000690fec05765c6a66"

--000000000000690fec05765c6a66
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

S=C3=A9bastien est un pr=C3=A9nom.

--000000000000690fec05765c6a66
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div di=
r=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"lt=
r"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div=
dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr">...

...

После выбора интересующей вас части вам необходимоиспользуйте параметры кодирования этой части для правильного преобразования полезной нагрузки.Сначала вы должны отменить любую кодировку передачи (например, quoted-printable) и декодировать результирующую строку в соответствии с набором символов.

Если набор символов нужной части уже равен UTF-8, то все, что вам потребуется,do - отменить кодировку передачи содержимого (например, удалить последовательности, заключенные в кавычки).Однако, если кодировка детали была другой, скажем Latin-1, вам пришлось бы перейти от байтов к юникоду, а затем обратно от юникода к utf8:

# remove quoted-printable encoding
unquoted = quopri.decodestring(mime_part_payload)

# latin-1 in this case is the charset of the mime part header
tmp_unicode = unquoted.decode('latin-1', errors='ignore')

# encode to desired encoding
u8 = tmp_unicode.encode('utf-8')
...