Отправить оповещение по электронной почте на основе входящей электронной почты Outlook с помощью VBA

Если скажут, как, я могу прикрепить электронные письма, о которых я говорю в этом вопросе.

Мне нужно отслеживать мой почтовый ящик Outlook для двух конкретных писем. Один прибывает каждую ночь в 7 часов вечера. Другой прибывает в 19:20 (плюс-минус пара минут с каждой стороны).

Тема первого письма: "Automatic1 08092013". Слово Automatic1 всегда одно и то же, а числа обозначают дату.

Тема второго письма: «Automatic2 — 9 августа 2013 г.». Automatic2 всегда один и тот же, но дата меняется.

Тело сообщения Automatic1 содержит строку со значением, представляющим валюту.

Пример 19:00 EmailBody: CustomerCount: 11 VisitorNumber: 121 Amount: 811070

Мне нужно CustomerCount, VisitorNumber и Amount: 811070 по сравнению со значением, которое приходит во втором письме. Сумма «811070» представляет собой валютную стоимость, равную 8 110,70 долларов США.

После 7:20 приходит электронное письмо, если значения не совпадают, отправьте мне электронное письмо с предупреждением.

Это сложная часть. Электронное письмо от 19:20 содержит значения более чем в одной таблице.

Пример 19:20 EmailBody:

(Это таблица № 1, она содержит 2 строки и 2 столбца)

Итоги процесса 1 (это строковый текст, который отображается в теле письма над первой таблицей)

Количество1... Сумма1

11..........8110.70

(Это таблица № 2, она содержит 3 строки и два столбца)

Итоги Process2 (это строковый текст, который отображается в теле письма над второй таблицей)

Счет2 ..Сумма2

121........811070

(Это таблица № 3, она содержит кучу вещей, которые меня не волнуют)

Авария

Идентификационный номер Amt ID2

296 15 737.33 0000113821

079 1 737.33 000938

34 1 737.33 0007000

746 10 737.33 0056200

741 8 737.33 0009733

089 6 737.33 0034664

636 1 737.33 007500

07 71 737.33 0000976

296 14 737.33 0023231

34 51 737.33 0000100

788 23 737.33 7100

Сценарии:

Если электронное письмо приходит в 19:20, а электронное письмо в 19:00 не существует (от той же даты), отправьте оповещение по электронной почте с «Предупреждающим текстом».

Если приходит электронное письмо в 19:20, а электронное письмо в 19:00 существует (важно: с той же даты), сравните

Количество клиентов: 11

С электронной почтой в 19:20. Таблица 1. Значение Count1, содержащееся в столбце 1, строке 2.

Кол-во1 Сумма1 11 8110,70

Если они не совпадают, отправьте электронное письмо с пометкой «CustomerCount не равно»

Также сравните 19:00 VisitorNumber: 121

С таблицей 2 Значение Count2, содержащееся в столбце 1, строке 2

Количество2 Сумма2 121 811070

Если они не совпадают, отправьте электронное письмо с сообщением «VisitorNumber не равно»

Также сравните 19:00 Количество: 811070

Со значением Table2 Amount2 (см. выше), содержащимся в столбце 2, строке 2

Если они не совпадают, отправьте электронное письмо с пометкой «Суммы не совпадают».

Каждое из электронных писем должно содержать фактическую математику, используемую для определения наличия проблемы. Каждое письмо должно содержать все цифры. Когда дело доходит до валюты, должна быть разница между двумя, включенными в тело электронного письма. Не имеет значения, возвращает ли значение положительное или отрицательное число. Мне не нужно иметь отдельный адрес электронной почты для каждой проблемы. Достаточно одного электронного письма, если оно содержит все сравнения и различия с валютой. Никакое электронное письмо не будет отправлено вообще, если электронное письмо в 7:20 не придет (это нормально) и/или все числа совпадают и нет различий.

Пример:

Тема: Предупреждение

Текст письма: «Ночные итоги не совпадают»

Количество ваших клиентов = 11

Количество клиентов исходных получателей = 12

Известные проблемы:

Ячейки в электронном письме от 19:20 по какой-то причине содержат пробелы.

Электронное письмо в 19:00 представляет собой одну длинную строку.

Мое видение того, как это должно работать.

Входящие необходимо отслеживать на предмет строки темы электронной почты 7:20.

Когда письмо в 7:20 приходит в мой почтовый ящик, найдите письмо в 19:00 по теме.

Если электронное письмо в 19:00 существует, тогда получите значения из каждого из электронных писем, сравните и решите, нужно ли отправлять электронное письмо с предупреждением. (Слишком упрощено)

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


person Jim    schedule 11.08.2013    source источник
comment
Я не уверен, откуда приходят эти электронные письма и т. д., но это кажется очень хрупким способом применения логики и, вероятно, будет подвержено ошибкам. Есть ли другой способ получить эти данные за пределами электронной почты / Outlook?   -  person scunliffe    schedule 12.08.2013
comment
Хотя вы можете написать код для Outlook, чтобы сделать это, Outlook имеет всевозможные диалоговые окна проверки пользователя, которые предотвращают рассылку спама вредоносными программами на основе vba и приложениями, подобными этому, приставая к пользователю для подтверждения. Если вы не хотите, чтобы это было решение с постоянным или полупостоянным обслуживанием, вам потребуется использовать решение, отличное от Outlook.   -  person Monty Wild    schedule 12.08.2013


Ответы (1)


Я предполагаю, что вы запрашиваете коды Outlook VBA. Это звучит как что-то возможное, поскольку я написал себе Outlook VBA для выполнения основных операций Active Directory с пользователями (разблокировка, изменение/сброс пароля) - я отправляю себе электронное письмо с именем пользователя и инструкциями, а через несколько секунд результат будет отправлен мне по электронной почте.

Обратите внимание, что даже с заполненными кодами VBA вам необходимо настроить правила Outlook для запуска кода VBA, и у вас должен быть открыт сеанс Outlook, поскольку это невозможно сделать на сервере. Это также означает, что для этого вам нужен компьютер с Outlook 24/7.

Невозможно создать полный код VBA, если нет возможности протестировать фактические файлы .msg.

Но кое-что для начала... (полностью не проверял)

Private Const sLookUp = "Automatic1 "

Public Sub Rules_Automatic2(oMailAuto2 As MailItem)
    Dim sDate As Date, oMailAuto1 As MailItem, sSubject As String, sBody As String

    ' Exit if "Automatic2" is NOT the first word in subject
    If InStr(1, Left(oMailAuto2.Subject, 10), "Automatic2", vbTextCompare) = 0 Then Exit Sub
    ' Get the date value in subject and get the corresponding Automatic1 mail item
    sDate = DateValue(Split(oMailAuto2.Subject, "-"))
    oMailAuto1 = GetAuto1Email(sLookUp & Format(sDate, "mmddyyyy"))

    If oMailAuto1 Is Nothing Then
        ' corresponding Automatic1 email not found
        sSubject = "Warning Text"
        sBody = "Corresponding email for """ & oMailAuto2.Subject & """ is not found!"
        SendEmail sSubject, sBody
    Else
        CompareAutomatics oMailAuto2, oMailAuto1
    End If
End Sub

Private Function GetAuto1Email(sTxt As String) As MailItem
    Dim oOlkFDR As Outlook.Folder, oMail As MailItem, oMailAuto1 As MailItem

    Set oMailAuto1 = Nothing
    Set oOlkFDR = Application.Session.GetDefaultFolder(olFolderInbox)
    For Each oMail In oOlkFDR.Items
        If InStr(1, oMail.Subject, sTxt, vbTextCompare) Then
            Set oMailAuto1 = oMail
            Exit For
        End If
    Next
    GetAuto1Email = oMailAuto1
End Function

Private Sub CompareAutomatics(oMailAuto2 As MailItem, oMailAuto1 As MailItem)
    Dim sBody2 As String, sBody1 As String, sSubject As String, sReply As String

    sBody2 = oMailAuto2.Body
    sBody1 = oMailAuto1.Body
    sSubject = ""
    sReply = ""
    ' Do Comparisons and setup email body and subject
    ' ...
    ' ...
    SendEmail sSubject, sReply
End Sub

Private Sub SendEmail(sSubject As String, sBody As String)
    Dim oMail As MailItem

    Set oMail = Application.CreateItem(olMailItem)
    With oMail
        .Subject = sSubject
        .BodyFormat = olFormatPlain
        .Body = sBody
        .Send
    End With
    Set oMail = Nothing
End Sub

Надеюсь, вы поняли, как все работает в Outlook VBA...

person PatricK    schedule 12.08.2013
comment
Спасибо всем, кто так быстро откликнулся, не ожидал. - person Jim; 12.08.2013
comment
Я попробую предложения patrick этим вечером. У меня есть приличное понимание VBA, и я должен без проблем протестировать ваш код. Если у меня возникнут проблемы, я могу включить фактические электронные письма, которые я получаю. @scanliffe Оба этих письма я получаю сгенерированным SQL Server, но у меня нет к ним доступа. Кроме этого, у меня нет другого способа получить эту информацию. Монти Уайлд: Я не уверен, что вы имеете в виду, когда пристаете к пользователю в поисках средств подтверждения, но, возможно, я не очень хорошо прояснил что-то. - person Jim; 12.08.2013