如何通过Python脚本调用Graph API实现邮件附件下载功能?
问题结论
完全可以通过Python脚本实现邮件附件下载需求,你当前无法获取内容是代码对接口返回值的处理逻辑错误,调整以下内容即可解决:
核心问题点
- 你调用的
https://graph.microsoft.com/v1.0/me/messages/{message-id}/attachments/{attachment-id}/$value接口返回的是附件的二进制流,不是JSON格式,你当前用json.dumps处理返回结果的逻辑完全错误,会直接丢失二进制内容。 - 请求二进制资源不需要设置
Content-Type: application/json请求头,这个头是告知服务端你发送的请求体是JSON格式,GET请求拿二进制资源时不需要该配置。 - 你封装的
msgraph_request如果默认做了JSON解析,需要针对二进制接口调整,直接返回原始响应对象即可。
修正后的代码示例
1. 新增附件下载方法
def download_attachment(mail_id, attachment_id, save_dir, file_name): requestHeaders = {'Authorization': 'Bearer ' + result["access_token"]} # 发起请求直接获取原始响应 response = msgraph_request(f"{graphURI}/v1.0/me/messages/{mail_id}/attachments/{attachment_id}/$value", requestHeaders) # 将二进制内容写入本地文件 with open(f"{save_dir}/{file_name}", "wb") as f: f.write(response.content)
2. 调整调用逻辑
try: data = json.loads(mails) values = data['value'] for mail in values: mail_id = mail['id'] mail_subj = mail['subject'] if mail['hasAttachments']: attachments = json.loads(o365.get_attachments(mail_id))['value'] for att in attachments: # 直接用附件接口返回的name字段作为文件名,自定义存储路径即可 download_attachment(mail_id, att["id"], "./你的存储文件夹路径", att["name"]) except Exception as e: print(e)
补充说明
如果需要下载大于4MB的大附件,需要改用分块下载逻辑,小于4MB的普通附件以上代码可直接正常下载。
内容的提问来源于stack exchange,提问作者lvb
相关产品推荐
相关产品推荐

