Outlook通过电子邮件线程获取其他电子邮件 - UniqueBody

时间:2013-05-09 22:39:30

标签: vba outlook

我在发送之前使用VBA以特定方式格式化所有出站电子邮件。例如,我想从电子邮件中嵌入的所有表中删除第一列。我使用以下代码:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim wd As Word.Document
    Set wd = ActiveInspector.WordEditor
    Dim tb As Word.Table
    For Each tb In wd.Tables
        tb.Columns(1).Delete
    Next tb
End Sub

以上代码完美无缺。但是,问题是我只想格式化我的电子邮件文本。通常,我会回复或转发其他人的电子邮件,这意味着上一封电子邮件的文本将位于同一个“检查器”窗口中。我想要格式化text / images / etc.线程中以前的电子邮件。如何实现这一目标?

我知道线程中的每封电子邮件 - 尽管它们都在同一个窗口中 - 是一个单独的单元。我知道这一点,因为在阅读作为线程一部分的电子邮件时,当您移动鼠标时,您将看到

enter image description here

屏幕右侧的

,指示线程的下一部分所在的位置。在撰写作为帖子一部分的新电子邮件(回复或转发)时,上面的按钮没有显示,但你仍会看到一条蓝色的水平线,将线程的不同部分相互分开。

我在想,也许我可以在电子邮件中搜索该行的第一次出现,并且直到那时才应用格式。但是,看起来该行不是真正的文本或任何常规格式,可以在正常意义上搜索。实际上,如果您复制电子邮件文本(发送前),然后粘贴到Word中,该行将消失。

有什么建议吗? 谢谢!

更新

我的问题与版本2010及更高版本中的“对话视图”无关。 Outlook 2010允许您在一个组中的线程中查看 其他电子邮件。但是,我想要的是能够在同一个电子邮件中的线程中循环(通过代码)电子邮件。所以,如果有一个电子邮件“a”,然后是回复,“b”,然后是另一个回复,“c”,c也会在它下面包含b,然后在它下面,都在同一个内电子邮件。在伪代码中,我想要以下内容:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
    Dim wd As Word.Document
    Dim smail as SubEmail
    Dim tb As Word.Table
    Set wd = ActiveInspector.WordEditor
    For Each smail in wd
        For Each tb In wd.Tables
            tb.Columns(1).Delete
        Next tb
        Exit For
    Next smail
End Sub

更新

我在Exchange Web Services中发现了一个名为UniqueBody的类似功能。见here。这正是我正在寻找的,而不是Exchange。

1 个答案:

答案 0 :(得分:1)

为什么不只找“从:”chr(13)“已发送:”? Outlook会将这些标记放在任何电子邮件中,无论它来自何处。

假设您上面示例中的整个电子邮件a,b,c都在sBody中:

Sub GetFirstThread()
    Dim olItem As Outlook.MailItem
    Dim sText As String

    Set olItem = ActiveExplorer.Selection.Item(1)
    sBody = olItem.Body
    i=1
    While i < Len(sBody)
        If Asc(Mid(sBody, i, 1)) = 13 Then 'Look for From:
            If Mid(sBody, i + 1, 5) = "From:" Then
                'we found the start of email b
                nPosEb = i
            End If
        End If
        i=i+1
    Wend
     '...do something with nPosEb
End Sub