转发电子邮件并附加其他文本而不会丢失原始邮件的格式

时间:2012-05-04 14:26:02

标签: email vba outlook-vba

我正在尝试转发我收到的电子邮件,并在其上添加其他消息。我写的以下代码有点这样做,但我丢失了原始邮件的所有格式。有没有办法维护原始邮件的格式,并且能够在电子邮件中附加额外的测试?

我的代码:

Sub xForward()
    myMessage = "You recently requested access to the table.   We are requiring all requests to complete a mandatory training session." & vbCr & vbCr & "Thank you, " & vbCr & "Ricky"

    Dim itmOld As MailItem, itmNew As MailItem

    Set itmOld = ActiveInspector.CurrentItem
    Set itmNew = itmOld.Forward

    itmNew.Body = myMessage & vbCr & vbCr & itmOld.Body
    itmNew.Subject = "Access Request"
    itmNew.Display

    Set itmOld = Nothing
    Set itmNew = Nothing
End Sub

如果我不更新itmNew的主体,那么我维护原始消息的格式。我更新itmNew.Body的那一刻,那么itmOld.Body是用简单的文字写的,我丢失了所有的格式。

1 个答案:

答案 0 :(得分:0)

我认为JP的评论指出了你正确的方向,但我认为你的问题源于对HTML的有限知识。这不是关于HTML的完整教程,但我希望它能让你开始。

如果您使用Debug.Print将.HTMLBody输出到即时窗口,您将看到如下内容:

  

<!DOCTYPE html PUBLIC“ - // W3C // DTD XHTML 1.0 Transitional // EN”   “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> < HTML   的xmlns = “http://www.w3.org/1999/xhtml” > < HEAD>

     

这里有很多东西

     

< /头> <身体GT;

     

这里有很多东西

     

< /体> < / HTML>

如果创建消息的包支持HTML的XML版本,您将只获得“<!DOCTYPE html ...”。您应该看到的最小值是:

  

< HTML>< HEAD>这里有很多东西< / head>< body>很多   这里的东西< / body>< / html>

如果您将额外的消息放在前面或末尾,那么您就违反了HTML规则。会发生什么将取决于接收者的电子邮件包的宽容程度。要符合HTML规则,您必须将额外消息放在“< body>”之间的某处和“< / body>”。

如果您查看一些消息,您会看到它们可以变化多少。有些将是白色的黑色文字,黑色的一些白色文字,两者之间的每个变化。无论作者的消息是什么,您的消息都必须是可读的。我的建议是你在顶部创建一个单元格表,然后设置字体和背景颜色。尝试以下操作,然后根据您的要求进行调整:

Dim AddedMsg As String
Dim Pos As Long

' Create message to be inserted
' =============================
' Start a table with white background and blue text
AddedMsg = "<table border=0 width=""100%"" style=""Color: #0000FF"" bgColor=#FFFFFF>"
' Add row with single cell
AddedMsg = AddedMsg & "<tr><td><p>Cool stuff you must see!!</p></td></tr>"
' End table
AddedMsg = AddedMsg & "</table>"

' Code to add message once you have checked there is an HTML body    
'================================================================
Pos = InStr(1, LCase(.HTMLBody), "<body")
If Pos = 0 Then
  ' This should be impossible.
  Call MsgBox("<Body> element not found in HTML body", vbCritical)
  ' Code to handle impossible situation
End If
Pos = InStr(Pos, .HTMLBody, ">")
If Pos = 0 Then
  ' This should be impossible.
  Call MsgBox("Terminating > for <Body> element not found in HTML body", vbCritical)
  ' Code to handle impossible situation
End If
'Insert your message
.HTMLBody = Mid(.HTMLBody, 1, Pos) & AddedMsg & Mid(.HTMLBody, Pos + 1)