我可以使用以下 VB 代码打开 Outlook .pst 文件
Dim olApp As Application = New Application()
Dim oNS As [NameSpace] = olApp.GetNamespace("mapi")
Dim sStore As String = "[path to .pst file]"
oNS.Session.AddStore(sStore)
' do something - read messages, whatever
'oNS.Session.RemoveStore(sStore)
olApp.Close
olApp.Dispose
注意:sStore 是存档 .pst 文件的路径,不在 Outlook 本身中打开。
这有效...但是,在运行它之前我关闭了 Outlook(通常在我的 PC 上运行)。然后,运行此代码后,重新打开 Outlook 时,我看到 .pst 文件已添加/打开,并且可以在 Outlook 中查看。
我想要做的是在代码中关闭它,这样当我重新打开它时它就不会出现在 Outlook 中。我想象注释掉的行 'oNS.Session.RemoveStore(sStore) 会这样做,但事实并非如此 - 事实上 Visual Studio 的智能感知标记了一个潜在错误,告诉我RemoveStore 的预期参数是 Outlook 文件夹,而不是字符串。 (对于 AddStore 它只是一个对象)。对我来说似乎很奇怪(我很无知)-为什么它是一个文件夹?不管怎样,感谢任何有关删除整个“商店”的线索。
(我在这里使用了 VB 代码,但使用 C# 没问题)
澄清一下:我的 Outlook 有一个 .PST 文件(用于我的 IMAP/POP3 帐户)和两个 Exchange 帐户。使用我正在使用的代码,我想暂时打开另一个 .PST 文件。
按照下面迪米特里的评论,我尝试了该行
oNS.Session.RemoveStore(CType(olApp.Session.Stores(olApp.Session.Stores.Count - 1).GetRootFolder(), Folder))
Dimitri 建议的无法完成,因为 sStore 只是一个字符串,所以我尝试使用最后添加的 olApp.Session“store”的根文件夹。
这产生了意想不到的结果,甚至不一致的结果。 (有一次我的默认 .pst 文件被删除了!)所以我尝试记录,只是为了看看
Dim r As Integer
Dim sb As New StringBuilder
For r = 0 To olApp.Session.Stores.Count - 1
sb.AppendLine(olApp.Session.Stores(r).FilePath)
Next
并且在不同的运行中,我得到以不同顺序列出的路径!而且,由于某种原因,我刚刚添加的商店的文件路径甚至没有列出,除了添加了一个空行。 ??
所以...我想我需要的是一种方法来知道迭代循环中的“r”对应于我想要删除的.pst 文件。也许只是寻找一个空白的文件路径,但这看起来相当粗糙并且容易产生意想不到的后果 - 必须有一个正确的方法来做到这一点。
你的循环是错误的 - 所有 OOM 集合都是基于 1 的,而不是 0。它一定是
Dim r As Integer
Dim sb As New StringBuilder
For r = 1 To olApp.Session.Stores.Count
sb.AppendLine(olApp.Session.Stores(r).FilePath)
Next