如何通过PowerShell调用O365 API读取邮件并筛选指定主题?
解析Graph API邮件响应并筛选指定邮件的方法
首先先修正你现有代码里的拼写/语法错误,这些错误会导致脚本运行失败:
cliendid→ClientId(MSAL参数名区分大小写)tenantid→TenantIdclientsecret行语法错误,正确写法是用ConvertTo-SecureString将明文密钥转为安全字符串accestoken→AccessToken(属性名拼写错误)responce→response(变量名拼写)ConectType→ContentTypeAutorization→Authorization(请求头拼写错误)
修正后的基础代码:
$connectionString = @{ ClientId = "你的客户端ID" TenantId = "你的租户ID" ClientSecret = "你的客户端密钥" | ConvertTo-SecureString -AsPlainText -Force } $token = Get-MsalToken @connectionString $accessToken = $token.AccessToken $mailUser = "目标邮箱地址" $graphApiUri = "https://graph.microsoft.com/v1.0/users/$mailUser/mailfolders/Inbox/messages" # 请求邮件数据,指定获取主题、正文、发件人等必要字段(减少返回数据量) $response = Invoke-RestMethod -Method Get -Uri $graphApiUri -ContentType "application/json" -Headers @{Authorization=("Bearer {0}" -f $accessToken)}
筛选指定主题和内容的邮件
Invoke-RestMethod会自动将JSON响应转为PowerShell对象,你可以直接通过属性访问邮件数据,用Where-Object进行筛选:
示例:筛选主题包含「审批通知」且正文包含「报销申请」的邮件
# 定义筛选条件 $targetSubjectKeyword = "审批通知" $targetContentKeyword = "报销申请" # 从响应的value数组中筛选符合条件的邮件 $filteredMails = $response.value | Where-Object { $_.subject -match $targetSubjectKeyword -and $_.body.content -match $targetContentKeyword }
说明:
$response.value是Graph API返回的邮件列表数组-match是模糊匹配(支持正则),如果需要精确匹配,用-eq$_.subject是邮件主题属性,$_.body.content是邮件正文内容(注意正文可能是HTML格式,若要筛选纯文本,可先判断$_.body.contentType后再处理)
打印筛选结果日志
直接遍历筛选后的邮件,输出关键信息即可:
# 打印日志 if ($filteredMails.Count -gt 0) { Write-Host "找到符合条件的邮件 $($filteredMails.Count) 封:" -ForegroundColor Green foreach ($mail in $filteredMails) { Write-Host "================================" Write-Host "主题:$($mail.subject)" Write-Host "发件人:$($mail.sender.emailAddress.name) <$($mail.sender.emailAddress.address)>" Write-Host "接收时间:$($mail.receivedDateTime)" Write-Host "正文摘要:$($mail.body.content | Select-String -Pattern '[\w\s]{1,100}' -AllMatches | Select-Object -First 1 -ExpandProperty Matches | Select-Object -ExpandProperty Value)..." } } else { Write-Host "未找到符合条件的邮件" -ForegroundColor Yellow }
说明:
- 正文摘要用正则截取前100字符,避免输出过长的HTML内容
- 用
Write-Host配合颜色区分日志级别,方便查看
内容的提问来源于stack exchange,提问作者Alex FLEX
相关产品推荐
相关产品推荐

