Outlook宏用于在具有相同主题的新邮件到达时删除旧邮件

时间:2018-06-01 19:25:04

标签: vba outlook outlook-vba

我试图编写一个outlook VB宏,以实现以下目标:

  1. 新电子邮件到达时触发。

  2. 转到收件箱内的文件夹 - temp1。

  3. 检查是否有与该主题相匹配的现有电子邮件 这封新电子邮件。

  4. 删除旧电子邮件。

  5. 代码:

    Option Explicit
    Private objNS As Outlook.NameSpace
    Private WithEvents objItems As Outlook.Items
    Private Sub Application_Start()
        Dim olApp As Outlook.Application
        Dim objWatchFolder As Outlook.Folder
        Set olApp = Outlook.Application
        Set objNS = Application.GetNamespace("MAPI")
    
        'Set the folder and items to watch:
        Set objWatchFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("temp1")
        Set objItems = objWatchFolder.Items
        Set objWatchFolder = Nothing
    End Sub
    
    
    Private Sub objItems_ItemAdd(ByVal Item As Object)
        Dim intCount As Integer
        Dim objVariant As Variant
    
        For intCount = objItems.Count To 1 Step -1
        Set objVariant = objItems.Item(intCount)
            If objVariant.Subject = Item.Subject And objVariant.SentOn < Item.SentOn 
            Then
              objVariant.Delete
            Else
               End If
        Next
    End Sub
    

    问题:

    宏未被触发。

    注意:

    • 更新信任中心设置以启用宏。
    • 已将此代码添加到“课程模块”
    • 当我执行F5时,它不会显示任何可以运行的MACRO。

    寻求专家的帮助!

3 个答案:

答案 0 :(得分:0)

(1)您需要处理在收件箱中收到新项目时触发的Application类的NewMailEx事件。当新邮件到达收件箱时以及客户端规则处理发生之前,NewMailEx事件将触发。您可以使用EntryIDCollection数组中返回的条目ID来调用NameSpace.GetItemFromID方法并处理该项目。请谨慎使用此方法,以尽量减少对Outlook性能的影响。但是,根据客户端计算机上的设置,在新邮件到达收件箱后,垃圾邮件过滤和将新邮件从收件箱移动到另一个文件夹的客户端规则等过程可能会异步发生。您不应该假设在这些事件发生后,您将始终获得收件箱中项目数量的一项增加。

(2)看起来您已经知道如何获取收件箱的子文件夹:

 Set objWatchFolder = objNS.GetDefaultFolder(olFolderInbox).Folders("temp1")

(3)要查找具有相同主题的项目,您需要使用Items类的Find / FindNextRestrict方法,而不是迭代所有项目在文件夹中。请阅读以下文章中有关这些方法的更多信息:

此外,如果您需要在多个文件夹中查找项目,您可能会发现Application类的AdvancedSearch方法很有帮助。在Outlook中使用AdvancedSearch方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动运行另一个线程,因为AdvancedSearch方法会在后台自动运行它。
  • 可以在任何位置搜索任何项目类型:邮件,约会,日历,备注等,即超出某个文件夹的范围。 RestrictFind / FindNext方法可以应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。
  • 完全支持DASL查询(自定义属性也可用于搜索)。您可以在MSDN中的Filtering文章中详细了解这一点。要提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅Store类的IsInstantSearchEnabled属性)。
  • 您可以随时使用Search类的Stop方法停止搜索过程。

有关详细信息,请参阅Advanced search in Outlook programmatically: C#, VB.NET

(4)使用Delete方法删除项目。

答案 1 :(得分:0)

Items.ItemAdd Event (Outlook)描述了如何在Class模块中应用ItemAdd事件。然后,您将在ThisOutlookSession中使用Application_Startup来初始化objItems。

您拥有的是ThisOutlookSession模块的代码。

答案 2 :(得分:-1)

您正在观看temp1文件夹上的ItemAdd事件,而不是收件箱。