替代`CreateObject("Outlook.Application")`?

Posted

技术标签:

【中文标题】替代`CreateObject("Outlook.Application")`?【英文标题】:Alternative to `CreateObject("Outlook.Application")`? 【发布时间】:2013-09-20 16:05:21 【问题描述】:

我的预期过程:

    这是在运行 Windows 2008 Server r2 的 VM 上 Windows 任务计划程序使用启动宏启动 Access 数据库。 VBA 脚本会生成并保存一些高度自定义的电子邮件。

问题:

当我手动打开数据库并运行脚本时,这个脚本工作得很好。但是当我使用该任务启动它时,我在以下行的第 2 行收到错误 429 'ActiveX component can't create object':

Dim OlApp As Outlook.Application
Set OlApp = CreateObject("Outlook.Application")

为什么在任务调度器启动时会抛出错误,但手动运行却正常?

关于任务:

    在“常规”选项卡上,我有以下设置: 一种。在我的帐户下 湾。拥有最高权限 C。仅当我登录时 操作本身会打开 Access 2010 aka Office14,并使用 DB 的路径和名称、/x 和宏名称作为参数。当我将其作为批处理文件运行时,没有问题。 我对这个操作系统或现代任务调度程序几乎一无所知,但我总是可以学习。

更新

找到一篇关于这个主题的MS Support 文章。它特别指出CreateObjectCoCreateInstance 如果以这种方式使用会出现上述错误消息。但是,没有给出替代方案。

有什么建议吗?

【问题讨论】:

【参考方案1】:

为我解决的问题是以管理员身份运行 Outlook

【讨论】:

【参考方案2】:

从 VBA 代码发送电子邮件时,我一直更喜欢使用 CDO,而不是尝试自动化 Outlook。有关通过 CDO 发送电子邮件的一些示例代码,请查看 here。

【讨论】:

请记住,CDO 1.21 已超过 10 年未更新,Outlook 不再安装(自 Outlook 2010 起) @DmitryStreblechenko 这可能是真的,但cdosys.dll 仍然包含在 Windows 的普通安装中(包括 64 位 Windows 上的 .dll 的 32 位和 64 位版本)。它可能不是最新的技术,但似乎仍然可以完成工作。 cdosys.dll 与 Outlook 无关:它允许您使用直接 SMTP 发送消息。虽然这对于某些用途可能很好,但最大的缺点是发送的邮件不会在 Outlook 的“已发送邮件”文件夹中创建/保存,除非您在代码中明确创建虚假邮件。【参考方案3】:

任何 Office 应用(包括 Outlook)都不能通过服务使用。即使任务可以与桌面交互,COM 系统也不会让您连接到正在运行的 COM 对象(Outlook 是单例),因为安全上下文不同。

您可以使用扩展 MAPI(C++ 或 Delphi)、CDO 1.21(已弃用且不再更新或安装)或 Redemption(使用 RDO 对象系列) - 所有这些都将扩展 MAPI 系统加载到-proc 而不是连接到进程外 COM 对象(由 Outlook.exe 公开)。

【讨论】:

赎回听起来很有希望,特别是因为它可以与 Exchange 一起使用。或者,我可以让任务调度程序将其作为常规桌面程序运行吗?无需将其作为服务运行。 任务计划程序可能工作也可能不工作,根据我的经验,这完全取决于 Outlook/Windows 版本和 UAC。【参考方案4】:

我找到了解决您的问题的方法,VBScript 解释器 (cscript.exe/wscript.exe) 带有一个 64 位版本的 Windows 和一个 32 位版本。

我所做的是安装 Office x86,然后卸载,然后从任务计划程序安装 x64 测试电子邮件,然后我重新安装 x86。每次安装和卸载后我都重新启动。当您安装 x64 和 x86 版本的 office 时,它​​将同时安装 cscript.exe/wscript.exe x86 和 x64 版本。最后允许您从任务计划程序发送邮件(在 Windows 10 上测试)。

谢谢

【讨论】:

以上是关于替代`CreateObject("Outlook.Application")`?的主要内容,如果未能解决你的问题,请参考以下文章

vba createobject函数 报错

关于QTP报错“缺少对象WScript” Set WshShell=WScript.CreateObject ("WScript.Shell"),提示缺少对象

Vbs Popup CreateObject("Wscript.Shell").Popup 怎么只能在开头用吗?

更新到 Office 2016 后的 VBA 脚本错误 (CreateObject("System.Collections.ArrayList"))

CreateObject("SAPI.SpVoice").Speak"i love you"

Set fso = Server.CreateObject("Scripting.FileSystemObject")