Как получать электронные письма, найденные с помощью мгновенного поиска в Outlook, с помощью VBA? - PullRequest
0 голосов
/ 05 мая 2020

Я использую VBA для поиска электронных писем по содержимому их pdf-вложения.

Насколько я понял, единственный метод без открытия каждого электронного письма - это мгновенный поиск.

Я нахожу электронные письма, которые я ищу. Как мне работать с электронными письмами, которые отображаются в результате?

Я не нашел, как сохранить их в коллекцию или что-то в этом роде.

Мой код поиска:

Sub Search_Email()
Dim ol As Outlook.Application
Dim ns As Outlook.Namespace
Dim olFolder As Outlook.MAPIFolder
Dim strFilter, txtSearch As String

Set ol = New Outlook.Application
Set ns = ol.GetNamespace("MAPI")
Set olFolder = ns.Folders("RS Cash Application Inbox").Folders("Remittances")

Set ol.ActiveExplorer.CurrentFolder = olFolder

strFilter = "5860626494"

txtSearch = "attachment:" & strFilter

ol.ActiveExplorer.Search txtSearch, olSearchScopeCurrentFolder
End Sub

Результат мгновенного поиска. Мне нужно загрузить вложения из обоих отображаемых писем. Скриншот

1 Ответ

1 голос
/ 05 мая 2020

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

Вместо этого я бы предложил использовать метод AdvancedSearch класса Application, который обеспечивает обратный вызов для получения результатов после. Ключевые преимущества использования метода AdvancedSearch в Outlook:

  • Поиск выполняется в другом потоке. Вам не нужно запускать другой поток вручную, поскольку метод AdvancedSearch запускает его автоматически в фоновом режиме.
  • Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и c. в любом месте, т.е. за пределами определенной папки. Методы Restrict и Find / FindNext могут применяться к конкретной коллекции Items (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка DASL запросы (для поиска также можно использовать настраиваемые свойства). Подробнее об этом можно прочитать в статье Фильтрация в MSDN. Чтобы повысить производительность поиска, можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство IsInstantSearchEnabled класса Store).
  • Вы можете остановить процесс поиска в любой момент, используя Stop метод класса Search.

Чтобы получить результаты поиска, вам необходимо обработать событие AdvancedSearchComplete, которое используется для возврата объекта, созданного методом AdvancedSearch. Это событие срабатывает только при программном выполнении метода AdvancedSearch.

Public blnSearchComp As Boolean

Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
  MsgBox "The AdvancedSearchComplete Event fired."
  blnSearchComp = True
End Sub


Sub TestAdvancedSearchComplete()
  Dim sch As Outlook.Search
  Dim rsts As Outlook.Results
  Dim i As Integer
  blnSearchComp = False
  Const strF As String = "urn:schemas:mailheader:subject = 'Test'"
  Const strS As String = "Inbox"

  Set sch = Application.AdvancedSearch(strS, strF)

  While blnSearchComp = False
    DoEvents
  Wend

  Set rsts = sch.Results
  For i = 1 To rsts.Count
     MsgBox rsts.Item(i).SenderName
  Next
End Sub

После использования Search в пользовательском интерфейсе Outlook вы можете получить доступ к CurrentView, открыв соответствующие свойства в Explorer объект. Класс View предоставляет свойство Filter , которое возвращает строковое значение, представляющее фильтр для представления. Значением этого свойства является строка в синтаксисе поиска и обнаружения DAV (DASL), которая представляет текущий фильтр для представления. Таким образом, вы можете использовать его для строки поиска AdvancedSearch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...