2012-10-03 35 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運行更安全的原因的另一個例子:應用程序必須給予它必須讀或寫的任何註冊表項,文件夾層次結構,文件等的顯式權限。