Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
24.04.2024, 16:38:16

Войти
Интересные и полезные статьи по работе с Excel и VBA можно найти в разделе ХИТРОСТИ
33 242 Сообщений в 5 457 Тем от 6 761 Пользователей
Последний пользователь: Halfdoor
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Как можно ускорить обработку писем из почты?
Страниц: [1]   Вниз
Печать
Автор Тема: Как можно ускорить обработку писем из почты?  (Прочитано 4310 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RuSoldatSe
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 27


Просмотр профиля E-mail
« : 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
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #1 : 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. Что-то должно выплыть.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
RuSoldatSe
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 27


Просмотр профиля E-mail
« Ответ #2 : 24.10.2018, 16:46:49 »

спасибо, попробую.
Записан
Flineran
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 3


Просмотр профиля E-mail
« Ответ #3 : 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
« Последнее редактирование: 24.05.2019, 18:55:20 от Flineran » Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru