【问题标题】:Send an alert email based on incoming outlook email using VBA使用 VBA 根据传入的 Outlook 电子邮件发送警报电子邮件
【发布时间】:2017-05-11 22:08:54
【问题描述】:

如果告诉如何,我可以附上我在这个问题中谈到的电子邮件。

我需要监控我的 Outlook 收件箱中是否有两封特定的电子邮件。每天晚上 7 点到达。另一个在晚上 7:20 到达(给或花几分钟)。

第一个电子邮件主题:“Automatic1 08092013”​​。 Automatic1 这个词总是一样的,数字代表日期。

第二封电子邮件主题:“Automatic2 - Aug 09, 2013”​​。 Automatic2 始终保持不变,但日期会发生变化。

Automatic1 的电子邮件正文包含一个字符串,其值表示货币。

7pm EmailBody 示例:CustomerCount: 11 VisitorNumber: 121 Amount: 811070

与第二封电子邮件中的值相比,我需要 CustomerCount、VisitorNumber 和 Amount:811070。金额“811070”表示等于 $8,110.70 的货币价值。

在 7:20 电子邮件到达后,如果值不匹配,请向我发送警报电子邮件。

这是棘手的部分。晚上 7:20 的电子邮件的值包含在多个表中。

7:20pm EmailBody 示例:

(这是表 #1,它包含 2 行和 2 列)

Process1 Totals(这是出现在第一个表格上方的电子邮件正文中的字符串文本)

Count1...数量1

11.......8110.70

(这是表 #2,它包含 3 行和 2 列)

Process2 Totals(这是出现在第二个表格上方的电子邮件正文中的字符串文本)

Count2 ..Amount2

121........811070

(这是表 #3,它包含一堆我不关心的东西)

故障

ID 编号 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

场景:

如果 7:20 的电子邮件到达并且晚上 7 点的电子邮件不存在(从同一日期开始),请发送带有“警告文本”的电子邮件警报。

如果 7:20 的电子邮件到达并且晚上 7 点的电子邮件确实存在(重要:从同一日期开始),请比较

客户数:11

晚上 7:20 发送电子邮件表 1 Count1 值包含在第 1 列第 2 行中

Count1 金额 1 11 8110.70

如果它们不匹配,则发送带有“CustomerCount not equal”的电子邮件

另外,比较晚上 7 点访客人数:121

表 2 Count2 值包含在第 1 列第 2 行中

Count2 数量2 121 811070

如果它们不匹配,请发送带有“VisitorNumber not equal”的电子邮件

另外,比较晚上 7 点金额:811070

Table2 Amount2(见上文)值包含在第 2 列第 2 行中

如果不匹配,请发送“金额不匹配”的电子邮件

每封电子邮件都应包含确定存在问题所涉及的实际数学。每封电子邮件都应包含所有数字。当涉及到货币时,电子邮件正文中包含的两者之间应该存在差异。该值返回正数还是负数都没有关系。 我不必为每个问题提供单独的电子邮件。只要包含与货币的所有比较和差异,只需一封电子邮件即可。如果 7:20 的电子邮件没有收到(没关系)和/或数字都匹配并且没有差异,则根本不会发送任何电子邮件。

例子:

主题:警报

电子邮件正文:“每晚总数不匹配”

您的客户数 = 11

原始收件人客户数 = 12

已知问题:

晚上 7:20 电子邮件中的单元格由于某种原因包含空格。

晚上 7 点的电子邮件是一长串。

我对它应该如何工作的看法。

需要监控收件箱中 7:20 电子邮件的主题行。

当 7:20 的电子邮件进入时,在我的收件箱中搜索晚上 7 点的电子邮件,按主题搜索。

如果晚上 7 点的电子邮件存在,则从每封电子邮件中获取值,比较并决定是否需要发送警报电子邮件。(过于简化)

我宁愿不涉及 excel,但了解是否需要。

【问题讨论】:

  • 我不确定这些电子邮件是从哪里来的等等。但这似乎是一种非常“脆弱”的应用逻辑的方式,而且很可能容易出错。有没有其他方法可以在电子邮件/Outlook 之外获取这些数据?
  • 虽然您可以为 Outlook 编写代码来执行此操作,但 Outlook 具有各种用户验证对话框,可通过纠缠用户进行确认来防止基于 vba 的恶意软件和诸如此类的应用程序发送垃圾邮件。如果您不希望这是一个永久或半永久有人参与的解决方案,则需要使用 Outlook 以外的解决方案。

标签: vba outlook inbox


【解决方案1】:

我想您是在询问 Outlook VBA 代码。这听起来像是可能的事情,因为我自己编写了 Outlook VBA 来对用户执行基本的 Active Directory 操作(解锁、更改/重置密码) - 我向自己发送包含用户名和说明的电子邮件,然后几秒钟后结果将通过电子邮件发送给我。

请注意,即使使用完整的 VBA 代码,您也需要设置 Outlook 规则来运行 VBA 代码,并且您必须打开 Outlook 会话,因为它无法在服务器中完成。这也意味着您需要一台运行 Outlook 24/7 的计算机来完成此操作。

如果没有实际的 .msg 文件可以测试,就不可能生成完整的 VBA 代码。

但是有一些东西可以让你开始......(尚未完全测试)

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 中的工作原理...

【讨论】:

  • 感谢大家这么快回复,没想到这么快。
  • 今晚我将尝试 patricK 的建议。我对 VBA 有很好的理解,应该能够毫无问题地测试你的代码。如果我遇到麻烦,我可以包含我收到的实际电子邮件。 @scunliffe 这两封电子邮件我都收到了生成的 SQL Server,但我无权访问它们。除此之外,我没有其他方法可以获取此信息。 Monty Wild 我不确定你所说的“纠缠用户确认”是什么意思,但我可能没有很好地澄清一些事情。
猜你喜欢
  • 2015-05-03
  • 2011-09-28
  • 2014-02-14
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多