如何使用 Microsoft Graph API 清空“已删除邮件”文件夹(包括非邮件项目)?

问题描述 投票:0回答:1

我正在尝试使用 Microsoft Graph API 清空用户邮箱中的“已删除邮件”文件夹。然而,我遇到了一些挑战:

我尝试使用 permanentDelete 端点:

POST https://graph.microsoft.com/beta/me/mailFolders/{folderId}/permanentDelete

但它返回以下错误:

{
    "error": {
        "code": "ErrorDeleteDistinguishedFolder",
        "message": "Distinguished folders cannot be deleted."
    }
}

这表示“已删除邮件”等系统文件夹无法直接删除。

我想清空“已删除邮件”文件夹的原因是它包含非邮件项目(例如,日历事件、任务、联系人等),这些项目不是由 /messages 端点返回的:

GET https://graph.microsoft.com/v1.0/me/mailFolders/{folderId}/messages

这些非邮件项目仍然会影响文件夹的totalItemCount,而且我还没有找到使用 API 删除它们的方法。

我尝试过的: 使用 /messages 端点一封一封或批量删除电子邮件,该方法可以工作,但只能处理邮件项目。 调查此文件夹的非邮件项目(例如 /events 或 /contacts)是否有单独的端点,但似乎没有直接方法在“已删除项目”下访问它们。

我的问题: 有没有办法使用 Microsoft Graph API 删除“已删除邮件”文件夹中的所有项目(包括非邮件项目)? 如果这不能直接实现,那么以编程方式实现此目的的最佳方法是什么?

备注: 我知道这个文件夹无法删除(杰出文件夹无法删除),我只想清空这个文件夹

azure microsoft-graph-api
1个回答
0
投票

请注意,您可以使用 Graph API 删除“已删除邮件”文件夹中的电子邮件。目前,不支持

通过 Microsoft Graph API 检索或删除非邮件项目,例如日历事件、任务、联系人等。

要获取“已删除邮件”文件夹中存在的所有电子邮件,您可以运行以下 API 调用:

GET https://graph.microsoft.com/v1.0/me/mailFolders/deleteditems/messages?$count=true

回复:

enter image description here

在我的例子中,我运行了下面的 C# 代码,该代码使用交互式流与 Microsoft Graph 连接,以编程方式删除“已删除邮件”文件夹中存在的电子邮件:

using Azure.Identity;
using Microsoft.Graph;
using Microsoft.Graph.Models.ODataErrors;

class Program
{
    static async Task Main(string[] args)
    {
        var tenantId = "tenantId";
        var clientId = "appId";
        var scopes = new[] { "https://graph.microsoft.com/Mail.ReadWrite" };

        var interactiveCredential = new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions
        {
            TenantId = tenantId,
            ClientId = clientId,
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
            RedirectUri = new Uri("http://localhost")
        });

        var graphClient = new GraphServiceClient(interactiveCredential, scopes);

        try
        {
            var messageIds = await GetDeletedItemsMessages(graphClient);

            if (messageIds.Count > 0)
            {
                await DeleteMessages(graphClient, messageIds);
                Console.WriteLine("All messages deleted from Deleted Items.");
            }
            else
            {
                Console.WriteLine("No messages found in Deleted Items.");
            }
        }
        catch (ODataError odataError)
        {
            Console.WriteLine($"Error Code: {odataError.Error?.Code}");
            Console.WriteLine($"Error Message: {odataError.Error?.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Exception: {ex.Message}");
        }
    }

    private static async Task<List<string>> GetDeletedItemsMessages(GraphServiceClient client)
    {
        var messageIds = new List<string>();
        var messages = await client.Me.MailFolders["deleteditems"].Messages.GetAsync();

        while (messages != null && messages.Value?.Count > 0)
        {
            foreach (var message in messages.Value)
            {
                messageIds.Add(message.Id);
            }

            if (messages.OdataNextLink != null)
            {
                messages = await client.Me.MailFolders["deleteditems"].Messages
                    .WithUrl(messages.OdataNextLink)
                    .GetAsync();
            }
            else
            {
                break;
            }
        }

        Console.WriteLine($"Found {messageIds.Count} messages in Deleted Items.");
        return messageIds;
    }

    private static async Task DeleteMessages(GraphServiceClient client, List<string> messageIds)
    {
        foreach (var messageId in messageIds)
        {
            await client.Me.Messages[messageId].DeleteAsync();
            Console.WriteLine($"Deleted message {messageId}");
        }
    }
}

回复:

enter image description here

为了确认这一点,我在用户的 Outlook“已删除邮件”文件夹中检查了相同的内容,该文件夹为空,如下所示:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.