我有一个应用程序引擎应用程序,可以接收带有附件的传入邮件。我检查附件文件名以确保扩展名正确。如果文件名中包含元音变音或重音字符,则编码会使我的方法无法读取文件名,因此我不知道如何检查文件类型。
例如,如果我发送名为 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?=
最佳答案
这是一个 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'
但是,在 Content-Disposition
的 filename="..."
参数中使用编码字完全不正确> 在附件中。 RFC2047 明确规定编码字不能出现在引用的参数中。非 ASCII 参数值应该使用 RFC2231 的规则进行传输,这看起来完全不同(而且非常复杂)。
因此,根据邮件标准,您应该将此文件名视为字面意思“=?ISO-8859-1?B?WnVtQnL8Y2tlbndpc ...”。我相信是 MS Exchange 产生了这些废话。尝试将这种处理保持在最低限度(例如,仅在字符串包含在 =?...?=
中时进行解码,这对于文件名来说是不太可能的。
关于python - 解析传入 Google App Engine 的邮件中的 unicode 附件名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721528/