【问题标题】:Automatic signatures in Emails with Access-Outlook macros带有 Access-Outlook 宏的电子邮件中的自动签名
【发布时间】:2017-07-10 07:29:21
【问题描述】:

我正在尝试组合一个群发电子邮件宏,该宏将遍历一个表格,提取电子邮件和收件人姓名。出于品牌推广的目的,我想发送带有签名的每封电子邮件。

我正在尝试使用 MailItem 对象,但我一直遇到 2 个问题:

  1. .display 创建一个新的 Outlook 电子邮件并使用默认签名填充它。但是,.body 将使用 strMessage 中的文本字符串擦除签名。我猜是因为我不能在同一个电子邮件对象中同时拥有表格(包括图片等)和字符串?

  2. 我已经在 Microsoft Outlook 15 和 16 对象库上尝试了 .send 和 .body 方法。虽然两者都在 16 上工作,但在 15 中似乎都不存在。我总是得到一个“应用程序定义的或对象定义的错误”。我找不到任何有关 Outlook 15 库的文档,有人知道 15 的哪些方法等效于 .send 和 .body 吗?

    Dim OApp As Object, OMail As Object, signature As String
    Set OApp = CreateObject("Outlook.Application")
    Set OMail = OApp.CreateItem(0)
    
    Dim rs As DAO.Recordset
    Dim db As Database
    Dim strSQL As String, strFirstName As String, strLastName As String, strFullName As String, strSubject As String, strMessage As String
    
    Set db = CurrentDb
    
    strSQL = "SELECT Email, FirstName, LastName FROM PersonsT WHERE [PersonsT]![Attended]=True"
    
    Set rs = db.OpenRecordset(strSQL)
    
    Do While Not rs.EOF
    strFirstName = rs.Fields("FirstName")
    strLastName = rs.Fields("LastName")
    strFullName = rs.Fields("FirstName") & " " & rs.Fields("LastName")
    
    strSubject = "Greetings"
    strMessage = "Hello " & strFullName & vbNewLine & vbCrLf & " Let me be the first to congratulate you on registering in this program"
    
    With OMail
    .Display
    End With
    
    With OMail        
        .to = rs![Email]
        .Subject = strSubject
        .body = strMessage
        .send     
    End With
    
    rs.MoveNext
        Loop
    
            Set OMail = Nothing
            Set OApp = Nothing
    
            rs.Close
            Set rs = Nothing
    

【问题讨论】:

  • 试试.body = strMessage & vbCrLf & .body
  • 如果您的 Outlook 有多个签名文件可供选择,请创建 Word App,使用oWordApp.EmailOptions.EmailSignature.NewMessageSignature = <SignatureFilename> 更改签名和/或恢复原始签名。在 Outlook 应用程序发送之前执行此操作将使用 html 签名,该签名可以在表格等中包含图像和内容。
  • @TimWilliams 不走运。我尝试隔离 .body ,它也产生了应用程序定义或对象定义的错误。

标签: string vba email ms-access outlook


【解决方案1】:

考虑使用 MailItem 的 GetInspector() 属性预先检索签名文​​本,然后连接到邮件正文。渲染可能会有所不同,因此请在两行中尝试 .HTMLBody 而不是 .Body

...
Dim signature As String

oMail.GetInspector
signature = oMail.Body

With OMail        
    .Recipients.Add rs![Email]
    .Subject = strSubject
    .Body = strMessage & signature
    .Display     
End With

【讨论】:

  • 您好。此代码在我的机器上使用库 16,但在 15 上,它仍然会产生应用程序定义或对象定义的错误。
  • Outlook 2013 对应版本 15,Outlook 2016 对应版本 16。您是否同时安装了两个 Outlook 版本?我只安装了 2013 年,所以我向你保证这在 15 年有效。
  • 我在另一台机器上安装了 Office 2016,并且正在使用 Office 2013 与我的主机并行测试代码。.send 功能是否也适用于基于 2013 的机器?
  • 是的,.Send 有效。除此之外,是否有任何邮件从 MS Access 运行?也许你需要修复 Outlook。
  • SendObject 功能齐全,但不幸的是它无法填充签名。我已经在我同事的几台 PC 上尝试了该代码,但没有成功,所以我不认为这可能只是我的 Outlook 库出现问题。我会问我们的 IT 人员,看看他是否知道我们没有考虑到的事情。
【解决方案2】:

这适用于各种风格的 Outlook,并使用后期绑定,因此版本/引用不应该成为问题。

Dim OutApp          As Object
Dim OutMail         As Object
Dim signature       As String

Set OutApp = CreateObject("Outlook.Application")
OutApp.Session.Logon
Set OutMail = OutApp.CreateItem(0)
On Error Resume Next
With OutMail                               ' This creates a blank email and captures the users default signature.
    .BodyFormat = 2                        'olFormatHTML
    .Display
End With

signature = OutMail.HTMLBody

【讨论】:

  • 抱歉回复晚了,我完全错过了这个回复。我在此宏的早期版本中使用 Outlook 应用程序,但发现设置任何类型的 .body(我相信会以纯文本形式输入)都会擦除签名。我认为这是因为签名中有表格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
相关资源
最近更新 更多