python - 解析传入 Google App Engine 的邮件中的 unicode 附件名称

标签 python google-app-engine

我有一个应用程序引擎应用程序,可以接收带有附件的传入邮件。我检查附件文件名以确保扩展名正确。如果文件名中包含元音变音或重音字符,则编码会使我的方法无法读取文件名,因此我不知道如何检查文件类型。

例如,如果我发送名为 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-Dispositionfilename="..." 参数中使用编码字完全不正确> 在附件中。 RFC2047 明确规定编码字不能出现在引用的参数中。非 ASCII 参数值应该使用 RFC2231 的规则进行传输,这看起来完全不同(而且非常复杂)。

因此,根据邮件标准,您应该将此文件名视为字面意思“=?ISO-8859-1?B?WnVtQnL8Y2tlbndpc ...”。我相信是 MS Exchange 产生了这些废话。尝试将这种处理保持在最低限度(例如,仅在字符串包含在 =?...?= 中时进行解码,这对于文件名来说是不太可能的。

关于python - 解析传入 Google App Engine 的邮件中的 unicode 附件名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3721528/

相关文章:

python - 装饰器的问题

python - groupby 内迭代排序

java - jpa IllegalArgumentException异常

java - 我们无法使用 Google App Engine 启动 AppRTC 应用程序

python - 如何获取通过 BlobstoreUploadHandler 上传的文件的 FileInfo/gcs file_name?

python - python中具有截止值的高斯滤波图像

python - PILKit 无法导入 Python 图像库

python - wxPython:在现有 wx.Panel 上覆盖 wx.Panel 的好方法

java - Firebase 服务器 sdk 是否适用于 Google Appengine Java

java.lang.NoClassDefFoundError : com/google/common/base/MoreObjects when initializing pubsub on appengine 错误