如何利用Graph API清除邮件的MultiValueExtendedProperty?
问题
已通过谷歌、Stack Overflow等渠道大量搜索,但仍未找到使用Graph API更新邮件以移除MultiValueExtendedProperty的方法。此前使用EWS时,对象具备RemoveExtendedProperty函数,而在Graph API中,我无法找到删除、清除或移除MultiValueExtendedProperty的方式。由于EWS登录系统发生变更,必须切换至Graph API,请问如何实现该需求?
示例代码片段
var gmc = new GraphMailClient(auth); var account = "someemailaccount@yourdomain.com"; var idval = "somemessageidyoucanlookupandedit"; var start = await gmc.Users[account].Messages[idval].Request().GetAsync(); start.MultiValueExtendedProperties = new MessageMultiValueExtendedPropertiesCollectionPage() { new MultiValueLegacyExtendedProperty() { Id = "StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1", Value = new string[] { "test" } }, new MultiValueLegacyExtendedProperty() { Id = "StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2", Value = new string[] { DateTime.Now.AddMinutes(3).ToString() } } }; var saveDraftId = await gmc.SaveDraftAsync(account, start); var entry = await gmc.Users[account].Messages[idval].Request().Expand("multiValueExtendedProperties($filter = id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1' or id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2'), attachments").GetAsync(); entry.MultiValueExtendedProperties.RemoveAt(0); entry.MultiValueExtendedProperties.Clear(); var result = await gmc.Users[account].Messages[idval].Request().Expand("multiValueExtendedProperties($filter = id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1' or id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2'), attachments").UpdateAsync(entry); var entryAgain = await gmc.Users[account].Messages[idval].Request().Expand("multiValueExtendedProperties($filter = id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1' or id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2'), attachments").GetAsync(); if(entryAgain.MultiValueExtendedProperties.Any()) Console.WriteLine("Failed");
解决方案
Graph API中没有直接的"移除"扩展属性方法,但可以通过将目标MultiValueExtendedProperty的Value设置为空数组来实现清除效果,具体操作如下:
使用Graph SDK实现
不需要调用Clear()或RemoveAt(),而是重新构建MultiValueExtendedProperties集合,将需要删除的属性的Value设为空数组,然后执行更新:
var entry = await gmc.Users[account].Messages[idval].Request() .Expand("multiValueExtendedProperties($filter = id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1' or id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2')") .GetAsync(); // 构建要更新的属性集合,将需要清除的属性Value设为空数组 entry.MultiValueExtendedProperties = new MessageMultiValueExtendedPropertiesCollectionPage() { new MultiValueLegacyExtendedProperty() { Id = "StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1", Value = Array.Empty<string>() // 空数组清除该属性 }, new MultiValueLegacyExtendedProperty() { Id = "StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2", Value = Array.Empty<string>() } }; // 执行更新 var result = await gmc.Users[account].Messages[idval].Request().UpdateAsync(entry); // 验证结果 var entryAgain = await gmc.Users[account].Messages[idval].Request() .Expand("multiValueExtendedProperties($filter = id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE1' or id eq 'StringArray {66f5a359-4659-4830-9070-00049ec6ac6e} Name MVE2')") .GetAsync(); if(!entryAgain.MultiValueExtendedProperties.Any(p => p.Value.Any())) Console.WriteLine("Success");
核心原理
Graph API的PATCH更新遵循部分更新逻辑,当你指定某个MultiValueExtendedProperty的Value为空数组时,服务端会将该属性的现有值清空,达到类似EWS中RemoveExtendedProperty的效果。若需要完全删除属性条目,只需在请求中包含目标属性ID且Value设为空数组即可。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

