使用 Outlook Interop 提取 Inbox/Folder 个名称
Using Outlook Interop To Pull Inbox/Folder Names
我正在编写一个应用程序,可以从 Outlook (Exchange) 收件箱(文件夹)中读取电子邮件,然后自动将电子邮件导出到单独的数据库中以供进一步处理。
第一个合乎逻辑的步骤是将收件箱和相关文件夹列出到两个组合框中,以便用户可以 select 适当的收件箱和文件夹。为了填充此信息,我使用了 Microsoft.Office.Interop.Outlook namespace
。我已经编写了以下代码来提取 inboxes/folders 的列表,它在我的开发机器上完美运行(我只有几个收件箱链接到我的域名)但在收件箱比收件箱多的其他人的机器上不能正常工作我愿意:
Dim outlookApplication As New Outlook.Application
Dim mapiNameSpace As Outlook.NameSpace = outlookApplication.GetNamespace("MAPI")
For Each item In mapiNameSpace.Folders
Dim listOfFolders As New List(Of String)
For Each subfolder In item.Folders 'EXCEPTION OCCURS HERE
listOfFolders.Add(subfolder.folderpath.ToString.Replace("\", String.Empty).Replace(item.FolderPath.ToString.Replace("\", String.Empty), String.Empty))
Next subfolder
subFolderDictionary.Add(item.FolderPath.ToString.Replace("\", String.Empty), listOfFolders)
Catch ex As Exception
MsgBox("COULD NOT GET FOLDER INFO: " & ex.ToString)
End Try
Next item
我在上面的评论中指出了我的异常发生的位置(在命名空间 MAPI 文件夹的 For..Each 循环上。我附上了异常的图片:尝试的操作失败。找不到对象.需要说明的是,我们都是运行个包含相同应用程序版本的通用映像。创建outlook应用程序对象或outlook命名空间没有错误。错误似乎是在我去循环Outlook命名空间MAPI时发生的文件夹。
这里的另一个问题是我的收件箱数量与该用户不同。这个用户没有安装 visual studio,所以在他的机器上调试似乎是不可能的。我不太确定我应该怎么做才能解决这个问题,因为我没有遇到他所看到的问题。根本改变他的配置是不可能的。对这个问题有什么想法或以前的经验吗?您如何开始在无法可靠调试的机器上调试问题?
为什么不使用 Namespace.Stores 集合(Outlook 2010 及更高版本)并使用 Store.GetDefaultFolder(olFolderInbox)?
UPDATE:要仅处理收件箱,请使用如下内容
for each vStore in mapiNameSpace.Stores
folder = vStore.GetDefaultFolder(olFolderInbox)
...
next
对于遇到此问题的任何其他人,在彻底研究并将变量输出到文本文件中来回工作后,用户已将收件箱添加到他们的电子邮件帐户中,但他们没有被 exchange 授权访问。这是导致 "The attempted operation failed. An object could not be found" 的原因,因为用户无法从 outlook 访问收件箱。
我正在编写一个应用程序,可以从 Outlook (Exchange) 收件箱(文件夹)中读取电子邮件,然后自动将电子邮件导出到单独的数据库中以供进一步处理。
第一个合乎逻辑的步骤是将收件箱和相关文件夹列出到两个组合框中,以便用户可以 select 适当的收件箱和文件夹。为了填充此信息,我使用了 Microsoft.Office.Interop.Outlook namespace
。我已经编写了以下代码来提取 inboxes/folders 的列表,它在我的开发机器上完美运行(我只有几个收件箱链接到我的域名)但在收件箱比收件箱多的其他人的机器上不能正常工作我愿意:
Dim outlookApplication As New Outlook.Application
Dim mapiNameSpace As Outlook.NameSpace = outlookApplication.GetNamespace("MAPI")
For Each item In mapiNameSpace.Folders
Dim listOfFolders As New List(Of String)
For Each subfolder In item.Folders 'EXCEPTION OCCURS HERE
listOfFolders.Add(subfolder.folderpath.ToString.Replace("\", String.Empty).Replace(item.FolderPath.ToString.Replace("\", String.Empty), String.Empty))
Next subfolder
subFolderDictionary.Add(item.FolderPath.ToString.Replace("\", String.Empty), listOfFolders)
Catch ex As Exception
MsgBox("COULD NOT GET FOLDER INFO: " & ex.ToString)
End Try
Next item
我在上面的评论中指出了我的异常发生的位置(在命名空间 MAPI 文件夹的 For..Each 循环上。我附上了异常的图片:尝试的操作失败。找不到对象.需要说明的是,我们都是运行个包含相同应用程序版本的通用映像。创建outlook应用程序对象或outlook命名空间没有错误。错误似乎是在我去循环Outlook命名空间MAPI时发生的文件夹。
这里的另一个问题是我的收件箱数量与该用户不同。这个用户没有安装 visual studio,所以在他的机器上调试似乎是不可能的。我不太确定我应该怎么做才能解决这个问题,因为我没有遇到他所看到的问题。根本改变他的配置是不可能的。对这个问题有什么想法或以前的经验吗?您如何开始在无法可靠调试的机器上调试问题?
为什么不使用 Namespace.Stores 集合(Outlook 2010 及更高版本)并使用 Store.GetDefaultFolder(olFolderInbox)?
UPDATE:要仅处理收件箱,请使用如下内容
for each vStore in mapiNameSpace.Stores
folder = vStore.GetDefaultFolder(olFolderInbox)
...
next
对于遇到此问题的任何其他人,在彻底研究并将变量输出到文本文件中来回工作后,用户已将收件箱添加到他们的电子邮件帐户中,但他们没有被 exchange 授权访问。这是导致 "The attempted operation failed. An object could not be found" 的原因,因为用户无法从 outlook 访问收件箱。