Ted*_*Ted 2 exchange-server exchangewebservices
我正在尝试使用Microsoft.Exchange.WebServices 托管 API和基于此 FindFolder() 示例的代码来枚举 Exchange 帐户中的仅电子邮件文件夹。
以下代码过滤所有空文件夹、 、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
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
Folder: Freebusy Data
Folder: Recoverable Items
Folder: Deletions
Folder: Deleted Items
Folder: Inbox
Folder: Sent Items
Folder: TestEmailFolder
Run Code Online (Sandbox Code Playgroud)
我建议您从 MsgFolderRoot 而不是 Root 开始搜索,这意味着您不会返回非 IPM 文件夹,例如可恢复项目、FreeBusy 数据文件夹等。您还可以使用搜索文件夹并将返回的文件夹限制为文件夹类别为 IPF 的文件夹。注意,例如
SearchFilter sfFolder = new SearchFilter.IsEqualTo(FolderSchema.FolderClass,"IPF.Note");
FindFoldersResults ffResults = service.FindFolders(WellKnownFolderName.MsgFolderRoot, sfFolder, new FolderView(1000));
Run Code Online (Sandbox Code Playgroud)
但这可能会排除某些未设置文件夹类或使用 IPF.Note.Microsoft.Conversation 等子类的文件夹。因此,如果您需要处理这些文件夹,过滤可能仍然是最佳选择。
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |