1

我正在使用 Windows Server 2008 R2 和 IIS 7.5.7600 所以我已经安装了 SMTP 服务并且它正在运行。我已经使用以下 powershell 脚本测试了它是否可以工作:

$emailFrom = "user@yourdomain.com"
$emailTo = "user@yourdomain.com"
$subject = "your subject"
$body = "your body"
$smtpServer = "your smtp server"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)

电子邮件使用“localhost”作为服务器发送。

但是,在配置 WCF 服务的 web.config 之后:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="user@yourdomain.com">
      <network
        host="localhost"
        port="25" 
      />
    </smtp>
  </mailSettings>
</system.net>

当我的代码调用时,我收到一个通用的无意义错误:

var mail = new MailMessage();
mail.To.Add("user@yourdomain.com");
mail.Subject = "[Smtp Client] TEST";
mail.Body = "TEST";
mail.IsBodyHtml = false;
var smtpMail = new SmtpClient();
smtpMail.Send(mail);

我得到:

Failure sending mail.

    at System.Net.Mail.SmtpClient.Send(MailMessage message)

我不知道还要检查什么?是的,我已经在服务器上安装了应用程序服务器角色。是的,WCF 服务工作正常,我的所有其他代码都按预期运行,只有电子邮件发送失败。似乎 IIS 和本地 SMTP 中继之间存在一些断开连接,但我找不到任何讨论这个特定问题的内容(只有那些无法启动和运行 smtp 或无法整理他们的配置的人) .

感谢您的时间和关注。

4

1 回答 1

3

所以答案原来是使用元数据库的权限。我之前发现过这个,但我之前遇到的来源只说授予 LM\SMTPSVC 路径的读取权限,并没有提到 LM\SMTPSVC\1 (我认为权限会级联到子文件夹/路径) . 更详细的解释见下文:

取自这里

在 2008/IIS7+ 中,ApplicationPoolIdentity 帐户是具有动态分配 SID(在 ApplicationPool 启动时创建和分配)的隐藏帐户。但是这些帐户作为(隐藏)用户存在于本地计算机上的 IIS_IUSRS 组下(这使得他们非常容易获得 AppPools 的权限,因为您可以使用普通的 GUI 界面进行 perms 或在指定本地用户组时使用脚本)。要解决在 IIS7.5 下运行的 ASP 站点无法发送电子邮件的问题:

  1. 将 IIS_IUSRS 组的读/写权限授予 Mailroot 文件夹(权限将继承到 Pickup/etc 文件夹)。
  2. 现在使用 Metabase Permissions 修改器(Metabase Explorer 有效,2003 年的 METAACL.VBS 也有效),打开 LM\SMTPSVC 和 SMTPSVC\1 并将具有读取权限的 IIS_IUSRS 添加到配置数据库的这些分支。

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

这些权限将允许任何 ApplicationPoolIdentity 用户使用本地 SMTP 服务创建和发送电子邮件。这可以通过停止本地计算机上的 SMTP 服务进行测试,这将强制 .EML 文件显示在 mailroot\pickup 文件夹中。发送电子邮件适用于 NetworkService 和 LocalService 而不是 ApplicationPoolIdentity 的原因是 Metabase 默认具有 SYSTEM 和 NetworkService 的读取权限。这是另一个示例,说明为什么将 AppPools 作为 ApplicationPoolIdentity 运行比作为 NetworkService 运行提供更高的安全性:应用程序必须被赋予对其必须读取或写入的任何注册表项、文件夹层次结构、文件等的显式权限。

于 2012-10-04T00:27:08.880 回答