Как работает кодирование в темах электронной почты? (Джанго / Питон) - PullRequest
3 голосов
/ 17 марта 2011

Я отправляю электронное письмо с объектом EmailMessage в ящик Gmail.
Тема письма выглядит примерно так: u "Вы получили письмо от Даэриуса Денеша --- ответ3_433441"

Когда я получаю электронное письмо, просматривая информацию о сообщении, я вижу, что строка темы выглядит следующим образом:

Тема: =? Utf-8? B? WW91IGdvdCBhIGxldHRlciBmcm9tIERhxJdyaXVzIMSZxJfEr8SZxJfEr8SZ? = =? UTF-8? Б? ХК / El8SZxK / EmS0tLXJlcGx5M180MzM0NDE =? =

Как расшифровать эту строку темы?

Я успешно расшифровал тело письма (tex / plain) следующим образом:

for part in msg.walk():
  if part.get_content_type() == 'text/plain':
    msg_encoding = part.get_content_charset()
    msg_text = part.get_payload().decode('quoted-printable')
msg_text = smart_unicode(msg_text, encoding=msg_encoding, strings_only=False, errors='strict') 

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

См. RFC 2047 для полного описания формата интернационализированных заголовков электронной почты. Основной формат "=?" charset "?" encoding "?" encoded-text "?=". Итак, в вашем случае у вас есть строка UTF-8 в кодировке base-64.

Вы можете использовать функции email.header.decode_header и str.decode для его декодирования и получения правильной строки Unicode:

>>> import email.header
>>> x = email.header.decode_header('=?utf-8?b?WW91IGdvdCBhIGxldHRlciBmcm9tIERhxJdyaXVzIMSZxJfEr8SZxJfEr8SZ?=')
>>> x
[('You got a letter from Da\xc4\x97rius \xc4\x99\xc4\x97\xc4\xaf\xc4\x99\xc4\x97\xc4\xaf\xc4\x99', 'utf-8')]
>>> x[0][0].decode(x[0][1])
u'You got a letter from Da\u0117rius \u0119\u0117\u012f\u0119\u0117\u012f\u0119'
3 голосов
/ 17 марта 2011

Вы должны посмотреть на модуль email.header в стандартной библиотеке Python. В частности, в конце документации есть функция decode_header(), которую вы можете использовать для выполнения большей части тяжелой работы за вас.

0 голосов
/ 17 марта 2011

строка темы - utf8, но вы читаете ее как ASCII, вам безопаснее всего читать все как utf8, поскольку ASCII фактически является только подмножеством utf8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...