2016-09-16 85 views
1

我想枚举电子邮件只有文件夹从Exchange帐户使用Microsoft.Exchange.WebServices Managed API和代码基于this FindFolder() example使用EWS托管API Enumberate和筛选邮件文件夹

下面的代码过滤所有空文件夹,并TaskSearchContactsCalendar文件夹,但仍返回FreeBusy DataRecoverable ItemsDeletions文件夹。

有没有一种方法可以从返回的文件夹中过滤这些文件,而不是通过字符串匹配对其名称进行过滤?而事实上,一种过滤Sent ItemsDeleted Items的方法呢? (虽然这些不能被重命名(我已经对他们是什么更好的想法),我会简单地左右这些筛选出来的名字那么担心!)

Dim moreFoldersToReturn As Boolean = True 
Const FOLDER_PAGE_SIZE As Integer = 10 
Dim folderOffset As Integer = 0 

While moreFoldersToReturn 

    ' Create a view with a page size of x 
    Dim view As New FolderView(FOLDER_PAGE_SIZE, folderOffset) 

    ' Identify the properties to return in the results set. 
    view.PropertySet = New PropertySet(BasePropertySet.IdOnly) 
    view.PropertySet.Add(FolderSchema.DisplayName) 

    ' Create an extended property definition for the PidTagAttributeHidden property. 
    Dim isHiddenProp As ExtendedPropertyDefinition = New ExtendedPropertyDefinition(&H10F4, MapiPropertyType.Boolean) 

    Dim searchFiltersCollection As List(Of SearchFilter) = New List(Of SearchFilter) 
    searchFiltersCollection.Add(New SearchFilter.IsEqualTo(isHiddenProp, False)) 'filter hidden folders 
    searchFiltersCollection.Add(New SearchFilter.IsGreaterThan(FolderSchema.TotalCount, 0)) 'filter empty folders 

    Dim searchFilterToUse As SearchFilter = New SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFiltersCollection.ToArray()) 

    ' Unlike FindItem searches, folder searches can be deep traversals. 
    view.Traversal = FolderTraversal.Deep 

    ' Send the request to search the mailbox and get the results. 
    Dim results As FindFoldersResults = Me.exchangeServer.connection.FindFolders(WellKnownFolderName.Root, searchFilterToUse, view) 


    ' Process each item. 
    Dim folder As Folder 
    For Each folder In results.Folders 

     If Not TypeOf folder Is SearchFolder AndAlso 
      Not TypeOf folder Is ContactsFolder AndAlso 
      Not TypeOf folder Is TasksFolder AndAlso 
      Not TypeOf folder Is CalendarFolder Then 

      Debug.WriteLine("Folder: " & folder.DisplayName) 
      foldersToReturn.Add(folder) 

     End If 

    Next 

    folderOffset += FOLDER_PAGE_SIZE 


    moreFoldersToReturn = results.MoreAvailable 

End While 

提供了以下的输出:

Folder: Freebusy Data 
Folder: Recoverable Items 
Folder: Deletions 
Folder: Deleted Items 
Folder: Inbox 
Folder: Sent Items 
Folder: TestEmailFolder 

回答

2

我建议你从MsgFolderRoot开始搜索而不是根目录,这意味着你将无法获得Non_IPM文件夹一样可恢复项目,FreeBusy Data文件夹等返回。你也可以使用一个搜索文件夹,并限制该文件夹被返回给那些有IPF.Note的FolderClass如

SearchFilter sfFolder = new SearchFilter.IsEqualTo(FolderSchema.FolderClass,"IPF.Note"); 
FindFoldersResults ffResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, sfFolder, new FolderView(1000)); 

但是,这可以排除在没有文件夹类已设置了一些文件夹或使用像一个子类IPF.Note.Microsoft.Conversation。因此,如果您需要处理这些文件夹,Filtering可能仍然是最佳选择。

相关问题