【问题标题】:Download attachment from Gmail in python: no "data" key在 python 中从 Gmail 下载附件:没有“数据”键
【发布时间】:2019-03-16 13:08:44
【问题描述】:

我正在使用 Google 官方教程连接到 gmail 地址并使用 Gmail API 从电子邮件下载附件。

给出的示例代码如下:

try:
    message = service.users().messages().get(userId=user_id, id=msg_id).execute()

    for part in message['payload']['parts']:
      if part['filename']:
        file_data = base64.urlsafe_b64decode(part['body']['data']
                                             .encode('UTF-8'))

        path = ''.join([store_dir, part['filename']])

        f = open(path, 'w')
        f.write(file_data)
        f.close()   

except errors.HttpError, error:
        print 'An error occurred: %s' % error

我系统地得到一个KeyError: 'data'。

当我打印“部分”对象时,我得到了这个。我检查了所有电子邮件是否包含附件,并且我看到“body”键有“attachmentId”和“size”字段,但没有“data”字段。

{'partId': '1',
 'mimeType': 'application/x-zip-compressed',
 'filename': 'Statement.zip',
 'headers': [{'name': 'Content-Type', 'value': 'application/x-zip-compressed; name="Statement.zip"'},
             {'name': 'Content-Description', 'value': 'Statement.zip'},
             {'name': 'Content-Disposition', 'value': 'attachment; filename="Statement.zip"; size=317; creation-date="Fri, 05 Oct 2018 11:00:24 GMT"; modification-date="Fri, 05 Oct 2018 11:00:24 GMT"'},
             {'name': 'Content-Transfer-Encoding', 'value': 'base64'}],
 'body': {'attachmentId': 'ANGjdJ8Jsk95qxfAezayex3yDktM9hnMSwsy_LD4aqu3h2lhum36MT7pG9aqyWpX7VmNoxZISLAFfKyBy0gGgL5WyL5f7zrH4bRd_MBsHtGxXBfN6XBCg_qHkRu0ZVRaOtuYTCc8_aN4NMsaApGI19KJlfgVXV3w67gEspZ61OKZZwbt386wbA-_6GrAcQCGIgk4dFGxc_Zp5EjqIbsA557KOjEFoO0A9urMXIQvQXF0GRdhfHb287ZfhjKYGVpukhVxT6wDNjL47Ifc7VmG_kcgeUxpfKEGO6tmVw2PzuG4RlAdX5S7yjgGlEHGVmPgnTl-rjT7asZnia68cBg_5ATSJ9FS64OKcr79s8MQD-DL0omXLJjfw5-qIOUKM4x56btte572j5SO7afAYrsv',
          'size': 317}}

所以我得到的内容与 Google 官方文档的内容不同。我错过了什么吗?如何下载附件?

【问题讨论】:

    标签: python gmail-api google-api-python-client


    【解决方案1】:

    在你的第七行,你使用part['body']['data']。但是,在您打印的部分中,'body' 没有 'data' 键。它只有'attachmentId''size'

    【讨论】:

    • 是的。那是我的问题。文档使用了data字段,我没有看到那个字段,怎么下载附件呢?
    • 我不是 100% 确定,但它可以是 service.users().messages().attachment().get(userId, messageId, attId).execute() 吗?
    • @DanDeg 嘿,你是怎么想到这个解决方案的?
    【解决方案2】:

    找到另一种有效的语法:

      try:
        message = service.users().messages().get(userId=user_id, id=msg_id).execute()
    
        for part in message['payload']['parts']:
          if part['filename']:        
            attachment = service.users().messages().attachments().get(userId='me', messageId=message['id'], id=part['body']['attachmentId']).execute()
            file_data = base64.urlsafe_b64decode(attachment['data'].encode('UTF-8'))
    
            path = ''.join([store_dir, part['filename']])
    
            f = open(path, 'wb')
            f.write(file_data)
            f.close()
    
      except errors.HttpError as error:
        print(f'An error occurred: {error}')
    

    【讨论】:

    • 好东西。文档仍未更新。
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2014-11-08
    • 2022-08-24
    • 2018-11-03
    • 2016-11-23
    • 1970-01-01
    • 2013-03-13
    • 2016-03-02
    相关资源
    最近更新 更多