如何在 Windows 2008 上的 IIS 7.5 中配置 CDOSYS?

How can I configure CDOSYS in IIS 7.5 on Windows 2008?

像你们中的许多人一样,我正在将遗留的经典 ASP 应用程序从 Windows 2003 服务器迁移到 Windows 2008。我大部分时间都在工作,但我无法通过它发送电子邮件。这是因为 CDOSYS 没有正确配置。尽管谷歌搜索了大约 4-5 个小时,运行 通过 API 文档,甚至搜索了文件系统和系统注册表中的所有文件,但我还是无法弄清楚这是在哪里设置的。

遗留应用程序的 ASP.NET 部分工作正常。它能够在没有身份验证的情况下将电子邮件发送到本地主机,然后通过身份验证传递到邮件服务器以发送到他们的目的地。

为了方便起见,我将 VB6 调用从源代码翻译成 Powershell 脚本:

$config = new-object -com "CDO.Configuration";
$config.Load(1);

$smtp = new-object -com "CDO.Message";
$smtp.Configuration = $config;
$smtp.From = "me@example.com"
$smtp.To = "me@example.com"
$smtp.Subject = "test"
$smtp.TextBody = "Message";
$smtp.Send();

此脚本在我的原始服务器上正确发送电子邮件。在新服务器上 returns 调用 $smtp.Send():

时出现此错误

Exception calling "Send" with "0" argument(s): "The "SendUsing" configuration value is invalid.

两台服务器的配置大不相同。使用上面的 $config 参考,我在两台服务器上执行了 $config.Fields | Format-List -Property Name,Value

旧服务器(运行的地方):

Name  : http://schemas.microsoft.com/cdo/configuration/languagecode
Value : en-us

Name  : http://schemas.microsoft.com/cdo/configuration/postusing
Value : 0

Name  : http://schemas.microsoft.com/cdo/configuration/sendusing
Value : 1

Name  : http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory
Value : D:\Inetpub\mailroot\Pickup

Name  : http://schemas.microsoft.com/cdo/configuration/usemessageresponsetext
Value : True

Name  : urn:schemas:calendar:timezoneid
Value : 1

新服务器:

Name  : http://schemas.microsoft.com/cdo/configuration/languagecode
Value : en-gb

Name  : http://schemas.microsoft.com/cdo/configuration/postusing
Value : 0

Name  : http://schemas.microsoft.com/cdo/configuration/sendusing
Value : 0

Name  : http://schemas.microsoft.com/cdo/configuration/usemessageresponsetext
Value : True

Name  : urn:schemas:calendar:timezoneid
Value : 0

似乎要使这项工作我需要做的就是将其配置为默认将邮件发送到本地主机,或者将邮件放入拾取目录中。 IIS SMTP 服务器已配置为查看此目录。

但是,我无法确定这些值的设置位置。它们必须在某个文件或注册表中设置,但即使在 C 驱动器中搜索“\Pickup”和 "usemessageresponsetext" 等短语也没有发现任何内容。如果它们在某处,我猜它们在某处的二进制数据存储中。

CDOSYS 的所有示例都涉及直接配置 CDO.Configuration 或 CDO.Message 实例,但在整个代码中,我们的应用程序从 IIS 加载配置,所以不知何故这是由某人在某一时刻设置的。

我错过了经典的ASP时代,所以我处在一个非常陌生的领域。也就是说,我的同事是活跃的经典 ASP 开发人员不知道如何配置它,而最初设置它的人已经离开了。我很可能在这里遗漏了一个非常简单的基本概念。

我发现当我以管理员身份登录时,我可以使用示例 Powershell 脚本。从那里进行的研究使我找到了 post on the IIS forums,它可以解决该问题。不幸的是,它现在会导致一些死链接,这意味着它不起作用。然而,它有足够的提示来组合一个解决方案:

  1. 下载并安装 IIS Resource Kit Tools
  2. 以管理员身份执行C:\Program Files (x86)\IIS Resources\Metabase Explorer\MBExplorer.exe
  3. 导航至 /LM/SmtpSvc,右键单击它并选择 select 属性。
  4. 输入您要授予访问权限的群组。在我的例子中,用户和 IIS_IUSRS 都只有读取权限。
  5. 导航到 /LM/SmtpSvc/1,并在此节点上也设置相同的权限。
  6. 授予 read/write 访问权限 IIS_IUSRS 和用户 c:\inetpub\mailroot

所以,根本原因是我试图在其下执行此操作的用户没有正确的权限。

遗憾的是,我不知道如何编写这些步骤的脚本。 post 引用了我在任何地方都找不到的 "metaacl.vbs" 脚本;所有声称拥有它的链接都已失效。它也应该由上面链接的 IIS 资源工具包工具安装,但我在我的服务器上找不到它。

如果您能在某个地方找到它,您就可以像这样执行上述步骤:

cscript metaacl.vbs IIS://LOCALHOST/SMTPSVC %computername%\IIS_IUSRS R
cscript metaacl.vbs IIS://LOCALHOST/SMTPSVC/1 %computername%\IIS_IUSRS R