检测电子邮件对话体中新消息的结束



当一个消息得到回复或转发时,前一个线程被附加到你的新邮件中,即在它前面放置----原始消息----。

Outlook对测试邮件也做同样的事情,但是对于HTML邮件,它会显示一行,后面跟着From:.

由于outlook在这些消息之间显示一条线,我相信可以使用VBA减去这些消息。但如何?

目标:当用户发送邮件(Application_ItemSend)时,我想扫描消息中的某些单词。但是我不在乎它是否出现在之前的消息中,我只想扫描新输入的消息。

下面的例子可以在outlook中回复文本形式的电子邮件(outlook是英文的!)但是当发送HTML电子邮件时,它将不起作用。

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
  Dim EndOfMsg As Integer
  Dim myMsg as String
  EndOfMsg = InStr(Item.Body, "-----Original Message-----")
  If EndOfMsg = 0 Then 
    myMsg = Item.Body
  Else 
    myMsg = Left(Item.Body, EndOfMsg)
  End If
  MsgBox myMsg
End Sub

所以我需要一些"令牌"来分割,正确的…但是这个代币是什么呢?所有在myMsg和旧msg之间的是一个双vbCrLf。就像我在我的消息中输入新的一行一样。没有什么是独一无二的!

答案取决于用户发送的是HTML邮件还是富文本邮件。(这通常取决于他们是用HTML还是RTF回复/转发消息,除非他们手动更改格式。)

无论哪种情况,您都需要寻找指示您感兴趣的消息结尾的模式,并在此停止。使用Instr()来确定需要停止的位置。然后,当你在解析文本寻找你的"特定单词"时,记录你读了多少个字符,当你到达标记处时停止。

富文本

p

Item.Body"^ ^ p_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___ ^ p"。

这是2个VbCrLf实例,46个Chr(95)实例,一个空格,然后是另一个VbCrLf实例。

Item.Body,令牌" ^ p _ ^ p"。

这是一个VbCrLf, 2个空格,5个Chr(95)实例,2个空格,和另一个VbCrLf。

Item.HTMLBody中,令牌是

<DIV dir=ltr lang=en-us class=OutlookMessageHeader align=left>
<HR tabIndex=-1>

该标记在其前面、两行之间和末尾有一个VbCrLf。

您可以创建一个消息数组,如下所示:

Dim arr() As String
arr() = Split(Item.Body, "From:")

然后遍历消息:

Dim varElement as variant
for each varElement in arr()
next varElement

如何将InStr函数更改为EndOfMsg = InStr(1, Item.Body, "From:") ?

最新更新