Доступ к папкам в Outlook с помощью VBA

Я использую следующее, чтобы переместить почту в папку в 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 необходимо каждый раз пинговать сервер Livelink, на самом деле выполнение этой строки кода занимает целых 10 секунд (и чем глубже папка, тем дольше она достигает Это).

Есть ли другой способ прямого доступа к определенной папке в Outlook для перемещения почты? Я знаю, что для каждой папки (даже в Livelink) есть какой-то идентификатор Outlook, но я не вижу способа его использовать. Я пробовал следующее, но пока не работает:

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(). Переменная target на самом деле является EntryID папки, в которую я хочу скопировать почту.


person dan    schedule 27.09.2012    source источник
comment
Вполне возможно, что target на самом деле не содержит EntryID, даже если вы думаете, что должен. EntryID может измениться. Вот цитата из последней ссылки, которую я предоставил в своем ответе: важно отметить, что всякий раз, когда элемент создается в папке, ему назначается новый EntryID. Это означает, что поле EntryID изменяется, если элемент перемещается в другую папку или если элемент экспортируется, а затем импортируется (даже в ту же папку). msdn.microsoft.com/en-us/library/office/ff868618. aspx   -  person Daniel    schedule 27.09.2012
comment
Я только что заметил, что у меня был LivelinkID, а не OutlookID (EntryID), что не одно и то же. Я пробовал с действительным EntryID (используя OutlookSpy), и Set folder работает, но я получаю сообщение об ошибке Невозможно переместить элемент при выполнении objMail.move folder сейчас.   -  person dan    schedule 27.09.2012
comment
Ладно, теперь просто работает, по какой-то причине у меня не хватило прав на запись в папку назначения, теперь все в порядке. Что ж, большое спасибо, я мог бы решить это сам, я думаю, но иногда, когда мы застряли, нам все еще нужен кто-то, чтобы показать нам очевидное ;-)   -  person dan    schedule 27.09.2012


Ответы (1)


Основываясь на официальной документации, нет лучшего способа, чем то, что вы делаете, если только вам не нужно будет искать папку несколько раз.

Вариант, предложенный MSDN, заключается в том, чтобы получить объект папки из пути к папке, но в основном это делает то же самое, что вы уже делаете.

Проблема в том, что Folder Object означает только «представление всех доступных папок Outlook в определенном подмножестве на одном уровне дерева папок». (выделение добавлено)

Возможный обходной путь — использовать NameSpace.GetFolderFromID, но для этого вам нужно знать EntryID и, возможно, StoreID, что обычно означает, что вам все равно сначала нужно найти папку. Но вы можете сохранить EntryID и StoreID для немедленного вызова в будущем.

Если вы хотите углубиться в использование EntryIds и StoreIDs, вот ссылка для разработчиков на Working с EntryID и StoreID.

person Daniel    schedule 27.09.2012
comment
Большое спасибо за ваш ответ. Я чувствую себя немного глупо прямо сейчас, потому что я действительно знаю EntryID и, насколько мне известно, StoreID всегда один и тот же. Папки на самом деле создаются в другом скрипте. Я посмотрю на это, и моя проблема может быть решена. - person dan; 27.09.2012
comment
Только что обновил свой исходный пост тем, что я пробовал, он еще не работает. - person dan; 27.09.2012