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

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

一旦你告诉VBA创build一个新的电子邮件,它将已经包含你的默认签名。 这可以看出,如果你尝试Outmail.Display 。 但是,如果您覆盖.HTMLBody属性,它将被删除。

我简单的尝试是将.HTMLBody的内容保存为signature (string),然后将其重新分配给.HTMLBody ,以便.HTMLBody进行testing。 但是由此产生的电子邮件将无效签名。

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

 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 

编辑:我试图用.HTMLBodyreplace.Body 。 这工作,但显然拿出签名的HTML格式

编辑2:代码适用于我的朋友的电脑,但不是我的

解决了。 简单地重新启动Outlook解决了它。

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

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

 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对象不是“完全”创build的。

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

你也可以简单地在本地窗口中扩展mymail对象。

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

您还可以显示消息(Outlook在消息显示时使用签名填充未修改的消息主体),然后读取HTMLBody属性并closures检查器(闪烁是不可避免的)。 如果您想要显示邮件,请首先显示邮件,以便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 

剪下签名的html源代码(例如在编辑器或者mozilla-source视图中),然后将其复制到一个单元格中。 那么你可以将这个单元格的值添加到你的.htmlbody中,并且是完美的。 所有其他的解决scheme是可怕的,我试过他们所有:)

    Interesting Posts