Outlook VBA:计算机锁定时脚本不会触发电子邮件接收

时间:2015-03-17 14:32:19

标签: vba email outlook-vba

我在我的Outlook会话上运行了一个VB脚本,它监视每一个新的电子邮件,并在收到特定的电子邮件地址和主题时触发。然后它保存该电子邮件中的附件并触发excel宏运行。

当我测试这个时(通过自己从另一个电子邮件地址发送电子邮件),它可以正常工作。今天早上,我的电脑收到了电子邮件(但计算机被锁定了#34;,Windows 7),但脚本没有被触发。我知道vba应该在后台运行,即使计算机被锁定了,所以我很困惑为什么这个脚本没有触发。

我的VBA脚本是否经常在后台运行,无论计算机是否被锁定?

以下是代码:

  

触发宏"去"从example@example.com接收电子邮件时,subject =今天

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    'This sub catches every new email (or collection of emails)
    Dim intMsgIDStart As Integer, intMsgIDEnd As Integer
    Dim strMailItemID As String
    Dim cont As Boolean

    intMsgIDStart = 1
    intMsgIDEnd = InStr(intMsgIDStart, EntryIDCollection, ",")

    cont = True
    Do
        If (intMsgIDEnd > 0) Then
            strMailItemID = Strings.Mid(EntryIDCollection, intMsgIDStart, (intMsgIDEnd - intMsgIDStart))
        Else
            strMailItemID = EntryIDCollection
        End If
        cont = handleMessage(strMailItemID)
        intMsgIDStart = intMsgIDEnd + 1
        intMsgIDEnd = InStr(intMsgIDStart, EntryIDCollection, ",")
    Loop While intMsgIDEnd <> 0 And cont

End Sub

Public Function handleMessage(strMailItemID As String)
    ' This function takes an email ID and determines whether it's our pricing sheet email.
    ' If so, it'll save it to the folder with a common name, pricing.xls
    ' Finally, it will call on runExcelMacro()
    On Error Resume Next
    Dim mailItem As Outlook.mailItem
    Dim path As String
    Dim result As Boolean
    result = True
    Set mailItem = Application.Session.GetItemFromID(strMailItemID)
    If (mailItem.SenderEmailAddress = "example@example.com" And Strings.Mid(mailItem.Subject, 1, 5) = "Today") Then

        path = "C:\path\Pricing.xls"
        mailItem.Attachments.item(1).SaveAsFile path
        Call runExcelMacro("C:\path\Auto.xlsm", "go")
        result = False
    End If
    handleMessage = result
End Function

Public Function runExcelMacro(path As String, macroName As String)
    'This function starts a macro
    Dim xl As Object
    Set xl = CreateObject("Excel.Application")
    xl.Workbooks.Open (path)
    'xl.Visible = False
    xl.Run macroName

    xl.ActiveWorkbook.Close (True)
    xl.Quit

    Set xl = Nothing

End Function

也许我需要使用其他设置让VBA始终在后台运行?

谢谢,并且道歉我的问题没有按照我的意愿定义 - 我甚至不确定是什么问题!

干杯,

扎克

1 个答案:

答案 0 :(得分:0)

在收件箱中收到新项目时会触发NewMailEx事件。以下是MSDN对该事件的陈述:

  

但对于具有Exchange Server帐户(非缓存Exchange模式或缓存Exchange模式)的用户,只有在Outlook启动后到达服务器的邮件才会触发该事件。在Outlook启动后立即在缓存Exchange模式下同步的邮件不会触发事件,也不会触发Outlook在非缓存Exchange模式下启动时服务器上已有的邮件。

     

当新邮件到达收件箱时以及客户端规则处理发生之前,将触发NewMailEx事件。您可以使用EntryIDCollection数组中返回的条目ID来调用NameSpace.GetItemFromID方法并处理该项。 谨慎使用此方法,以尽量减少对Outlook性能的影响。

无论如何,我建议改为制定规则。然后,您可以将VBA子分配给规则。 VBA子应该如下所示:

public sub TEST(mail as MailItem)
   ' do whatever you need
end sub

其中邮件对象表示传入的Outlook项目。正如您所看到的,不需要使用GetItemFromId方法以编程方式获取传入的邮件项。

path = "C:\path\Pricing.xls"

另外,我建议您选择其他驱动器来保存附件。在最近的操作系统中,C:驱动器需要管理员权限才能写入。