我正在尝试使用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:代码适用于我朋友的计算机,但不适用于我的
答案 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中,这将是完美的。所有其他解决方案都很糟糕,我尝试了所有这些:)