我正在编写一个C#应用程序,通过一些监控邮箱,清除超过指定期限(例如6个月)的电子邮件。
以前我要获取这些项,然后在foreach
块中依次删除每个项。在寻找另一个问题的解决方案时,我无意中使用了DeleteItems
。这需要System.Collection.Generic.IEnumerable
,但在下面的代码中,FindItems
返回System.Collection.ObjectModel.Collection
。
如何转换或获取传递给DeleteItems的正确类型?
ExtendedPropertyDefinition allFoldersType = new ExtendedPropertyDefinition(13825, MapiPropertyType.Integer);
FolderId rootFolderId = new FolderId(WellKnownFolderName.Root);
FolderView folderView = new FolderView(1000);
folderView.Traversal = FolderTraversal.Deep;
SearchFilter.SearchFilterCollection searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And);
searchFilterCollection.Add(new SearchFilter.IsEqualTo(allFoldersType, "2"));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "allitems"));
FindFoldersResults findFoldersResults = exchangeService.FindFolders(rootFolderId, searchFilterCollection, folderView);
Folder allItemsFolder = findFoldersResults.Folders[0];
searchFilterCollection = new SearchFilter.SearchFilterCollection(LogicalOperator.And);
searchFilterCollection.Add(new SearchFilter.IsLessThanOrEqualTo(ItemSchema.DateTimeReceived, DateTime.Now.AddMonths(-6)));
searchFilterCollection.Add(new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "IPM.Note"));
var findItems = allItemsFolder.FindItems(searchFilterCollection, new ItemView(100));
var items = findItems.Items;
exchangeService.DeleteItems(findItems, DeleteMode.HardDelete, SendCancellationsMode.SendToNone, AffectedTaskOccurrence.SpecifiedOccurrenceOnly);
每个项目
都有ItemId
类型的ID
属性,可以使用LINQ:
var findItems = allItemsFolder.FindItems(searchFilterCollection, new ItemView(100));
var itemIds = findItems.Items.Select(item => item.Id);
exchangeService.DeleteItems(itemIds, DeleteMode.HardDelete, SendCancellationsMode.SendToNone, AffectedTaskOccurrence.SpecifiedOccurrenceOnly);
项目文档:Microsoft.Exchange.WebServices.Data.Item
项目Id文档:Microsoft_Exchange_WebServices_Data_Item_Id