【问题标题】:Inserting Signature into Outlook email from Excel VBA从 Excel VBA 将签名插入 Outlook 电子邮件
【发布时间】:2022-05-04 04:33:48
【问题描述】:

我正在尝试使用 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

编辑:我尝试用.Body 替换.HTMLBody。这行得通,但显然去掉了签名的 HTML 格式

编辑 2:该代码在我朋友的计算机上有效,但在我的计算机上无效

【问题讨论】:

    标签: excel vba outlook signature


    【解决方案1】:

    解决了。只需重新启动 Outlook 即可解决。

    【讨论】:

    • 我猜这似乎是 Outlook/Excel 连接中的一个错误。即使进行了上述修复,我有时也会收到错误消息。最终的解决方案是 Outmail.Display 几次(即在每次签名更改/插入等之前和之后。
    【解决方案2】:

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

    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 值....

    您也可以在 Locals Window 中获得相同的简单扩展 mymail 对象!

    【讨论】:

    • 这对我来说非常有用。 .Display 调用似乎完成了空白电子邮件的格式化,包括签名的拉入。您可以获取该空白消息的 HTMLBody 属性(然后是页面长度的字符串)并用您自己的内容替换空白正文的内容。在我的例子中,空白正文显示为元素&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;。我只是拆分了巨大的字符串并用我的内容替换了&amp;nbsp;。谢谢,弗雷德里科!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可以从 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
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 从那以后我一直在成功使用我的电子邮件,我每天使用 Outmail.Display 多次发送相同的电子邮件(和其他电子邮件)都没有问题。虽然朋友不需要 Outmail.Display 来工作。
        猜你喜欢
        • 2016-02-05
        • 1970-01-01
        • 2015-03-23
        • 2018-03-25
        • 1970-01-01
        • 2016-07-12
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多