从Excel VBA将签名插入Outlook电子邮件

时间:2014-03-06 18:45:01

标签: excel vba outlook signature

我正在尝试使用VBA for Excel自动化一些电子邮件。到目前为止,一切都很好,除了试图在电子邮件中保留我的签名。

告诉VBA创建新电子邮件后,它将包含您的默认签名。如果您尝试Outmail.Display,就可以看到这一点。但是,如果您覆盖.HTMLBody属性,它将被删除。

我的简单尝试是将.HTMLBody的内容保存到signature(字符串),然后将其重新分配给.HTMLBody,以便对其进行测试。但是,由此产生的电子邮件将没有任何签名。

复制并重新插入签名的代码:

Dim myOlApp As Outlook.Application
Dim MyItem As Outlook.MailItem

Dim signature As String


Set myOlApp = CreateObject("Outlook.Application")
Set Outmail = myOlApp.CreateItem(0)

signature = Outmail.HTMLBody
Outmail.HTMLBody = signature

Outmail.Display

显示自动插入签名的代码:

Dim myOlApp As Outlook.Application
Dim MyItem As Outlook.MailItem 
Set myOlApp = CreateObject("Outlook.Application")
Set Outmail = myOlApp.CreateItem(0)
Outmail.Display

修改:我尝试将.HTMLBody替换为.Body。这很有效,但显然会取出签名的HTML格式

编辑2:代码适用于我朋友的计算机,但不适用于我的

5 个答案:

答案 0 :(得分:1)

解决。只需重新启动Outlook解决了它。

答案 1 :(得分:0)

另一个可能的解决方案是直接从Windows存储它的目录中获取签名并将其附加到正文。 Microsoft MVP在此处解释了(有点冗长)的过程:https://www.rondebruin.nl/win/s1/outlook/signature.htm

答案 2 :(得分:0)

我用这个技巧解决了这个问题:

Set myOutlook = CreateObject("Outlook.Application")
Set tempMail = myOutlook.CreateItem(olMailItem)

With tempMail
  ' Trick to preserve Outlook default signature
  ' MailItem need to be displayed to be "fully created" as object (maybe VBA bug)

  .Display
  HTMLBody = .HTMLBody
  .Close olDiscard

  ' --- Trick to split HTMLBody into Head and Signature ---
  ' Search for the position of the tag before signature
  bodyTag = "<body"
  PosBody = InStr(HTMLBody, bodyTag)
  pTag = "<o:p>"
  PosSignature = InStr(PosBody, HTMLBody, pTag)

  Head = Left(HTMLBody, PosSignature - 1)
  Signature = Right(HTMLBody, Len(HTMLBody) - PosSignature + 1)

End With

然后,您可以简单地将HTML文本放在Head和Signature之间:

Set myOutlook = CreateObject("Outlook.Application")
Set myMail = myOutlook.CreateItem(olMailItem)

With myMail
  .To = Recipients
  .Subject = Subject
  .CC = CC
  .HTMLBody = Head & "Here the HTML text of your mail" & Signature
End With

我认为这是一种VBA错误:如果您不使用.Display方法,则不会“完全”创建MailItem对象。

尝试放置一个制动点,并在.Display方法行之前和之后查看立即窗口(Ctrl + G)上的?mymail.HTMLbody值....

您还可以在“本地窗口”中获取相同的简单扩展mymail对象!

答案 3 :(得分:0)

您可以从Signatures文件夹中读取签名文件(请记住文件夹名称已本地化)并将其与邮件正文合并(您不能简单地连接两个格式良好的HTML文档并获取有效的HTML文档)。您还需要注意签名样式和图像 - 它们必须单独处理。

您还可以显示消息(Outlook在显示消息时使用签名填充未修改的消息正文),然后读取HTMLBody属性并关闭检查器(闪烁是不可避免的)。如果要显示该消息,请先显示该消息,以便Outlook插入签名,然后再添加数据(需要插入,而不是连接)。

如果使用Redemption是一个选项,它会公开RDOSignature对象。您可以使用其ApplyTo方法将任何签名插入任何消息中。

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Drafts = Session.GetDefaultFolder(olFolderDrafts)
set Msg = Drafts.Items.Add
Msg.To = "user@domain.demo"
Msg.Subject = "testing signatures"
Msg.HTMLBody = "<html><body>some <b>bold</b> message text<br></body></html>"
set Account = Session.Accounts.GetOrder(2).Item(1) 'first mail account
if Not (Account Is Nothing) Then
  set Signature = Account.NewMessageSignature
  if Not (Signature Is Nothing) Then
    Signature.ApplyTo Msg, false 'apply at the bottom
  End If
End If
Msg.Display

答案 4 :(得分:-1)

剪切签名的html源(例如在编辑器或mozilla中 - 源视图),然后将其复制到单元格中。然后你可以将单元格的值添加到.htmlbody中,这将是完美的。所有其他解决方案都很糟糕,我尝试了所有这些:)