使用Microsoft Graph API获取用户隔离邮件异常问题求助
问题分析与解决方案
你遇到的问题根源在于错误使用了Outlook Mail API的路径——Exchange Online的隔离邮件(由EOP/Defender for Office 365管控)并不存储在用户邮箱的quarantine文件夹中,你调用的/users/{userEmail}/mailFolders/quarantine/childFolders/Inbox/messages路径不存在,Graph API会默认回退到用户的主收件箱,所以返回了全部邮件。
正确实现方式:使用Graph Security API
隔离邮件属于安全管控范畴,需要通过Microsoft Graph的Security模块的quarantineMessages接口获取,而非Outlook Mail API。
修正后的代码示例
public static async Task<List<string>> GetQuarantineEmailsForUser(string userEmail) { try { var accessToken = await GetAccessToken(); var graphApiUrl = "https://graph.microsoft.com/v1.0/"; // 使用Security模块的隔离邮件接口,按收件人邮箱筛选 var quarantinedEmailsUrl = $"{graphApiUrl}security/quarantineMessages?$filter=recipientEmailAddress eq '{userEmail}'"; // 可选:添加时间范围过滤(使用UTC时间格式) var today = DateTime.UtcNow.AddHours(-24); var todayIso8601 = today.ToString("yyyy-MM-ddTHH:mm:ssZ"); quarantinedEmailsUrl += $"&$filter=receivedDateTime ge {todayIso8601}"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var response = await client.GetAsync(quarantinedEmailsUrl); if (response.IsSuccessStatusCode) { var responseContent = await response.Content.ReadAsStringAsync(); // 需定义对应QuarantineMessageListResponse类适配返回结构 var quarantineMessages = Newtonsoft.Json.JsonConvert.DeserializeObject<QuarantineMessageListResponse>(responseContent); List<string> emailSubjects = new List<string>(); foreach (var msg in quarantineMessages.value) { emailSubjects.Add(msg.subject); } return emailSubjects; } else { throw new Exception($"请求失败,状态码: {response.StatusCode}"); } } } catch (Exception ex) { throw ex; } }
关键注意事项
- 权限要求:需为应用或委派账号分配
Security.Read.All或Security.ReadWrite.All权限,委派账号需具备全局管理员、安全管理员等角色。 - 过滤规则:使用
recipientEmailAddress字段筛选指定用户的隔离邮件,时间过滤必须使用UTC标准格式。 - 实体适配:
quarantineMessages返回的字段结构与普通邮件不同,需定义包含subject、recipientEmailAddress、receivedDateTime等字段的实体类用于反序列化。
内容的提问来源于stack exchange,提问作者Kristo
相关产品推荐
相关产品推荐

