【问题标题】:Enumberate and Filter Mail Folders using EWS Managed API使用 EWS 托管 API 枚举和筛选邮件文件夹
【发布时间】:2016-09-16 10:34:34
【问题描述】:

我正在尝试使用Microsoft.Exchange.WebServices Managed API 和基于this FindFolder() example 的代码从 Exchange 帐户枚举仅电子邮件文件夹。

以下代码过滤所有空文件夹,以及 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

【问题讨论】:

    标签: exchange-server exchangewebservices


    【解决方案1】:

    我建议您从 MsgFolderRoot 而不是 Root 开始搜索,这意味着您不会返回 Non_IPM 文件夹,如可恢复项目、FreeBusy Data 文件夹等。您还可以使用搜索文件夹并将返回的文件夹限制为具有 IPF 的 FolderClass 的文件夹。注意例如

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

    但这可能会排除一些未设置文件夹类或使用 IPF.Note.Microsoft.Conversation 等子类的文件夹。因此,如果您需要处理这些文件夹,过滤可能仍然是最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2011-08-04
      • 2016-11-23
      • 2020-03-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多