Я столкнулся с подобной ситуацией при попытке получить доступ к почте Outlook через VBA (в Excel).
Однако в моем случае это было намного медленнее: 1 E-mail в секунду ! (Возможно, это было медленнее в моем, чем в вашем случае из-за того, что я реализовал его на VBA).
Во всяком случае, мне удалось улучшить скорость с помощью SetColumnns (например, https://docs.microsoft.com/en-us/office/vba/api/Outlook.Items.SetColumns)
Я знаю .. Я знаю .. Это работает только для нескольких свойств, таких как "Subject" и "ReceivedTime", а не для тела!
Но подумайте еще раз: вы действительно хотите прочитать все ваши электронные письма? или это просто подмножество? может быть, на основе его строки «Тема» или «ReceivedTime»?
Мое требование состояло в том, чтобы просто войти в тело письма, если его тема соответствует определенной строке!
Следовательно, я сделал следующее:
Я добавил второй объект Outlook.Items под названием myFilterItemCopyForBody и применил тот же фильтр, что и у других Outlook.Items.
Итак, теперь у меня есть два «Outlook.Items»: «myFilterItem» и «myFilterItemCopyForBody» с одинаковыми элементами электронной почты, поскольку к обоим применяются одни и те же условия ограничения.
'myFilterItem' - для хранения только свойств 'Subject' и 'ReceivedTime' соответствующих писем (выполняется с помощью SetColumns)
'myFilterItemCopyForBody' - для хранения всех свойств почты (включая тело)
Теперь и myFilterItem, и myFilterItemCopyForBody сортируются с помощью ReceivedTime, чтобы располагать их в одном порядке.
После сортировки оба цикла зацикливаются одновременно во вложенном для каждого цикла и выбирают соответствующие свойства (с помощью счетчика), как в коде ниже.
Dim myFilterItem As Outlook.Items
Dim myItems As Outlook.Items
Set myItems = olFldr.Items
Set myFilterItemCopyForBody = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
Set myFilterItem = myItems.Restrict("@SQL=""urn:schemas:httpmail:datereceived"" > '" & startTime & "' AND ""urn:schemas:httpmail:datereceived"" < '" & endTime & "'")
myFilterItemCopyForBody.Sort ("ReceivedTime")
myFilterItem.Sort ("ReceivedTime")
myFilterItem.SetColumns ("Subject, ReceivedTime")
For Each myItem1 In myFilterItem
iCount = iCount + 1
For Each myItem2 In myFilterItemCopyForBody
jCount = jCount + 1
If iCount = jCount Then
'Display myItem2.Body if myItem1.Subject contain a specific string
'MsgBox myItem2.Body
jCount = 0
Exit For
End If
Next myItem2
Next myItem1
Примечание 1: Обратите внимание, что свойство Body доступно с помощью myItem2, соответствующего myFilterItemCopyForBody.
Примечание 2: Чем меньше раз компилятор входит в цикл для доступа к свойству body, тем лучше! Вы можете еще больше повысить эффективность, играя с Restrict и логикой, чтобы уменьшить количество циклов, которые компилятор должен циклически проходить по логике.
Надеюсь, это поможет, хотя это не что-то новое!