Подтвердить что ты не робот

Выполнять пакет script один раз для нескольких электронных писем

У меня появилось несколько писем (каждый день я получаю 3 письма для заказов на 3 категории). Тема электронной почты находится в формате:

" ЭКСТРАКТЫ ЗАКАЗОВ - [Категория] - [Дата]".

Где [Категория] может быть Category 1, Category 2 или Category 3. [Дата] - это дата отправки электронной почты в формате DD/MM/YYYY.

У меня есть настройка правила для поиска " Заказы", затем вызывается код ниже.

Я хочу запустить Complete.bat после того, как все вложения электронной почты были сохранены, и я хочу только один раз вызвать его.

Я попытался сделать это, создав еще один подканал saveAttachtoDisk_CATEGORY1(itm), который вызывается только тогда, когда он находит " Категория 1" в теме. Затем он сохраняет вложение, а также ищет категорию 1 в объекте И также выполняет поиск вчерашней даты.

Я хочу лучшее решение, которое не зависит от даты. Глобальная переменная может работать там, где я устанавливаю переменную равной 1, затем запускается Complete.bat, а затем в будущем, если переменная = 1, тогда не запускайте Complete.bat. Не знаете, куда поместить эту переменную (глобальная переменная?) Поскольку оба вспомогательных модуля кажутся неправильным местом, чтобы поместить это и ссылаться на него.

Оба этих двух модуля сохраняются в разделе "Модули" Microsoft Outlook VBA.

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim SaveFolder As String
    SaveFolder = "D:\Orders\"
    For Each objAtt In itm.Attachments
         objAtt.SaveAsFile SaveFolder & "\" & objAtt.DisplayName
         objAtt.Delete
    Next
    itm.Save
End Sub

Другой модуль:

Public Sub saveAttachtoDisk_CATEGORY1(itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim SaveFolder As String
    SaveFolder = "D:\Orders\"
    For Each objAtt In itm.Attachments
        objAtt.SaveAsFile SaveFolder & "\" & objAtt.DisplayName
        objAtt.Delete
    Next
    itm.Save
    If InStr(1, itm.Subject, "ORDERS EXTRACT - Category 1 -" & Format(Date, "dd/mm/yyyy")) Then
        Shell "D:\Orders\Complete.bat"
    End If
End Sub
4b9b3361

Ответ 1

Предположения

  • OP будет получать ровно три письма в день (хотя это настраиваемый в коде)
  • Субъекты всегда будут начинаться с "ЭКСТРАКТЫ ЗАКАЗОВ -", и никакие другие электронные письма начнутся с этого кода
  • OP хотел бы запустить Complete.bat один раз в день после получения третий адрес электронной почты ORDERS EXTRACT.
  • У OP aready есть правило, настроенное для запуска SaveAttachtoDisk после получения адрес электронной почты ORDERS EXTRACT. Это правило можно изменить для запуска CategorySaveAndComplete
  • OP использует Outlook 2013 или более позднюю версию

Предлагаемое решение

В приведенном ниже коде будут сохранены вложения для каждого электронного письма для извлечения ордеров, а затем проверьте, были ли получены все три. Я решил не использовать .Find и .FindNext, поскольку эти методы не могут использовать подстановочные знаки и поэтому требуют жесткого кодирования имен категорий. Я также решил не использовать. Ограничьте, поскольку есть только три предмета, для которых мы ищем.

Тем не менее, решения с .Find и .Restrict также будут действительны и будут работать лучше, чем ниже, при определенных условиях, таких как пользователь с множеством элементов, последовательно находящихся в папке "Входящие".

Обратите внимание, что ожидаемое количество ордеров "Извлечь электронные письма", строку "Тема" для сопоставления и предыдущие даты для проверки можно установить с помощью констант. Я выполнил предыдущую проверку даты в случае, если OP захочет проверить каждый предшествующий день.

Option Explicit

Public Const C_ExpectedOrderCount As Integer = 3 'Set number of expected emails for categories
Public Const C_SubjectFormat As String = "ORDERS EXTRACT - *"
Public Const C_PrevDatesToCheck As Integer = 0 'If the Outlook app may not be open every day, set this to the number of prior days the script should also check.

Public Sub CategorySaveAndComplete(itm As Outlook.MailItem)

    'Do not take any action if this is not an ORDERS EXTRACT email.
    If itm.Subject Like C_SubjectFormat Then

        Dim objAtt As Outlook.Attachment
        Dim SaveFolder As String
        SaveFolder = "D:\Orders\"
        For Each objAtt In itm.Attachments
            objAtt.SaveAsFile SaveFolder & "\" & objAtt.DisplayName
            objAtt.Delete
        Next
        itm.Save

        'Check all emails in Inbox for ORDERS EXTRACT - * - DATE
        Dim Item As Object
        Dim objNS As Outlook.NameSpace
        Set objNS = GetNamespace("MAPI")
        Dim olFolder As Outlook.MAPIFolder
        Set olFolder = objNS.GetDefaultFolder(olFolderInbox)
        Dim iLoop As Integer
        Dim iCount As Integer
        Dim DateCheck As Date

        For iLoop = 0 To C_PrevDatesToCheck
            'Reset DateCheck and iCount if we are looping through days
            DateCheck = DateSerial(Year(Date), Month(Date), Day(Date)) - iLoop
            iCount = 0
            'Loop through mail items
            For Each Item In olFolder.Items
                If Item.Class = 43 Then
                    'This is an email. Check if it matches our criteria.
                    If Item.Subject Like C_SubjectFormat And CDate(CLng(Item.ReceivedTime)) = DateCheck Then iCount = iCount + 1
                End If
            Next
            'If we have met the expected targets, then run the batch file.
            If iCount = C_ExpectedOrderCount Then
                'We have exactly the expected number of items. Run the batch file.
                Shell "D:\Orders\Complete.bat"
            ElseIf iCount > C_ExpectedOrderCount Then
                'More items than expected. Check if user is OK with running batch file; if so, run it now.
                If MsgBox("More order extracts than expected were received. Expected " & _
                C_ExpectedOrderCount & "; received " & iCount & " for " & Format(DateCheck, "mmm d, yy") & _
                ". Would you like to run the Complete.bat file now?", vbYesNo) = vbYes Then Shell "D:\Orders\Complete.bat"
            End If
        Next iLoop
    End If
End Sub