【问题标题】:Sending Email from IIS 7 using local SMTP relay使用本地 SMTP 中继从 IIS 7 发送电子邮件
【发布时间】:2012-10-03 22:03:41
【问题描述】:

我使用的是 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 或无法整理他们的配置的人) .

感谢您的时间和关注。

【问题讨论】:

  • 所以我更加困惑了。我创建了一个简单的控制台应用程序并将电子邮件代码复制并粘贴到其中。将exe复制到服务器并运行可执行文件,它会运行并发送电子邮件。似乎只是在 IIS 内电子邮件失败了。
  • 好的,更多信息...如果我将代码更改为模拟域管理员,那么 WCF 服务可以发送电子邮件。因此,尽管出现了完全无用的错误消息,但它似乎是一个安全问题。现在安全问题到底是什么?请继续关注,也许明天对 IIS 砖墙的头骨猛烈抨击会出现一些情况。

标签: wcf iis-7 smtp


【解决方案1】:

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

取自HERE

在 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 运行提供了更高的安全性:应用程序必须被赋予对其必须读取或写入的任何注册表项、文件夹层次结构、文件等的显式权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2011-06-16
    • 2012-05-25
    相关资源
    最近更新 更多