【问题标题】:VSTO - Outlook how to trace email from Message IDVSTO - Outlook 如何从邮件 ID 跟踪电子邮件
【发布时间】:2020-09-03 18:33:57
【问题描述】:

我正在为 Outlook 开发 VSTO 加载项, 现在我收到一封退回的电子邮件,其中包括邮件 ID。 如何在 VSTO 程序中从这个消息 ID 追踪原始电子邮件?

【问题讨论】:

    标签: c# outlook vsto email-bounces messageid


    【解决方案1】:

    您可以搜索PR_INTERNET_MESSAGE_ID 属性值。该属性的 DASL 名称是 http://schemas.microsoft.com/mapi/proptag/0x1035001F

    使用Items 类的Find/FindNextRestrict 方法。 Restrict 方法是使用Find 方法或FindNext 方法迭代集合中特定项的替代方法。如果项目数量很少,FindFindNext 方法比过滤更快。如果集合中有大量项目,则Restrict 方法的速度明显更快,尤其是在预计只能找到大型集合中的少数项目的情况下。

    但如果您需要从多个文件夹中查找项目,我建议您改用 AdvancedSearch 方法:

    Public m_SearchComplete As Boolean  
    
    Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)  
        If SearchObject.Tag = "MySearch" Then  
            m_SearchComplete = True  
        End If  
    End Sub  
    
    Sub TestSearchForMultipleFolders()  
        Dim Scope As String  
        Dim Filter As String  
        Dim MySearch As Outlook.Search  
        Dim MyTable As Outlook.Table  
        Dim nextRow As Outlook.Row  
        m_SearchComplete = False  
        'Establish scope for multiple folders  
        Scope = "'" & Application.Session.GetDefaultFolder( _  
        olFolderInbox).FolderPath _  
        & "','" & Application.Session.GetDefaultFolder( _  
        olFolderSentMail).FolderPath & "'"  
        'Establish filter  
        If Application.Session.DefaultStore.IsInstantSearchEnabled Then  
            Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _  
            & Chr(34) & " ci_phrasematch 'MesssageID'"  
        Else  
            Filter = Chr(34) & "http://schemas.microsoft.com/mapi/proptag/0x1035001F" _  
            & Chr(34) & " like '%MessageID%'"  
        End If  
        Set MySearch = Application.AdvancedSearch( _  
        Scope, Filter, True, "MySearch")  
        While m_SearchComplete <> True  
            DoEvents  
        Wend  
        Set MyTable = MySearch.GetTable  
        Do Until MyTable.EndOfTable  
            Set nextRow = MyTable.GetNextRow()  
            Debug.Print nextRow("Subject")  
        Loop  
    End Sub
    

    【讨论】:

      【解决方案2】:

      正如 Eugene 所说,您需要根据 PR_INTERNET_MESSAGE_ID 属性搜索已发送的消息。没有理由使用Items.Restrict 甚至Find/FindNext - 因为您期待的是一次匹配(除非您的邮箱确实有问题),只需拨打Items.Find 即可。

      另外请记住,在缓存的 Exchange 模式下,PR_INTERNET_MESSAGE_ID 不会在“已发送邮件”文件夹中的项目上设置。要解决这个问题,您需要以在线模式打开“已发送邮件”文件夹(您可以使用 C++/Delphi 中的扩展 MAPI 或任何语言的 Redemption 来完成此操作)。

      【讨论】:

        猜你喜欢
        • 2020-08-26
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 2011-06-30
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多