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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:58:37