我有一个应用引擎应用,可以接收带有附件的传入邮件。我检查附件文件名以确保扩展名是正确的。如果文件名中包含变音符号或重音符号,则编码会使文件名对我的方法不可读,所以我不知道如何检查文件类型。
例如,如果我发送一个名为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?=
答案 0 :(得分:2)
这是一个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产生这种废话。尝试将此处理降至最低(例如,仅在字符串包含在=?...?=
时才进行解码,这对文件名来说是不太可能的。