Программного обеспечения:
- Microsoft Windows 10 Home, версия 1803 (сборка 17134.523)
- Microsoft Office профессиональный плюс 2016
- Microsoft Outlook 2016, версия 1812 (сборка 11126.20266)
Настройка Outlook (почтовые адреса анонимны):
- Outlook подключен к почтовым ящикам «Master@provider1.net», «Business@provider2.net», «Private@provider2.net» и к архиву "Архив".
- Почтовые ящики используют IMAP/SMTP. Связанные OST-файлы доступны локально. Архив представляет собой локальный файл PST-данных.
- Почтовый ящик «Master@provider1.net» был первым, который был подключен к Outlook, затем почтовые ящики «Private@provider2.net» и «Business@provider2.net» и, наконец, архив "Архив".
- Панель навигации Outlook отображает почтовые ящики и архив в последовательности «Master@provider1.net», "Архив", «Business@provider2.net», Private@provider2.net, то есть изначально подключенный почтовый ящик вверху, затем архив и другие почтовые ящики в алфавитном порядке.
- Почтовый ящик «Master@provider1.net» настроен как "стандартный почтовый ящик" в настройках почтового ящика Outlook.
Тестовое задание: отобразить все элементы, содержащиеся в соответствующем почтовом ящике или архиве, в папке поиска с именем «TEST», созданной с использованием VBA.
Код VBA:
Sub CreateSearchFolders_TEST()
Dim MyFolder As Folder
Dim MyScope As String
Dim MySearch As Search
For Each MyFolder In Application.GetNamespace("MAPI").Folders
Debug.Print MyFolder.Name
Next
Set MyFolder = Application.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks).Parent
MyScope = "'" & MyFolder.FolderPath & "'"
'MyScope = "'\\Master@provider1.net'"
'MyScope = "'\\Business@provider2.net'"
'MyScope = "'\\Private@provider2.net'"
'MyScope = "'\\Archive'"
'MyScope = "'\\Archive\Input','\\Archive\Sent'"
Set MySearch = Application.AdvancedSearch _
(Scope:=MyScope, Filter:="", SearchSubFolders:=True, Tag:="MySearchFolder")
MySearch.Save ("TEST")
End Sub
Выводы:
- Во-первых, цикл FOR перечисляет почтовые ящики «Business $ provider2.net», «Master@provider1.net», «Private@provider2.net» в алфавитном порядке и, наконец, "Архив".
- Приведенный выше VBA-код создает нужную папку поиска "TEST" в «Master@provider1.net», то есть, как и ожидалось.
Код также работает, если строка
MyScope = "'" & MyFolder.FolderPath & "'"
закомментировано и строка
'MyScope = "'\\Master@provider1.net'"
активируется вместо
Однако, если одна строка из строк
'MyScope = "'\\Business@provider2.net'" 'MyScope = "'\\Private@provider2.net'" 'MyScope = "'\\Archive'"
вместо этого активируется, выполнение останавливается на линии
MySearch.Save ("TEST")
со следующим сообщением об ошибке:
Ошибка времени выполнения -2147221241 (80040107)': не удалось выполнить процедуру. Объект не найден.
Если линия
'MyScope = "'\\Archive\Input','\\Archive\Sent'"
вместо этого активируется, код работает, но просто возвращает содержимое подпапок "Input" и "Sent" - как и ожидалось.
- Если в этой строке заменить "Архив", например, на «Частный $ provider2.net», код также работает с этим почтовым ящиком, но, как ожидается, выдает содержимое только указанных подпапок "Вход" и "Отправлено".
Очевидно, что существует разница между отдельными почтовыми ящиками, а также между почтовыми ящиками и архивами. Один почтовый ящик является привилегированным. Предварительное объявление других почтовых ящиков как «стандартного почтового ящика» в настройках почтового ящика outlook не меняет результат выполнения кода.
Где я могу найти документацию об этой разнице?
В чем причина этой разницы?
Что нужно изменить в коде, чтобы он работал со всеми почтовыми ящиками и архивами?
Простое использование MyScope, предоставляющее все папки, содержащиеся в почтовом ящике или архиве, не решает проблему. Папка поиска, созданная таким образом, выдаст неполные результаты или даже потерпит неудачу при добавлении, удалении или переименовании папок в дальнейшем.