如何在使用VBScript发送Outlook邮件时避免Outlook安全警告?

6
我有这个情况:
  • 代码必须使用VBScript(超出我的控制范围)
  • 无法在Outlook首选项中禁用程序访问限制(组策略,不是管理员,并且Windows无法识别已安装的有效病毒扫描器)
  • 不能使用SMTP因为它被禁止了。

我认为没有办法以自动化的方式(在一个已登录用户并锁定屏幕的未监管的框中)使用Outlook发送电子邮件。我尝试了许多不同的方法,但总是会收到安全警告消息。我该怎么办?

我已经尝试了有用的网站上的所有内容,并根据以下方式消除了每个选项:

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

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

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

SMTP。无法使用。被网络策略禁止。

对于所有可能触发安全提示的代码,请使用扩展MAPI而不是Outlook对象、Simple 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 2007之前的版本中,这需要Microsoft Exchange Server。有关Outlook 2007,请参见下面特定版本的注意事项部分。

繁琐:需要管理员访问权限才能安装COM添加项,而在某些组织中很难获得管理员访问权限。

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

在我的环境中被禁用,也可能在其他环境中被禁用。

在企业环境中,管理员可以选择放宽一些或所有用户的Outlook安全性。

当然,这需要与网络团队进行沟通/协调/合作。如果没有管理访问权限来安装COM插件,则可能也没有放松组策略的权限。


1
我认为Outlook Redemption会比sendkeys更安全,因为它是免费的,并且在所有环境下都可以使用,而sendkeys通常被视为最后的解决方案。 - Fionnuala
更安全,是指更可靠吗?对于需要分发的东西来说是的。但对于一个具有固定、众所周知、静态配置的盒子来说,这很好。此外,在我的环境中获取和部署Redemption(因为它需要花钱)完全抵消了任何潜在的收益。 - allquixotic
免费版的Redemption可供非商业使用。对于商业环境而言,使用sendkeys可能会导致灾难性的后果,风险太大,不宜冒险尝试。 - Fionnuala
1个回答

11

这段代码适用于我的系统,可以使用Outlook 2010发送电子邮件而无需用户交互。但是需要注意的是,如果在邮件撰写时用户正在系统上积极工作(输入、点击等),可能会出现用户输入的内容弹出窗口并干扰或添加额外未知字符到邮件正文中的情况。

只要运行这个程序的用户意识到这一点,并且杂乱的按键不会对业务产生重大影响,那么这个函数就是可接受的。

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

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

Outlook 2010以登录系统的用户身份运行,具有Medium完整性级别。由Windows Explorer启动或作为启动方式相似的程序的子进程或后代程序也将使用Medium完整性级别启动。只要用户和会话ID匹配并且完整性级别相同或更高,UIPI就无法防止“SendKeys”类型的输入。在我特定的环境中,用户和会话ID是相同的,VBScript主机进程和Outlook进程的完整性级别也相同。如果您的环境中任何一个条件不符合,则此代码将无法工作。它还未经过早期或晚期版本的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 task scheduler properties


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接