2024-09-30 22:10:31 发布
网友
我目前使用this solution通过python使用Gmail API从Gmail下载附件。 但是,每次附件超过25MB时,附件都会自动上载到Google Drive,文件会在邮件中链接。在这种情况下,消息中没有attachmentId。 我只能在消息文件的“snippet”部分看到文件名
有没有办法从邮件中下载谷歌潜水附件
在here上发布了一个类似的问题,但还没有提供解决方案
所指的“附件”实际上只是一个指向驱动器文件的链接,所以令人困惑的是,它根本不是附件,而只是文本或HTML
这里的问题是,由于它本身不是一个附件,您将无法通过GMail API自己获取它。您需要使用驱动器API
要使用驱动器API,您需要获取文件ID,该ID将位于HTML内容部分以及其他部分中
HTML
您可以使用re模块对HTML内容执行findall,我使用以下正则表达式模式识别驱动器链接:
re
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文件
token.pickle
如何下载驱动器“附件”
所指的“附件”实际上只是一个指向驱动器文件的链接,所以令人困惑的是,它根本不是附件,而只是文本或HTML
这里的问题是,由于它本身不是一个附件,您将无法通过GMail API自己获取它。您需要使用驱动器API
要使用驱动器API,您需要获取文件ID,该ID将位于
HTML
内容部分以及其他部分中您可以使用
re
模块对HTML内容执行findall
,我使用以下正则表达式模式识别驱动器链接:下面是一个获取文件ID的示例python函数。它将返回一个列表
一旦有了ID,就需要调用驱动器API
您可以遵循docs中的示例:
请记住,由于您现在将使用驱动器API和GMail API,因此您需要更改项目中的作用域。还记得在开发者控制台中激活驱动器API,更新OAuth同意屏幕、凭据并删除本地
token.pickle
文件参考文献
相关问题 更多 >
编程相关推荐