使用 EWS Managed API 枚举和过滤邮件文件夹
Enumberate and Filter Mail Folders using EWS Managed API
我正在尝试使用 Microsoft.Exchange.WebServices Managed API and code based on this FindFolder() example.
从 Exchange 帐户中枚举 仅限电子邮件 文件夹
以下代码过滤所有空文件夹,以及 Task
、Search
、Contacts
和 Calendar
文件夹,但仍然 returns 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
我建议您从 MsgFolderRoot 而不是 Root 开始搜索,这意味着您不会返回 Non_IPM 文件夹,如可恢复项目、FreeBusy Data 文件夹等。您还可以使用搜索文件夹并将返回的文件夹限制为文件夹 Class 为 IPF.Note 的文件夹,例如
SearchFilter sfFolder = new SearchFilter.IsEqualTo(FolderSchema.FolderClass,"IPF.Note");
FindFoldersResults ffResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, sfFolder, new FolderView(1000));
但这可能会排除一些未设置文件夹 Class 或使用 IPF.Note.Microsoft.Conversation 等子Class 的文件夹。因此,如果您需要处理这些文件夹,过滤可能仍然是最佳选择。
我正在尝试使用 Microsoft.Exchange.WebServices Managed API and code based on this FindFolder() example.
从 Exchange 帐户中枚举 仅限电子邮件 文件夹以下代码过滤所有空文件夹,以及 Task
、Search
、Contacts
和 Calendar
文件夹,但仍然 returns 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
我建议您从 MsgFolderRoot 而不是 Root 开始搜索,这意味着您不会返回 Non_IPM 文件夹,如可恢复项目、FreeBusy Data 文件夹等。您还可以使用搜索文件夹并将返回的文件夹限制为文件夹 Class 为 IPF.Note 的文件夹,例如
SearchFilter sfFolder = new SearchFilter.IsEqualTo(FolderSchema.FolderClass,"IPF.Note");
FindFoldersResults ffResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, sfFolder, new FolderView(1000));
但这可能会排除一些未设置文件夹 Class 或使用 IPF.Note.Microsoft.Conversation 等子Class 的文件夹。因此,如果您需要处理这些文件夹,过滤可能仍然是最佳选择。