【问题标题】:Outlook VBA move mail in subfolder which hods mail of same subjectOutlook VBA 将邮件移动到包含相同主题邮件的子文件夹中
【发布时间】:2015-10-22 04:34:49
【问题描述】:

我想做以下事情:

在收到新邮件时,应检查邮件的主题,如果同一主题已存在于任何子文件夹中,则邮件应移至同一子文件夹。如果找不到相同的邮件,它将保留在正常的收件箱文件夹中。 这样的目标文件夹与邮件没有逻辑连接,因此它不像邮件或邮件发件人或类似的东西那样被调用。它只是包含一封或相同主题的邮件的文件夹。

我通过浏览这个论坛来识别事件、邮件主题并执行实际操作。 我没有管理的是:

1.创建搜索逻辑以在任何文件夹中查找具有相同主题的现有邮件

2.返回找到的文件夹以将其用作目标目的地。

这是它到目前为止的样子,它设法显示一条消息......

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
     Dim olApp As Outlook.Application
     Dim objNS As Outlook.NameSpace
     Set olApp = Outlook.Application
     Set objNS = olApp.GetNamespace("MAPI")
     Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
    On Error GoTo ErrorHandler
    Dim Msg As Outlook.MailItem
    Dim MoveToFolder As Outlook.MAPIFolder
    If TypeName(Item) = "MailItem" Then
     Set Msg = Item

     MsgBox "Here the folder must be found for '" & Msg.Subject & "'."

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

最重要的是:是否有特定的智能方法可以对其他事件(例如“SentMails”)执行相同的操作?

非常感谢您的支持。

拉尔夫

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    您可以使用 Application 类的 AdvancedSearch 方法,该方法基于指定的 DAV 搜索和定位 (DASL) 搜索字符串执行搜索。您可以在Advanced search in Outlook programmatically: C#, VB.NET 文章中阅读有关该方法的更多信息。因此,您可以找到具有相同主题的项目,然后获取它们的 Parent 属性值,该值代表存储它们的文件夹。

     Public blnSearchComp As Boolean
    
     Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
      Debug.Print "The AdvancedSearchComplete Event fired"
      If SearchObject.Tag = "Test" Then
        m_SearchComplete = True
      End If
     End Sub
    
     Sub TestAdvancedSearchComplete()
      Dim sch As Outlook.Search
      Dim rsts As Outlook.Results
      Dim i As Integer
      blnSearchComp = False
      Const strF As String = "urn:schemas:mailheader:subject = 'Test'"
      Const strS As String = "Inbox"   
      Set sch = Application.AdvancedSearch(strS, strF, “Test”) 
      While blnSearchComp = False
        DoEvents
      Wend 
      Set rsts = sch.Results
      For i = 1 To rsts.Count
        Debug.Print rsts.Item(i).SenderName
      Next
     End Sub
    

    是否有特定的智能方法可以对其他事件(例如“SentMails”)执行相同操作?

    您可以考虑处理 Application 类的 ItemSend 事件,该事件会在用户通过检查器(在检查器关闭之前,但在用户单击“发送”按钮之后)发送 Microsoft Outlook 项目时触发,或者在发送时触发。 Outlook 项目的发送方法。在事件处理程序中,您可以设置 SaveSentMessageFolder 属性,该属性允许设置一个 Folder 对象,该对象表示发送后将保存电子邮件副本的文件夹。

    【讨论】:

    • 非常感谢!经过一些更改和 tweeks 之后,它正是我所追求的。你肯定把我推向了正确的方向!
    最近更新 更多