HeaderParseError в python - PullRequest
       21

HeaderParseError в python

4 голосов
/ 04 июля 2011

Я получаю HeaderParseError, если я пытаюсь проанализировать эту строку с decode_header () в python 2.6.5 (и 2.7).Здесь repr () строки:

 '=?iso-8859-1?B?QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw==?='

Эта строка взята из электронного сообщения MIME, содержащего изображение в формате JPEG.Thunderbird может декодировать имя файла (которое содержит немецкие умлауты).

>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?B?QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw==?=')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/email/header.py", line 101, in decode_header
    raise HeaderParseError
email.errors.HeaderParseError

1 Ответ

1 голос
/ 25 июля 2011

Кажется несовместимость между набором символов Python для строк в кодировке base64 и почтовым агентом:

>>> from email.header import decode_header
>>> a='QW5tZWxkdW5nIE5ldHphbnNjaGx1c3MgU_xkcmluZzNwLmpwZw=='
>>> decode_header(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/email/header.py", line 108, in decode_header
    raise HeaderParseError
email.errors.HeaderParseError
>>> a1= a.replace('_', '/')
>>> decode_header(a1)
[('Anmeldung Netzanschluss S\xecdring3p.jpg', 'iso-8859-1')]
>>> print _[0][0].decode(_[0][1])
Anmeldung Netzanschluss Südring3p.jpg

Python использует набор символов, который предлагает статья * Википедии (т.е. 0-9, A-Z, a-z, +, /). В той же статье, некоторые альтернативы (в том числе подчеркивание, что проблема здесь) включены; однако значение подчеркивания является расплывчатым (это значение 62 или 63, в зависимости от альтернативы).

Я не знаю, что Python может сделать, чтобы угадать намерения почтовых агентов b0rken; поэтому я предлагаю вам сделать соответствующие предположения всякий раз, когда decode_header не удается.

Я называю «сломанным» почтовый агент, потому что нет необходимости экранировать либо +, либо / в заголовке сообщения: это не URL, так почему бы не использовать типичный набор символов?

...