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

PowerShell调用Microsoft Graph API获取邮件Excel附件保存异常解决

使用Microsoft Graph API获取邮件附件时文件损坏的解决方案

问题场景

我正在使用Microsoft Graph API获取邮件中的附件,操作流程如下:

  • 第一步调用以下端点获取附件列表:
    https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/
    对应PowerShell实现代码:
$callAPI = @{
  Headers = @{
      Authorization = "Bearer $token"
  }
  Uri = "https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/"
  Method = "GET"
}

$attachments = (Invoke-RestMethod @callAPI).value;
  • 第二步通过foreach循环调用如下端点获取单个附件的内容:
    https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/{attachment.id}/$value
    对应代码:
$callAPI = @{
   Headers = @{
     Authorization = "Bearer $token"
   }
   Uri = "https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/{attachment.id}/$value"
   Method = "GET"
}

$content = Invoke-RestMethod @callAPI;
  • 第三步使用如下命令保存文件:
Set-Content -Path "$($attachmentsTempDestination)\$($attachment.name)" -Value $content

执行后得到的文件损坏,无法被Excel识别,但在Postman中调用相同的附件内容端点直接保存响应得到的文件正常,判断是PowerShell文件保存命令存在问题。

修复方案

整理后的适配该场景的可用PowerShell代码如下,无需额外调用单个附件内容端点,直接解析附件列表返回的base64编码内容即可:

$callAPI = @{
    Headers = @{
        Authorization = "Bearer $token"
    }
    Uri = "https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/"
    Method = "GET"
}

$attachments = (Invoke-RestMethod @callAPI).value;

foreach ($attachment in $attachments) {     
    [System.IO.File]::WriteAllBytes("$($attachmentsTempDestination)\$($attachment.name)",[System.Convert]::FromBase64String($attachment.contentBytes)) 
}

修复说明

原代码的问题出在Set-Content默认会将内容按文本编码处理,而Excel等二进制文件需要直接写入字节流。新代码直接将接口返回的base64格式附件内容转换为字节数组,再通过WriteAllBytes方法写入文件,避免了编码转换导致的文件损坏,同时省略了单独请求附件内容的步骤,提升了执行效率。

内容的提问来源于stack exchange,提问作者Théo Fleury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:54:02