Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取邮箱中的所有电子邮件_C#_Exchangewebservices - Fatal编程技术网

C# 获取邮箱中的所有电子邮件

C# 获取邮箱中的所有电子邮件,c#,exchangewebservices,C#,Exchangewebservices,如何以最少的EWS呼叫量从Exchange 2010获取所有电子邮件 我们的邮箱有超过50k封电子邮件,其中包含2k个文件夹。我试着遍历每个文件夹,但这需要几个小时才能获取我所有的电子邮件。我目前的方法是从邮箱中获取所有文件夹,然后列出搜索过滤器,本质上过滤父文件夹id为n的所有项目 这是我到目前为止所拥有的 var allFolders = exchangeService.FindFolders(folderId,

如何以最少的EWS呼叫量从Exchange 2010获取所有电子邮件

我们的邮箱有超过50k封电子邮件,其中包含2k个文件夹。我试着遍历每个文件夹,但这需要几个小时才能获取我所有的电子邮件。我目前的方法是从邮箱中获取所有文件夹,然后列出搜索过滤器,本质上过滤父文件夹id为n的所有项目

这是我到目前为止所拥有的

var allFolders = exchangeService.FindFolders(folderId,
                                             new FolderView(int.MaxValue) {Traversal = FolderTraversal.Deep});
var searchFilterCollection = new List<SearchFilter>();

foreach(var folder in allFolders)
    searchFilterCollection.Add(new SearchFilter.SearchFilterCollection(LogicalOperator.Or, 
        new SearchFilter.IsEqualTo(ItemSchema.ParentFolderId, folder.Id.ToString())));

var itemView = new ItemView(int.MaxValue)
                   {
                       PropertySet = PropertySet.FirstClassProperties
                   };
var findItems = exchangeService.FindItems(folderId, 
    new SearchFilter.SearchFilterCollection(LogicalOperator.Or, searchFilterCollection), itemView);
var allFolders=exchangeService.FindFolders(folderId,
新的FolderView(int.MaxValue){Traversal=FolderTraversal.Deep});
var searchFilterCollection=新列表();
foreach(所有文件夹中的var文件夹)
searchFilterCollection.Add(新建SearchFilter.searchFilterCollection(LogicalOperator.Or、,
新的SearchFilter.IsEqualTo(ItemSchema.ParentFolderId,folder.Id.ToString());
var itemView=new itemView(int.MaxValue)
{
PropertySet=PropertySet.FirstClassProperties
};
var findItems=exchangeService.findItems(folderId,
新的SearchFilter.SearchFilterCollection(LogicalOperator.Or,SearchFilterCollection),itemView;
我收到的错误
该属性不能与此类型的限制一起使用。

这似乎意味着无法在筛选器中访问ParentFolderId,因为它尚未加载

您可以通过将其添加到FolderView来指示EWS加载它:

FolderView view = new FolderView(int.MaxValue) {Traversal = FolderTraversal.Deep};
view.PropertySet.Add(FolderSchema.ParentFolderId);
var allFolders = exchangeService.FindFolders(folderId,view);

如果直接使用EWS而不是EWS管理的API,则可以使用FindItemOperation来执行此操作。EWS FindItemOperation将多个ParentFolderId作为输入


作为在邮箱中搜索的替代方法,您可以使用AllItems文件夹,并使用MAPI属性“PR\u PARENT\u ENTRYID”执行搜索筛选


哪一行触发了错误?我使用的最后一行
FindItems()
查看我的问题和答案:这似乎是我需要的。一旦我有工作,我会向你汇报。
// use MAPI property from Items parent entry id
ExtendedPropertyDefinition MAPI_PARENT_ENTRYID = new ExtendedPropertyDefinition(0x0E09, MapiPropertyType.Binary);

// get the "AllItems" folder from its account
folderResult = service.FindFolders(WellKnownFolderName.Root, new SearchFilter.IsEqualTo(FolderSchema.DisplayName, "allitems"), folderView);
var allItemsFolder = folderResult.FirstOrDefault();

// convert EWS Folder Id to MAPI ENTRYID - parentFolderId is us an AlternateId
var convertedId = service.ConvertIds(parentFolderId, IdFormat.EntryId);

// use the MAPI Property with its converted PARENT_ENTRY_ID in EWS Searchfilters
var parent_entry_id = (ids.ConvertedId as AlternateId).UniqueId;
var searchFilterFolders = new SearchFilter.IsEqualTo(MAPI_PARENT_ENTRYID, parent_entry_id);

// search in "AllItems" using the searchFilter containing the converted PARENT_ENTRY_ID
result = service.FindItems(folderId, searchFilterFolders, view);