You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:06:01