使用 VBA 访问 Outlook 中的文件夹

Posted

技术标签:

【中文标题】使用 VBA 访问 Outlook 中的文件夹【英文标题】:Accessing folders in Outlook with VBA 【发布时间】:2012-09-27 14:49:08 【问题描述】:

我正在使用以下内容将邮件移动到 Outlook 中的文件夹。

Dim chemin() as String

chemin = Split(path, "/")
Set myNameSpace = Application.GetNamespace("MAPI")
Set myFolder = myNameSpace.Folders("LiveLink").Folders("Livelink HQE").Folders("Entreprise").Folders(chemin(1)).Folders(chemin(2)).Folders(chemin(3))

myEntryID = myFolder.EntryID
myEntryID = myFolder.StoreID

objMail.Move myNameSpace.GetFolderFromID(myEntryID, storeID)    

一切正常。如您所见,该文件夹位于 Livelink 中。而且Livelink服务器实际上响应很慢,我对此无能为力。

我担心使用 .Folders() 这么多次,而像 .Folders("Livelink/root/folder1/folder2/") 这样的操作会快很多。但这显然不起作用,并且因为 .Folders 命令每次都需要 ping Livelink 服务器,实际上执行这行代码需要整整 10 秒(文件夹越深,到达的时间越长它)。

有没有其他方法可以直接访问 Outlook 中的特定文件夹来移动邮件?我知道每个文件夹(甚至 Livelink 中的文件夹)都有某种 Outlook ID,但我看不到任何使用它的方法。我已经尝试了以下方法,但它还没有工作:

Dim folder As MAPIFolder
Dim myNameSpace As Outlook.NameSpace
Set myNameSpace = Application.GetNamespace("MAPI")
Set folder = myNameSpace.GetFolderFromID(target, Application.GetNamespace("MAPI").Folders("LiveLink").storeID)

这在执行 GetFolderfromID() 时给我一个错误。 var target 实际上是我要将邮件复制到的文件夹的 EntryID。

【问题讨论】:

可能目标实际上并不持有 EntryID,即使您认为它应该持有。 EntryID 可以更改。这是我在回答中提供的最后一个链接的引述:重要的是要注意,每当在文件夹中创建项目时,都会为其分配一个新的 EntryID。这意味着如果项目被移动到不同的文件夹或项目被导出然后导入(甚至到同一个文件夹),EntryID 字段会发生变化。 msdn.microsoft.com/en-us/library/office/ff868618.aspx 我刚刚注意到我有 LivelinkID 而不是 OutlookID (EntryID),这不一样。我已尝试使用有效的 EntryID(使用 OutlookSpy)并且 Set folder 可以工作,但现在执行 objMail.move folder 时出现错误无法移动元素 好吧,它现在可以工作了,由于某种原因我没有足够的权限在目标文件夹上写入,现在可以了。嗯,非常感谢,我想我可以自己解决它,但有时当我们陷入困境时,我们仍然需要有人向我们展示显而易见的 ;-) 【参考方案1】:

根据官方文档,没有比您正在做的更好的方法了,除非您需要多次查找该文件夹。

MSDN 建议的一个选项是obtain the folder object from the folder path,但这基本上与您已经在做的事情相同。

问题在于Folder Object 仅表示“在文件夹树的一层的特定子集中表示所有可用的 Outlook 文件夹。”(强调)

一种可能的解决方法是使用NameSpace.GetFolderFromID,但为此您需要知道EntryID,可能还有StoreID,这通常意味着您必须先找到该文件夹​​。但您可以保存 EntryIDStoreID 以供将来立即调用。

如果您想深入了解EntryIds 和StoreIDs 的使用,请参阅Working with EntryIDs and StoreIDs 上的开发人员参考。

【讨论】:

非常感谢您的回答。我现在觉得有点愚蠢,因为我确实知道 EntryID,而且据我所知,StoreID 总是相同的。这些文件夹实际上是在另一个脚本中创建的。我会看看它,我的问题可能会解决。 刚刚用我一直在尝试的内容更新了我的原始帖子,它还没有工作。

以上是关于使用 VBA 访问 Outlook 中的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBA 识别 MS Outlook 中的日历条目?

使用 Access VBA 从 Outlook 获取附件

使用 VBA Excel 浏览文件夹以在 Outlook 邮件中附加文件 [重复]

使用 VBA 禁用 Outlook 安全设置

Outlook VBA 错误地回复文件夹中的电子邮件

VBA 使用多标准从 Outlook 下载电子邮件附件