Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2016 22:47:50

Master_Sergius
Зарегистрирован: 2013-09-12
Сообщения: 271
Репутация: +  7  -
Профиль   Отправить e-mail  

Декодирование многострочного заголовка письма. Python 2.7

В 2.7 это баг - http://stackoverflow.com/questions/20816766/python-email-header-decode-header-fails-for-multiline-headers

Решение так и не найдено. Есть ли возможность какими-то другими путями решить данную проблему? Нужно именно для 2.7.



———————————————————————————
Мой блог о семействе *nix: http://nixtravelling.blogspot.com/

Отредактировано Master_Sergius (Дек. 22, 2016 22:48:40)

Офлайн

#2 Дек. 23, 2016 07:31:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Декодирование многострочного заголовка письма. Python 2.7

Чистый email.header.decode_header() без каких-то действий неприменим. В диком мире заголовки бывают неправильно закодированы, бывают оборванными на середине. В любом случае нужна своя функция, которая раскодирует заголовок, в том числе и с помощью email.header.decode_header(). А вот эти MIME-части хорошо можно отличить от остального содержимого с помощью регулярок и просто их отдельно раскодировать и вставить результат обратно, будто их и не было изначально. Но даже в этом случае там не так всё просто, потому что бывают левые кодировки, а бывает, что и кодировка не определяется. Я писал функцию в своей проге. Пока тестами не обложил её вдоль и поперёк, всё время где-то вылазила ошибка при раскодировании (приходило какое-нибудь новое письмо - и до свидания, программа выпадала). Запутанная функция получилась.

    def _decode_header(self, header):
# дано : заголовок и кодировка сообщения
# получить: ответ = раскодированный заголовок
# (если раскодирование невозможно,
# ответ = первоначальный заголовок)
res = ''
defenc = 'latin1'
for i in email.header.decode_header(header):
t, e = i
if e:
if e != 'unknown-8bit':
s = t.decode(e)
else:
s = t.decode(self._charset or defenc)
else:
if isinstance(t, str):
s = t
elif re.search(br'\\u[\da-f]{4}', t):
s = t.decode('unicode_escape')
else:
s = t.decode(defenc)
res += s
return res

И это третий питон, как ты говоришь, у которого всё в порядке с этой функцией.



Отредактировано py.user.next (Дек. 23, 2016 07:34:00)

Офлайн

#3 Дек. 27, 2016 08:46:23

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2580
Репутация: +  59  -
Профиль   Отправить e-mail  

Декодирование многострочного заголовка письма. Python 2.7

посмотрите исходники либы
https://github.com/martinrusev/imbox



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version