Обратите внимание, что оба Content-Transfer-Encoding
имеют base64
Не имеет значения в этом случае, Content-Transfer-Encoding
применяется только к полезной нагрузке тела, а не к заголовкам.
=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
Это RFC2047 кодированный атом заголовка. Функция stdlib для декодирования это email.header.decode_header
. Однако для интерпретации результатов этой функции все еще требуется небольшая постобработка:
import email.header
x= '=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?='
try:
name= u''.join([
unicode(b, e or 'ascii') for b, e in email.header.decode_header(x)
])
except email.Errors.HeaderParseError:
pass # leave name as it was
Однако ...
Content-Type: application/vnd.ms-excel;
name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
Это просто неправильно. Какой почтовик его создал? Кодирование RFC2047 может происходить только в атомах, а строка в кавычках не является атомом. RFC2047 §5 прямо отрицает это:
- Кодированное слово НЕ ДОЛЖНО появляться внутри строки в кавычках.
Допустимый способ кодировать заголовки параметров при наличии длинных строк или символов Unicode - RFC2231 , что представляет собой совершенно новый пакет ошибок. Но вы должны использовать стандартную библиотеку для анализа почты, которая справится с этим за вас.
Итак, вы можете обнаружить '=?'
в параметрах имени файла, если хотите, и попытаться декодировать его через RFC2047. Тем не менее, строго говоря, правильная вещь, это взять почтовик на слово и действительно вызвать файл =?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=
!