Microsoft Graph API - Powershell - 检索 Excel 文件附件
Microsoft Graph API - Powershell - Retrieve Excel file attachment
我使用 Microsoft Graph API 来检索邮件中的附件。
我使用此端点来检索附件
https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/
$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 中尝试附件内容的端点并保存响应(图片:PostMan save response)。保存的文件是正确的。
可能是我最后一个用于保存内容的 PowerShell 命令不太好,但我不知道如何解决这个问题。
请帮帮我!
通过@glen-scales 的回答,我为我的用例找到了一个很好的 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 ($attachment in $attachments) {
[System.IO.File]::WriteAllBytes("$($attachmentsTempDestination)$($attachment.name)",[System.Convert]::FromBase64String($attachment.contentBytes))
}
附件内容是 base64 编码的字符串,因此您使用 set-content 的方式只是将该 base64 内容写入无效的文件。
您需要先将其转换为字节数组,然后您应该能够执行类似
的操作
Set-Content -Path "$($attachmentsTempDestination)$($attachment.name)" -Value [System.Convert]::FromBase64String($content) -Encoding Byte
否则你也可以使用(这可能比设置内容更快)
[System.IO.File]::WriteAllBytes("$($attachmentsTempDestination)$($attachment.name)",[System.Convert]::FromBase64String($content))
我使用 Microsoft Graph API 来检索邮件中的附件。
我使用此端点来检索附件 https://graph.microsoft.com/v1.0/users/{mailbox.mail}/messages/{message.id}/attachments/
$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 中尝试附件内容的端点并保存响应(图片:PostMan save response)。保存的文件是正确的。
可能是我最后一个用于保存内容的 PowerShell 命令不太好,但我不知道如何解决这个问题。
请帮帮我!
通过@glen-scales 的回答,我为我的用例找到了一个很好的 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 ($attachment in $attachments) {
[System.IO.File]::WriteAllBytes("$($attachmentsTempDestination)$($attachment.name)",[System.Convert]::FromBase64String($attachment.contentBytes))
}
附件内容是 base64 编码的字符串,因此您使用 set-content 的方式只是将该 base64 内容写入无效的文件。
您需要先将其转换为字节数组,然后您应该能够执行类似
的操作Set-Content -Path "$($attachmentsTempDestination)$($attachment.name)" -Value [System.Convert]::FromBase64String($content) -Encoding Byte
否则你也可以使用(这可能比设置内容更快)
[System.IO.File]::WriteAllBytes("$($attachmentsTempDestination)$($attachment.name)",[System.Convert]::FromBase64String($content))