我正在尝试使用 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 删除“已删除邮件”文件夹中的所有项目(包括非邮件项目)? 如果这不能直接实现,那么以编程方式实现此目的的最佳方法是什么?
备注: 我知道这个文件夹无法删除(杰出文件夹无法删除),我只想清空这个文件夹
请注意,您可以使用 Graph API 仅删除“已删除邮件”文件夹中的电子邮件。目前,不支持。
通过 Microsoft Graph API 检索或删除非邮件项目,例如日历事件、任务、联系人等。要获取“已删除邮件”文件夹中存在的所有电子邮件,您可以运行以下 API 调用:
GET https://graph.microsoft.com/v1.0/me/mailFolders/deleteditems/messages?$count=true
回复:
在我的例子中,我运行了下面的 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}");
}
}
}
回复:
为了确认这一点,我在用户的 Outlook“已删除邮件”文件夹中检查了相同的内容,该文件夹为空,如下所示: