使用python中的Gmail API下载电子邮件的google drive附件

2024-09-30 22:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前使用this solution通过python使用Gmail API从Gmail下载附件。 但是,每次附件超过25MB时,附件都会自动上载到Google Drive,文件会在邮件中链接。在这种情况下,消息中没有attachmentId。 我只能在消息文件的“snippet”部分看到文件名

有没有办法从邮件中下载谷歌潜水附件

here上发布了一个类似的问题,但还没有提供解决方案


Tags: 文件api消息附件链接文件名google邮件
1条回答
网友
1楼 · 发布于 2024-09-30 22:10:31

如何下载驱动器“附件”

所指的“附件”实际上只是一个指向驱动器文件的链接,所以令人困惑的是,它根本不是附件,而只是文本或HTML

这里的问题是,由于它本身不是一个附件,您将无法通过GMail API自己获取它。您需要使用驱动器API

要使用驱动器API,您需要获取文件ID,该ID将位于HTML内容部分以及其他部分中

您可以使用re模块对HTML内容执行findall,我使用以下正则表达式模式识别驱动器链接:

(?<=https:\/\/drive\.google\.com\/file\/d\/).+(?=\/view\?usp=drive_web)

下面是一个获取文件ID的示例python函数。它将返回一个列表

def get_file_ids(service, user_id, msg_id):
    message = service.users().messages().get(userId=user_id, id=msg_id).execute()
    for part in message['payload']['parts']:
        if part["mimeType"] == "text/html":
            b64 = part["body"]["data"].encode('UTF-8')
            unencoded_data = str(base64.urlsafe_b64decode(b64))
            results = re.findall(
                '(?<=https:\/\/drive\.google\.com\/file\/d\/).+(?=\/view\?usp=drive_web)',
                unencoded_data
            )
            return results

一旦有了ID,就需要调用驱动器API

您可以遵循docs中的示例:

file_ids = get_file_ids(service, "me", "[YOUR_MSG_ID]"

for id in file_ids:
    request = service.files().get_media(fileId=id)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print "Download %d%%." % int(status.progress() * 100)

请记住,由于您现在将使用驱动器API和GMail API,因此您需要更改项目中的作用域。还记得在开发者控制台中激活驱动器API,更新OAuth同意屏幕、凭据并删除本地token.pickle文件

参考文献

相关问题 更多 >