使用 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
,这通常意味着您必须先找到该文件夹。但您可以保存 EntryID
和 StoreID
以供将来立即调用。
如果您想深入了解EntryId
s 和StoreID
s 的使用,请参阅Working with EntryIDs and StoreIDs 上的开发人员参考。
【讨论】:
非常感谢您的回答。我现在觉得有点愚蠢,因为我确实知道 EntryID,而且据我所知,StoreID 总是相同的。这些文件夹实际上是在另一个脚本中创建的。我会看看它,我的问题可能会解决。 刚刚用我一直在尝试的内容更新了我的原始帖子,它还没有工作。以上是关于使用 VBA 访问 Outlook 中的文件夹的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 VBA 识别 MS Outlook 中的日历条目?