使用本地SMTP中继从IIS 7发送电子邮件

时间:2012-10-03 22:03:42

标签: wcf iis-7 smtp

我使用的是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或无法理清其配置的人)

感谢您的时间和关注。

1 个答案:

答案 0 :(得分:3)

所以答案结果是使用Metabase的权限。我之前发现过这个,但我之前遇到的来源只是说给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

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