顺序流程Outlook规则

时间:2011-12-01 10:12:43

标签: email vba outlook outlook-vba outlook-2010

我使用Outlook规则通过VBA宏处理传入邮件。 在vba中,会触发各种操作来处理传入邮件的附件。

问题是,有些时候需要处理一堆电子邮件。 我似乎找不到如何逐个触发的方法。 如果有堆栈,我想在处理下一封邮件之前等待几秒钟。 将睡眠方法放在宏中似乎没有效果。该规则似乎不等待上一条消息完成。

我的方法我喜欢:

有没有办法实现这种行为?

Private Sub ProcessMail(ByVal Item As Object)
Dim objNS As Outlook.NameSpace
Set objNS = GetNamespace("MAPI")

If TypeOf Item Is Outlook.MailItem Then
    Dim Msg As Outlook.MailItem

        DoProcessingMethod 

    End If
End If

End Sub

在方法中等待或睡眠并不会导致它被逐一处理。

2 个答案:

答案 0 :(得分:1)

GD阿诺德,

根据@ Brett的回答你确实可以使用ItemAdd选项。

我使用类似的过程自动上传收到的数据(作为电子邮件中的附件)并将其上传到MySQL数据库。该操作由ItemAdd方法触发,邮件逐个检查。

简化说明:

将类添加到名为“EventClassModule”

的VBA代码中

在班上输入

Public WithEvents dItems As Outlook.Items

在你的ThisOutlookSession中创建一个注册event_handler的子:

Sub Register_Event_Handler()

    Set myClass.dItems = Outlook.Items

End Sub

在你的ThisOutlookSession中创建一个处理ItemAdd事件的子,如下所示:

Private Sub dItems_ItemAdd(ByVal newItem As Object)

  On Error GoTo ErrorHandler
  Dim msg As Outlook.MailItem
  If newItem.Class = olMail Then
    Set msg = newItem
    'Do something with the msg item, check rules, check subject, check whatever
    'This will process messages when the arrive in your mailbox one by one.


  End If
ProgramExit:
  Exit Sub
ErrorHandler:
  MsgBox Err.Number & " - " & Err.Description
  Resume ProgramExit
End Sub

这些步骤应该为您提供在新邮件到达时触发的子目录。

然后您可以调用下面的函数/ sub。 以下子操作基于可选的ruleSet变量运行所有规则,它根据规则集检查rule.Name,如果ruleSet中存在rule.Name字符串则执行一些代码。这样,您可以拥有多个规则,并且只根据它们所属的“ruleSet”执行其中的一些规则。您可以通过更改名称来定义它。

这是Outlook中“运行规则”选项的改进。

其中一些代码来自:Setting VBA to read personal inbox

Sub runRules(Optional ruleSet As String)
    Dim olStore As Outlook.Store
    Dim myRules As Outlook.Rules
    Dim tmpInbox As Outlook.Folder
    Dim tmpSent As Outlook.Folder

    Dim rl As Outlook.Rule
    'On Error Resume Next
    'toTmpBox (ruleSet)

    ' get default store (where rules live)
    Set olStore = Application.Session.DefaultStore

    With olStore
        Set tmpInbox = .GetDefaultFolder(olFolderInbox) '.Folders("tmpInbox")
        Set tmpSent = .GetDefaultFolder(olFolderSentMail) '.Folders("tmpSentBox")
    End With

    ' get rules
    Set myRules = olStore.GetRules

    ' iterate through all the rules
    For Each rl In myRules
            Debug.Print rl.Conditions.Body.Enabled & " " & rl.Conditions.Body.Text

            If InStr(LCase(rl.Name), ruleSet) > 0 And (rl.Enabled) Then

                rl.Execute ShowProgress:=True, Folder:=tmpInbox

                If ruleSet = "autorun" Then
                    rl.Execute ShowProgress:=True, Folder:=olStore.GetDefaultFolder(olFolderSentMail)

                End If

                ruleList = ruleList & vbCrLf & rl.Name
            End If
    Next


    ' tell the user what you did
    ruleList = "These rules were executed " & _
          vbCrLf & ruleList
    MsgBox ruleList, vbInformation, "Macro: RunMyRules"

CleanUp:

    Set olStore = Nothing
    Set tmpInbox = Nothing
    Set tmpSent = Nothing

    Set rl = Nothing
    Set myRules = Nothing


End Sub

答案 1 :(得分:0)

我遇到过类似的问题。在我的情况下,我的工具将以固定的时间间隔运行,每次我只需要捕获新的电子邮件。现在新的电子邮件可能是一个或多个。我发现的解决方案如下所示。

每次工具运行。它将捕获新的电子邮件,并标记一个简单的','或者' |'你在主题末尾选择的任何东西都是没有人会注意到的。现在,下次工具运行时,它会检查一两天内收到的电子邮件(根据您的要求)是否有这些标记。

如果电子邮件通信是单向的,则此解决方案有效。如果我们将这些电子邮件用于连锁电子邮件,那么它们就是另一种解决方案。

在这里,您必须节省上次运行中捕获的电子邮件的最长时间。现在,每次运行时,只需要运行一整天,然后放置一个if语句,该语句应该比上次捕获的时间更长。

现在存储创建文件夹和电子邮件所需的最长时间。每次运行时,电子邮件都可以帮助您存储

item.subject = maxtime item.save