Excel это не сложно

Основные форумы => Вопросы по Excel и VBA => Тема начата: RuSoldatSe от 23.10.2018, 10:45:27



Название: Как можно ускорить обработку писем из почты?
Отправлено: RuSoldatSe от 23.10.2018, 10:45:27
Всем привет. Есть задача, нужно обрабатывать письма из подключенного к Аутлуку доп почтового ящика. Писем в нем много (6-7т.) Сам перебор писем происходит быстро, но если добавлять условие проверки, то процесс заметно стопорится (~1,5т писем обрабатываются минут 7). Собственно вопрос – есть ли возможность как то сразу (одной командой) передать содержимое ящика в некий массив и в дальнейшем работать с ним? Пока только использую решение – проходя по каждому письму, загружая его содержимое в массив и далее обработка писем уже в массиве (необходимо переборку писем запускать несколько раз). Ну и отсечка по дате получения письма (очень старые не обрабатываю). Что посоветуете? Спасибо.
Собственно код:
Код: (vb)
Dim olApp As Outlook.Application
Dim oNameSpace As Object, oFolder As Object, oFolder_In As Object, oMail As Object

Set olApp = New Outlook.Application         'объект аутлука
Set oNameSpace = olApp.GetNamespace("MAPI")
Set oFolder = oNameSpace.Folders("Logistics") 'указатель на нужный почтовый ящик
Set oFolder_In = oFolder.Folders("Inbox") 'указатель на папку входящих писем выбранного почтового ящика
For Each oMail In oFolder_In.Items 'переборка всх писем
If InStr(oMail.Subject, "заказ № ") > 1 Then 'для тестов по номеру заказа в теме сообщения
'собственно после этой проверки резко снижается скорость обработки писем
'без этой проверки (сам цикл) по письмам бежит относительно шустро
End If
Next


Название: Re:Как можно ускорить обработку писем из почты?
Отправлено: Дмитрий Щербаков(The_Prist) от 23.10.2018, 10:58:29
Здесь оптимально использовать обращение по SQL. Примерный код:
Код: (vb)
Sub FastSearchInOutlook()
    Dim myOlApp As New Outlook.Application
    Dim objNamespace As Outlook.Namespace
    Dim objFolder As Outlook.MAPIFolder
    Dim filteredItems As Outlook.Items
    Dim itm As Object
    Dim strFilter As String


    Set objNamespace = myOlApp.GetNamespace("MAPI")
    Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox)

    strFilter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & Chr(34) & " like '%заказ № %'" & _
                                    "urn:schemas:httpmail:datereceived < '1/02/2005 12:00 AM'"

    Set filteredItems = objFolder.Items.Restrict(strFilter)
    If filteredItems.Count = 0 Then
        Debug.Print "No emails found"
    Else
        For Each itm In filteredItems
         Debug.Print itm.Subject
        Next
    End If
End Sub

Чтобы просмотреть все возможные варианты отбора(по имени отправителя, получателя, тема и т.п.) и правила их применения - наберите в поисковике SQL DASL Outlook. Что-то должно выплыть.


Название: Re:Как можно ускорить обработку писем из почты?
Отправлено: RuSoldatSe от 24.10.2018, 16:46:49
спасибо, попробую.


Название: Re:Как можно ускорить обработку писем из почты?
Отправлено: Flineran от 24.05.2019, 18:50:27
Код: (vb)

    strFilter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & Chr(34) & " like '%заказ № %'" & _
                                    "urn:schemas:httpmail:datereceived < '1/02/2005 12:00 AM'"


Вот так точнее:
Код: (vb)

    strFilter = "@SQL=" & Chr(34) & "urn:schemas:httpmail:subject" & Chr(34) & " like '%заказ № %'" & " AND " & _
                          Chr(34) & "urn:schemas:httpmail:datereceived" & Chr(34) & " < '1/02/2005 12:00 AM'"


К тому же время указанное в коде будет без учета часового пояса.
https://docs.microsoft.com/ru-ru/office/vba/outlook/how-to/search-and-filter/filtering-items