Перечисление и фильтрация почтовых папок с помощью управляемого API EWS


Я пытаюсь перечислить только папки электронной почты из учетной записи Exchange с помощью Microsoft.Обмен.Веб-сервисы управляются API и кодом, основанным на этом примере FindFolder () .

Следующий код фильтрует все пустые папки и Task, Search, Contacts и Calendar папки, но все равно возвращает FreeBusy Data , Recoverable Items и папка Deletions.

Есть ли способ, которым я могу отфильтровать их из папок, возвращенных, кроме как по совпадению строк на их имени? И в самом деле, способ фильтровать Sent Items и Deleted 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
1 2

1 ответ:

Я бы предложил вам начать поиск с MsgFolderRoot, а не с Root, что означает, что вы не получите папки Non_IPM, такие как recoverable Items, FreeBusy Data folder и т. д. Вы также можете использовать папку поиска и ограничить возвращаемую папку теми, у которых есть класс папок IPF.Примечание eg

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

Но это может исключить некоторые папки, где класс папок не был установлен или которые используют подкласс, как IPF.Примечание.Microsoft.Разговор. Так что фильтрация все еще может быть лучшим вариантом если вам нужно обработать эти папки.