在 excel vba 上发送大量电子邮件,OLE 问题

Sending Massive emails on excel vba, OLE issue

希望你一切顺利。

我正在使用此代码在 VBA Excel 中发送电子邮件,但它只能使用一次,然后我必须在任务管理器上关闭 Outlook。如果我不这样做,我会收到一条消息,指出“Microsoft Excel 正在等待另一个应用程序完成 OLE 操作”。我唯一要做的就是关闭任务管理器上的 Outlook 应用程序,然后它就可以正常工作了。

你能帮我解决这个问题吗?下面我将post我的代码

Dim email As Outlook.MailItem
Dim direc As String
Dim body As String
Set A = New Outlook.Application

For i = 2 To ActiveSheet.Cells(Rows.Count, 16).End(xlUp).Row
direc = Worksheets("NewSheet").Cells(i, 16).Value

Set email = A.CreateItem(emailItem)
    With email
    direc = Worksheets("NewSheet").Cells(i, 16).Value
        If (direc <> "0") Then
            .To = direc
            .Subject = "Notification Test"
            body = Worksheets("NewSheet").Cells(i, 14)
            .HTMLBody = "<HTML><BODY style=font-size:11pt;font-family:Calibri>This is a notification reminder to let you know that you have <b>" & body & "</b> open contact(s) that you must Update</BODY><br><br>Best Regards, </br></br><br> Anonymous </br></HTML>"
            .Display
            .Send
        End If
    End With
Next i

非常感谢您的宝贵时间和帮助。

不调用同时显示发送。去掉 Display 行。

我建议尝试 运行 Outlook VBA 环境中的代码,以确保该问题与发送电子邮件时的安全问题无关。事实上,当使用自动化调用受保护的属性或方法时,Outlook 对象模型会产生安全问题或向用户提供安全提示。或者可以尝试通过以下方式调用 Save 而不是 Send

Set email = A.CreateItem(emailItem)
    With email
    direc = Worksheets("NewSheet").Cells(i, 16).Value
        If (direc <> "0") Then
            .To = direc
            .Subject = "Notification Test"
            body = Worksheets("NewSheet").Cells(i, 14)
            .HTMLBody = "<HTML><BODY style=font-size:11pt;font-family:Calibri>This is a notification reminder to let you know that you have <b>" & body & "</b> open contact(s) that you must Update</BODY><br><br>Best Regards, </br></br><br> Anonymous </br></HTML>"
            .Save
        End If
    End With
Next i

如果此代码工作正常,则说明存在安全问题。

当您尝试自动化 Outlook 时,Send 方法可能会引发异常。在这种情况下,您很可能遇到了 Outlook 安全问题。如果您尝试访问任何受保护的 属性 或方法,它也可能是 Outlook 发出的提示。但在您的情况下,这可能是异常或错误。您获得安全 prompts/exceptions 因为 Outlook 是通过以下方式之一在客户端计算机上配置的:

  • 使用默认的 Outlook 安全设置(即没有设置组策略)
  • 使用组策略定义的安全设置,但未应用编程访问策略
  • 使用由组策略定义的安全设置,该设置设置为在防病毒软件处于非活动状态或已过期时发出警告

如果系统上安装了任何最新的防病毒软件,您可以创建一个组策略来防止显示安全提示,或者只是关闭这些警告(不推荐这样做)。

Security Behavior of the Outlook Object Model 文章中阅读更多相关信息。

您还可以考虑使用构建 Outlook 且不会产生安全问题的低级代码 - Extended MAPI。考虑在 API 周围使用任何第三方包装器,例如 Redemption.

另一个选项是 Outlook Security Manager,它允许在 运行 时间即时抑制 Outlook 安全问题。