6

我有这种情况:

  • 代码必须在 VBScript 中(不在我的控制范围内)
  • 无法在 Outlook 首选项中禁用编程访问限制(组策略,而不是管理员,并且 Windows 无法识别已安装的有效病毒扫描程序)
  • 不能使用 SMTP,因为它是不允许的。

我认为没有办法使用 Outlook 以自动方式发送电子邮件(在无人看管的盒子上以屏幕锁定的用户身份登录)。我尝试了许多不同的方法,但总是会收到安全警告消息。我怎样才能解决这个问题?

我已经在这个有用的网站上尝试了所有方法,并消除了每个选项,如下所示:

策略
理想情况下,自动化 Outlook 的应用程序应该避免触发这些安全提示的代码。

正是我最终做的事情(请参阅下面的答案),这就是为什么该页面上的所有其他选项都不相关的原因。让我们一一来看:

发送消息
如果您的目标只是创建和发送电子邮件消息,则根本不需要使用 Outlook 对象。Microsoft 提供了用于使用 SMTP 创建和发送消息的 CDO for Windows 库。使用此库完全绕过 Outlook 和 MAPI,并且不会触发安全提示。有关代码示例,请参阅...

SMTP。不行。网络策略不允许。

对于所有可能触发安全提示的代码,请使用扩展 MAPI 而不是 Outlook 对象、简单 MAPI 或 CDO 1.21。

扩展的 MAPI 可能会起作用,但它非常繁琐和冗长,并且涉及大量 C/C++ 代码(这不是这个问题的主题;见上文),并且在不提示用户输入密码的情况下似乎无法使用它。

对所有可能触发安全提示的代码使用第三方库——Redemption 或 MAPI33。这种方法比使用扩展 MAPI 更容易,后者具有陡峭的学习曲线,并且几乎同样安全。这些库还提供其他功能来帮助处理 Outlook 代码项目。

第三方库的问题有四个方面: - 他们花钱;- 即使它们是免费的,它们也会引入许可问题(一些组织在允许软件进入生态系统之前需要律师的广泛审查);- 整个问题甚至令人担忧的大多数环境是用户无法在 Outlook 选项中禁用编程访问警告的环境。嗯,那些可能的情况是什么?会不会是……企业环境? 在企业环境中采购软件需要很长时间,以至于不切实际,除非使用它所节省的成本将超过数百万美元。但是,可以进行许多实际的流程改进,这些改进不会产生那么高的成本节约,但如果需要软件采购,采购第三方软件所花费的金钱和劳动力将超过总节约成本。- 网络管理员可能不相信该软件驻留在系统上,因为它可能被用于恶意目的。

使用您的应用程序部署一个工具来抑制安全提示。

这假设抑制OMG 提示是必要的,在我的情况下,它不是,只是发送一封简单的电子邮件(见我的回答)。

对于 Outlook 2007,请确保计算机正在运行最新的防病毒应用程序并使用 Outlook 对象进行所有编码,避免使用 CDO 1.21 和简单 MAPI 代码。

病毒扫描程序是最新的,但我完全无法控制更改其版本或供应商,并且 Outlook 无法识别它。它说:“防病毒状态:无效。此版本的 Windows 支持防病毒检测,但未找到防病毒。”

在 Outlook 自定义表单代码、Outlook VBA 代码和 COM 加载项中,从 VBA 或加载项体系结构提供的 Outlook.Application 对象派生所有对象。例如,请参阅下面的示例 VBA“运行脚本”规则过程。

有趣,可能有用,但不是必需的。这对在 Outlook 中设置规则以部署软件产生了不必要的依赖,这使部署复杂化。

部署“信任”某些 COM 加载项或允许所有应用程序不受限制地访问某些功能(例如访问地址)的 Outlook 安全设置。在 Outlook 2007 之前的版本中,这需要 Microsoft Exchange Server。对于 Outlook 2007,请参阅下面有关版本特定注意事项的部分。

繁琐:安装 COM 插件需要管理权限,并且在某些组织中很难通过管理权限获得。

在以 Exchange 为电子邮件服务器的企业环境中,可以通过从 Exchange 2000 开始的 WebDAV API 以及从 Exchange 2007 开始的 Exchange Web 服务直接访问服务器上的数据。

在我的环境中禁用,可能还有其他环境。

在公司环境中,管理员可以选择为部分或所有用户放松 Outlook 安全性。

当然可以,但这需要与网络团队进行沟通/协调/合作。如果管理访问不可用于安装 COM 插件,则它也可能不可用于放松组策略。

4

2 回答 2

11

此代码适用于我的带有 Outlook 2010 的系统,无需用户交互即可发送电子邮件。它有点脆弱,因为如果用户在撰写邮件时碰巧在系统上积极工作(打字、点击),则可能会发生用户输入进入弹出窗口的瞬间,并且要么干扰邮件的发送,要么在邮件正文中添加额外的未知字符。

只要在其系统上运行此功能的用户意识到这一点,并且虚假击键干扰的潜在后果不是关键业务,此功能是可以接受的。

需要注意的重要一点:这个解决方案的关键是我们不调用该MailItem.Send方法。这是触发程序访问保护的方法。相反,我们触发ALT+s快捷方式,默认情况下,当邮件窗口在 Outlook 中具有焦点时,按下“发送”按钮。如果您启用了默认的拼写检查提示,则会弹出进一步的拼写检查提示。我们的解决方案是禁用拼写检查提示,尽管我相信您可以添加更多 SendKeys 来单击它,因为拼写检查提示不是与安全相关的对话框。

关于 UIPI(用户界面特权隔离)的说明:

Outlook 2010 以登录系统的用户身份运行,具有中等完整性级别。由 Windows 资源管理器启动的程序,或作为以类似方式启动的程序的子程序或后代启动的程序,也将以中等完整性级别启动。UIPI 对防止“SendKeys”类型输入无效,只要用户和会话 ID 匹配,并且完整性级别相同或更高。在我的特定环境中,用户和会话 ID 相同,VBScript 宿主进程和 Outlook 进程的完整性级别相同。在您的环境中,如果其中任何一个条件为假,则此代码将不起作用。它还在比 2010 版更早或更高版本的 Office 上未经测试。

Sub SendEmail_Outlook()
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set ol=CreateObject("Outlook.Application") 
    Set Mail=ol.CreateItem(0) 
    Mail.to= "you@example.com"
    Mail.Subject = "test"
    Mail.HTMLBody = "test"
    Mail.Display    
    WshShell.SendKeys "%s"
    Set Mail = Nothing 
    Set ol = Nothing 
End Sub

SendEmail_Outlook

此外,这里是从 Windows 任务计划程序运行 VBScript 时如何使这项工作。只需勾选红色椭圆所描绘的框“以最高权限运行”,以使其在没有 UAC 提升的情况下以可能的最高完整性级别运行(如果您不是管理员帐户,则为“中”)。

windows任务调度程序属性

于 2013-02-15T16:14:09.290 回答
0

几个选项:

  1. 最新的防病毒软件(此时 Outlook 不会显示提示)
  2. 扩展 MAPI(C++ 或 Delphi,不适用于 VB 脚本)。但是,您可以使用像Redemption这样的包装器,它使用扩展 MAPI,但可以从包括 VBS 在内的任何语言访问。
  3. ClickYes 之类的产品。

有关讨论和可用选项列表,请参见http://www.outlookcode.com/article.aspx?id=52 。

于 2016-02-26T23:26:33.867 回答