Анализ имен вложений Юникода на входящей почте в Google App Engine - PullRequest
1 голос
/ 16 сентября 2010

У меня есть приложение, которое получает входящую почту с вложениями.Я проверяю имя файла вложения, чтобы убедиться в правильности расширения.Если в имени файла есть символы или акцентированные символы, кодировка делает имя файла нечитаемым для моих методов, поэтому я не знаю, как проверить тип файла.

Например, если я отправлю файл с именем ZumBrückenwirtÜberGrünwaldZurück(2) .gpx

А затем распечатайте имя вложения следующим образом:

 attachments = [message.attachments]        
 attachmenttype = attachments[0][0][-4:].lower()  
 logging.error("attachment name %s, %s" % (attachments[0][0], attachmenttype))

Я получу:

имя вложения =? ISO-8859-1? B? WnVtQnL8Y2tlbndpcnTcYmVyR3L8bndhbGRadXL8Y2soMikuZ3B4? =, B4? =

1 Ответ

2 голосов
/ 16 сентября 2010

Это кодированное слово RFC2047.Вы можете частично декодировать его с помощью пакета email, хотя впоследствии его все равно нужно соединить:

import email.header
def parseHeader(h):
    return ''.join(s.decode(c or 'us-ascii') for s, c in email.header.decode_header(h))

>>> parseHeader('=?ISO-8859-1?B?WnVtQnL8Y2tlbndpcnTcYmVyR3L8bndhbGRadXL8Y2soMikuZ3B4?=')
u'ZumBr\xfcckenwirt\xdcberGr\xfcnwaldZur\xfcck(2).gpx'

Однако, совершенно неправильно использовать закодированное слово вfilename="..." параметр для Content-Disposition во вложении.RFC2047 прямо заявляет, что закодированное слово не может появляться в кавычках.Предполагается, что значения не-ASCII-параметров должны передаваться с использованием правил RFC2231, которые выглядят совершенно по-разному (и очень сложными).

Таким образом, согласно почтовому стандарту, вы должны трактовать это имя файла как буквально «=?ISO-8859-1? B? WnVtQnL8Y2tlbndpc ...».Я верю, что MS Exchange порождает эту чушь.Постарайтесь свести эту обработку к минимуму (например, путем декодирования, только когда строка обернута в =?...?=, что маловероятно для имени файла.

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