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
相关产品推荐
相关产品推荐

