如何通过Outlook对象模型找到“人物联系人”文件夹?

时间:2010-05-24 21:10:16

标签: vb.net office-2007 outlook-object-model

我有一些代码可以通过迭代Application.Session.Stores集合找到用户有权访问的所有联系人文件夹。

这适用于用户的联系人以及所有公共联系人文件夹。它还会找到用户通过工具添加的其他邮箱帐户中的所有联系人文件夹 - >帐户设置...菜单命令。

但是,这要求用户可以完全访问其他人的帐户。当用户只能访问其他人的联系人时,该人的联系人将显示在“联系人”视图中的“人员联系人”组下。如何找到未在Session.Stores下显示的联系人文件夹?

要查看其他用户的联系人文件夹而不添加对其完整邮箱的访问权限,请单击文件 - >打开 - >其他用户的文件夹...从Outlook菜单中。在对话框中,输入其他用户的名称,然后从“文件夹类型”下拉列表中选择Contacts

这是代码(减去错误检查和日志记录)我用来查找所有用户的Outlook联系人文件夹的列表。我知道这可以(也许应该)使用早期绑定到Outlook.Application类型来完成,但这不会影响结果。 EnumerateFolders是递归的,因此它会搜索所有子文件夹。

Dim folderList = New Dictionary(Of String, String)
Dim outlookApp = CreateObject(Class:="Outlook.Application")
For Each store As Object In outlookApp.Session.Stores
    EnumerateFolders(folderList, store.GetRootFolder)
Next

Private Sub EnumerateFolders(ByRef folderList As Dictionary(Of String, String), ByVal folder As Object)
    Try
        If folder.DefaultItemType = 2 Then
            folderList.Add(folder.EntryID, folder.FolderPath.Substring(2))
        End If

        For Each subFolder As Object In folder.Folders
            EnumerateFolders(folderList, subFolder)
        Next
    Catch ex As Exception

    End Try
End Sub

1 个答案:

答案 0 :(得分:2)

由于我在这里没有得到任何答案,(实际上获得了这个的Tumbleweed徽章)我在msdn论坛上问了这个问题。

http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/9edb0bdf-a7cb-451b-b1b4-99c6ec1f8214/

以下是答案:

  

在Outlook 2007或更高版本中,浏览导航窗格。有关概述,请参阅http://msdn.microsoft.com/en-us/library/bb206757.aspxhttp://msdn.microsoft.com/en-us/library/bb176429.aspx处的示例显示了如何迭代Calendar模块中的所有导航组。每个NavigationFolder都有一个Folder对象属性,该属性从其他用户的邮箱(或其他商店)返回实际的Folder。

     

这将为您提供用户正在使用的所有文件夹。如果您想要理论上可以访问的所有文件夹,您可以迭代GAL中的条目,并为每个文件夹尝试执行Namespace.GetSharedDefaultFolder。如果无法返回该文件夹,则该用户无权访问。

现在我已经看到了这一点,我想我将使用ContactsModule查找所有联系人文件夹,而不是搜索商店中所有文件夹中的联系人文件夹。应该快得多。