Автоматически удалять границы вокруг предупреждения в теле письма - PullRequest
0 голосов
/ 29 января 2020

Я только что столкнулся с той же проблемой, что и описанная в обсуждении, связанном с ниже, но с подвохом: моя организация добавила границу и подсветку к баннеру с предупреждением, добавленному во все внешние электронные письма.

Ссылочное обсуждение: Автоматически удалять предупреждение в теле письма

Я разработал код для вырезания текста, который пришлось разделить, поскольку исходный код 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 - это то, что нужно go, но я изо всех сил пытаюсь найти правильную команду.

1 Ответ

0 голосов
/ 29 января 2020

Вам необходимо удалить весь блок, содержащий это сообщение.

<div> и </div> подобны скобкам вокруг Html, которые указывают, что все между <div> и </div> должно быть рассматривается как блок. Автор Html может создать блок по любой из нескольких причин. Здесь автор хочет указать внешний вид блока. Поэтому <div style=xxxx>yyyy</div> говорит, что применить стиль xxxx к yyyy.

Ваш вопрос не включает конечный </div>. Если этот блок появляется в самом конце сообщения, человек, который кодировал это дополнение, мог пропустить </div, хотя это не очень хорошая практика. Скорее всего, вы не понимали, что конечный <\div> был важен.

Мой подход был бы:

  • Используйте InStr для поиска «Это сообщение отправлено…»
  • Используйте InStrRev для поиска в обратном направлении <div
  • Используйте InStr для поиска </div>
  • Удалите все между div и <\div>

Если вам нужен код, чтобы сделать это, я отправлю себе электронное письмо с этим блоком, чтобы я мог проверить код. Я не люблю публиковать непроверенный код.

Редактировать

Я написал и частично протестировал код для подхода, который предпочел бы. Я не полностью протестировал свой код, потому что я не понимаю ваш подход.

Насколько я понимаю, ваш университет добавляет предупреждение к электронным письмам, полученным из-за пределов университета. Это происходит до того, как письмо будет выпущено. Я ожидаю, что вы используете событие добавления элемента, но вы используете событие отправки элемента. Я не понимаю, как это даст вам эффект, который вы ищете.

Я создал электронное письмо, содержащее предупреждение, используя учетную запись gmail, и отправил его в свою учетную запись Outlook. Это электронное письмо выглядит так:

Initial appearance of email

Это не то же самое, что ваше предупреждающее сообщение, но оно достаточно близко для тестирования.

У меня есть подпрограмма диагностики c, которая выводит выбранные свойства выбранных электронных писем в Immediate Window или «все» свойства выбранных электронных писем в файл. Вывод для соответствующей части тела 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, содержащего предупреждение. Если вам нужна дополнительная информация о моей диагностике c, я с радостью ее предоставлю.

Код для обновления тела 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

Результат работает этот код:

Appearance of email after amendment

Это удалило все предупреждение, включая цветной прямоугольник, но оставило пробел. Этот код не может оставить пробел в вашем предупреждающем сообщении. Если в вашем сообщении есть пробел, вам, вероятно, потребуется удалить пустой абзац, а также блок Div. Мне нужно было бы увидеть Html до вашего "

...