2012-10-03 37 views
1

发送电子邮件从IIS 7我使用Windows Server 2008 R2和IIS 7.5.7600 所以我已经安装了SMTP服务,它正在运行。我已经测试了它的工作原理使用下面的PowerShell脚本:使用本地SMTP中继

$emailFrom = "[email protected]" 
$emailTo = "[email protected]" 
$subject = "your subject" 
$body = "your body" 
$smtpServer = "your smtp server" 
$smtp = new-object Net.Mail.SmtpClient($smtpServer) 
$smtp.Send($emailFrom, $emailTo, $subject, $body) 

电子邮件被使用“本地主机”发送作为服务器。

然而,在配置WCF服务的web.config后:

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="Network" from="[email protected]"> 
     <network 
     host="localhost" 
     port="25" 
     /> 
    </smtp> 
    </mailSettings> 
</system.net> 

我收到一般意义的错误时,我的代码调用:

var mail = new MailMessage(); 
mail.To.Add("[email protected]"); 
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或者无法理清其配置的人) 。

谢谢你的时间和关注。

+0

所以我更加困惑。我创建了一个简单的控制台应用程序,并复制并粘贴电子邮件代码。将exe复制到服务器并运行可执行文件,并运行并发送电子邮件。它似乎只是在IIS内,电子邮件失败。 – Bitfiddler

+0

好的,更多信息...如果我将代码更改为模拟域管理员,那么WCF服务可以发送电子邮件。所以,尽管完全没用的错误信息,它似乎是一个安全问题。现在到底什么是安全问题?请继续关注,或许明天对IIS的砖墙b tom will will,会让事情变得更糟。 – Bitfiddler

回答

3

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

HERE服用。

在2008/IIS7 +的ApplicationPoolIdentity帐户是动态分配隐藏账户的SID(创建,当ApplicationPool开始分配)。但帐户作为本地计算机上IIS_IUSRS组下的(隐藏)用户存在(这使得他们对AppPools的权限变得非常容易,因为您可以在指定本地用户组的同时使用常规GUI界面或使用脚本)。要使用IIS7.5下运行不能够发送电子邮件ASP网站解决问题:

  1. 给读/写权限的IIS_IUSRS组到Mailroot文件夹(权限将继承下来皮卡的/ etc文件夹)。
  2. 现在使用元数据库权限修饰符(元数据库资源管理器可以工作,从2003年起,METAACL.VBS也起作用)打开LM \ SMTPSVC和SMTPSVC \ 1并将具有读取权限的IIS_IUSRS添加到配置数据库的这些分支。

    CSCRIPT metaacl.vbs IIS:// LOCALHOST/SMTPSVC%计算机%\ IIS_IUSRSř CSCRIPT metaacl.vbs IIS:// LOCALHOST/SMTPSVC/1%计算机%\ IIS_IUSRSř

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