首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为多封电子邮件执行一次批处理脚本

为多封电子邮件执行一次批处理脚本
EN

Stack Overflow用户
提问于 2015-12-04 21:03:03
回答 1查看 1.2K关注 0票数 11

我有多个电子邮件进来(每天我收到3封电子邮件,为3类订单)。电子邮件主题采用以下格式:

订单提取-类别-日期”。

其中类别可以是Category 1Category 2Category 3 date 是以DD/MM/YYYY格式发送电子邮件的日期。

我有一个规则设置来搜索'Orders‘,然后调用下面的代码。

我想运行Complete.bat后,所有的电子邮件附件已经保存,我只想调用它一次。

我试图通过创建另一个名为saveAttachtoDisk_CATEGORY1(itm)的子程序来实现这一点,只有当它在主题中找到“分类1”时才会调用它。然后,它保存附件,但也搜索主题中的类别1和搜索昨天的日期。

我想要一个不依赖日期的更好的解决方案。全局变量可以在我将变量设置为1的地方工作,然后运行Complete.bat,然后在将来如果变量=1,就不要运行Complete.bat。不知道把这个变量放在哪里(全局变量?)因为两个子模块似乎都不是放置和引用它的地方。

这两个模块都保存在的“模块”部分。

代码语言:javascript
运行
复制
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

其他模块:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

回答已采纳

发布于 2016-03-05 06:25:20

假设

  • OP每天只会收到三封电子邮件(尽管这在代码中是可定制的)。
  • 主题总是以“订单摘录”开头,而其他电子邮件都不会以该代码开头。
  • OP希望在收到第三份订单摘录电子邮件后每天运行一次Complete.bat。
  • OP区域设置了一个规则,用于在收到订单摘录电子邮件时运行SaveAttachtoDisk。此规则可更改为运行CategorySaveAndComplete。
  • OP正在使用Outlook 2013或更高版本

提出的解决方案

下面的代码将保存每个订单的附件,摘录电子邮件,然后检查是否已收到所有三个。我选择不使用.Find和.FindNext,因为这些方法不能使用通配符,因此需要硬编码类别名称。我还选择不使用.Restrict,因为只有三个项目我们正在搜索。

也就是说,使用.Find和.Restrict的解决方案也是有效的,并且在某些条件下比下面的解决方案工作得更好,例如,在收件箱中始终有许多项的用户。

请注意,订单的预期计数--提取电子邮件、要匹配的主题字符串和检查之前的日期--都可以通过常量设置。我实现了前一个日期检查,以防OP也想要检查前一天。

代码语言:javascript
运行
复制
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
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34097392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档