5

メッセージが返信または拒否されると、その前に ----元のメッセージ---- などを配置することで、前のスレッドが新しいメールに追加されます。

Outlook は tekst メッセージで同じことを行いますが、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 と古いメッセージの間にあるのは double だけvbCrLfです。メッセージに新しい行を入力したときと同じ..何もユニークではありません!

4

3 に答える 3

3

答えは、ユーザーが HTML メールとリッチ テキスト メールのどちらを送信しているかによって異なります。(これは通常、手動で形式を変更しない限り、メッセージの返信/転送が HTML か RTF かによって異なります。)

どちらの場合も、関心のあるメッセージの終わりを示すパターンを探し、そこで停止する必要があります。Instr()停止する必要がある場所を特定するために使用します。次に、「特定の単語」を探してテキストを解析しているときに、読んだ文字数を追跡し、マーカーに到達したら停止します。

リッチテキスト

"Item.Body ^p^p_ _ __ _ _ __ _ _ __ __ _ __ _ ___ ^ p "を探します

これは、VbCrLf の 2 つのインスタンス、Chr(95) の 46 のインスタンス、スペース、そして VbCrLf の別のインスタンスです。

HTML

ではItem.Body、トークンは「^p  _  ^p」です。

これは、1 つの VbCrLf、2 つのスペース、Chr(95) の 5 つのインスタンス、さらに 2 つのスペース、および別の VbCrLf です。

ではItem.HTMLBody、トークンは

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

そのトークンには、その前、2 つの行の間、および最後に VbCrLf があります。

于 2013-04-03T06:16:51.320 に答える