【问题标题】:Automatically Remove Border Around Warning in Email Body自动删除电子邮件正文中警告周围的边框
【发布时间】:2020-01-31 20:46:20
【问题描述】:

我刚刚遇到了与下面链接的讨论中描述的相同的问题,但有一个问题:我的组织在所有外部电子邮件上添加的警告横幅上添加了边框和突出显示。

参考讨论: Automatically Remove Warning in Email Body

我已经开发了去除文本的代码,由于 HTML 源代码对警告横幅的某些部分使用了不同的格式,因此必须将其拆分:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

     Item.HTMLBody = Replace(Item.HTMLBody, "Attention:", "")
     Item.HTMLBody = Replace(Item.HTMLBody, "This email originated from outside the university.", "")

End Sub

这会留下一个带有棕色边框和棕褐色突出显示的空横幅。所有这些都以 HTML 代码的形式添加到消息中,但我不知道如何让 VBA 在 HTML 级别进行搜索。我想修改上面的内容,而不是从邮件正文中删除以下 HTML:

<div style=3D"border:solid #9C6500 1.0pt;padding:2.0pt 2.0pt 2.0pt 2.0pt">
<p class=3D"MsoNormal" style=3D"line-height:11.0pt;background:#FFEB9C"><b><=
span style=3D"font-size:9.0pt;color:#9C6500">Attention:</span></b><span sty=
le=3D"font-size:9.0pt;color:black"> This email originated from outside the =
university.<o:p></o:p></span></p>

VBA 可以在 HTML 级别进行编辑,即修改源代码吗? HTML 代码的第一行是需要执行的,但我正在努力寻找正确的命令。

【问题讨论】:

  • 您是如何从电子邮件中提取这块 Html 的?我问是因为这个 Html 不太有效。我怀疑“3D”最初是“&3D;”。第 2、3 和 4 行末尾的“=”不应该在那里。

标签: vba email outlook


【解决方案1】:

您需要删除包含此消息的整个块。

&lt;div&gt; 和 &lt;/div&gt; 就像一些 Html 周围的括号,指定 &lt;div&gt; 和 &lt;/div&gt; 之间的所有内容都将被视为一个块。 Html 的作者可能出于多种原因创建块。在这里作者要指定块的外观。所以&lt;div style=xxxx&gt;yyyy&lt;/div&gt; 说应用样式xxxx 到yyyy。

您的问题省略了结尾的&lt;/div&gt;。如果此块出现在消息的最后,则编写此添加代码的人可能省略了&lt;/div,尽管这不是一个好的做法。更有可能的是,您没有意识到结尾的 &lt;\div&gt; 很重要。

我的做法是:

  • 使用InStr 搜索“此消息源自...”
  • 使用InStrRev 向后搜索&lt;div
  • 使用InStr 搜索&lt;/div&gt;
  • 删除div 和&lt;\div&gt; 之间的所有内容

如果您需要代码来执行此操作,我将向自己发送一封包含此块的电子邮件,以便我可以测试代码。我不喜欢发布未经测试的代码。

编辑

我已经为我喜欢的方法编写并部分测试了代码。我没有完全测试我的代码,因为我不明白你的方法。

据我了解,贵校在从校外收到的电子邮件中添加了警告。这发生在电子邮件发布给您之前。我希望您使用 Item Add 事件,但您正在使用 Item Send 事件。我不明白这会给你带来你想要的效果。

我使用 gmail 帐户创建了一封包含警告消息的电子邮件,并将其发送到我的 Outlook 帐户。该电子邮件的外观是:

这与您的警告消息不同,但它足够接近测试。

我有一个诊断例程,它将选定电子邮件的选定属性输出到即时窗口,或将选定电子邮件的“所有”属性输出到文件。 Html 正文相关部分的输出为:

                                                                                                  <di|
|v style='mso-element:para-border-div;border:solid windowtext 1.0pt;padding:1.0pt 4.0pt 1.0pt 4.0pt'>|
|<p class=MsoNormal align=center style='text-align:center;border:none;padding:0cm'><span style='font-|
|family:"inherit",serif;color:#303336;border:none windowtext 1.0pt;padding:0cm;background:aqua;mso-hi|
|ghlight:aqua;mso-fareast-language:EN-GB'>This email originated from outside the university.</span><o|
|:p></o:p></p></div>

我已经从输出中删除了所有内容,除了包含警告的 DIV 块。如果您想了解有关我的诊断程序的更多信息,我很乐意提供。

更新Html正文的代码是:

Sub RemoveWarning(ByRef ItemCrnt As MailItem)

  Dim LcHtmlBody As String
  Dim PosDivEnd As Long
  Dim PosDivStart As Long
  Dim PosMessage As Long

  With ItemCrnt

    ' Check message contains warning
    PosMessage = InStr(1, .HtmlBody, "This email originated from outside the university.")
    If PosMessage = 0 Then
      ' No message found
      Exit Sub
    End If

    ' Find start and end div
    LcHtmlBody = .HtmlBody   ' Allow for "<DIV" and "<div"
    PosDivStart = InStrRev(LcHtmlBody, "<div", PosMessage)
    PosDivEnd = InStr(PosMessage, LcHtmlBody, "</div>")
    If PosDivStart = 0 Or PosDivEnd = 0 Then
      ' Start div or end div or both not found
      Exit Sub
    End If

    ' Delete Div block from Html
    .HtmlBody = Mid$(.HtmlBody, 1, PosDivStart - 1) & Mid$(.HtmlBody, PosDivEnd + 6)

  End With

End Sub

运行这段代码的结果是:

这已删除整个警告,包括彩色框,但留下了一个空白。此代码可能不会与您的警告消息有任何差距。如果它确实与您的消息有差距,您可能需要删除一个空段落以及 Div 块。在我推荐如何扩展我的代码之前,我需要在您的“

【讨论】:

  • 谢谢,是的,我忘记了
    。我从 Thunderbird 中弹出的源视图中复制了文本,但我错过了最后一行。看起来 Thunderbird 附加了 = 作为换行符。我同意 = 不应该在那里,我在 Outlook 中有缺少它的源视图。 3D 的东西也是 Thunderbird 的神器。
  • 实际 HTML 内容为:

    注意: 这封邮件来自校外。

  • 我的大问题是替换命令中的双引号,例如 Item.HTMLBody = Replace(Item.HTMLBody, "
    ", "") 。如果我尝试插入其中包含“的 HTML 代码,这将不起作用。这就是我被卡住的地方。我是否需要为每个“使用 & Chr(34) & 之类的东西?如果我可以学习如何在字符串中输入双引号,我想我可以得到这个。我错过了一些我从未学过的语法。
  • 如果要在字符串中使用双引号,则包括两个。例如:对于 "
    " 使用 "
    "。试试看;这是一个标准的 VBA 功能。
  • 我仍然认为一次性删除整个块会更容易。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签