2010-02-03 91 views
9

我一直在使用SMTP服務器127.0.0.1 .The錯誤,我得到:無法獲取IIS拾取目錄

System.Net.Mail.SmtpException: Cannot get IIS pickup directory.at System.Net.Mail.IisPickupDirectory.GetPickupDirectory().

此錯誤發生,當電子郵件從ASP網頁page.But郵件發送從發送ASP.NET頁面,沒有發生錯誤。 Plz的幫助。

回答

14

不幸的是,當嘗試確定IIS/SMTP拾取目錄的位置時,出現任何類型的問題時會引發此異常。常見的原因是缺少IIS SMTP服務。

如果您正在使用System.Net.Mail.SmtpClient發送郵件,嘗試手動設置拾取目錄:

// C# 
var client = new SmtpClient(); 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = ...; 
client.Send(...); 

或者在ASP.NET的Web.config設置此相反:

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="SpecifiedPickupDirectory"> 
       <specifiedPickupDirectory 
        pickupDirectoryLocation="..." /> 
       <network defaultCredentials="false" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 

或者,也可以使用SmtpDeliveryMethod.Network方法,並將HostPort屬性發送到您的SMTP服務器。

的更多信息:http://forums.iis.net/p/1149338/1869548.aspx

+1

您能否在PickupDirectoryLocation上說明更多內容?我們必須給PickupDirectoryLocation使用什麼值? – ManirajSS 2014-09-26 09:47:33

+1

PickupDirectoryLocation應設置爲由IIS SMTP服務(或兼容的第三方服務)用作拾取目錄的目錄的路徑 - 保存到它的所有電子郵件都將被髮送。例如,它可能是「C:\ Inetpub \ mailroot \ Pickup」。 – 2014-11-16 19:59:57

9

分揀目錄存儲在II6元數據庫,因此,如果你的web應用程序運行的帳戶沒有訪問所需的節點,這個錯誤可以被拋出(有這我)。元數據庫的權限是從文件權限單獨的,所以你與數據庫資源管理器探索它:

http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en(IIS資源工具包中的一部分)

這些節點需要有閱讀權限給您的web應用程序的用戶: \ LM \ SmtpSvc \ LM \ SmtpSvc \ 1

+0

我應該提到,我還必須修復文件權限才能使其發揮作用。 – Peter 2013-03-21 14:51:30

+0

這很棒,我現在可以在我使用應用程序池標識的Windows 2008框中看到/理解問題,但無法使用GUI設置該用戶帳戶的權限。我以前必須從命令行設置文件權限才能解決此問題。你知道這些權限是否可以做同樣的事情? – ProNotion 2014-10-17 09:23:00

3

我在Windows 7上遇到了同樣的錯誤,代碼在XP上運行良好。經過多次試驗和錯誤。我將IIS設置爲將郵件存儲在拾取目錄中。但我仍然有錯誤。

在我的代碼註釋行:

client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

刪除這行代碼工作,不知道爲什麼。希望它也適合你,因爲這個問題是一個真正的時間浪費,以troubleblush。

我沒有必要更改目錄上的任何權限。 我沒有修改元數據庫。 我沒有修改web.config(我真的不想這樣做,因爲我只想在我的本地機器上進行開發時將電子郵件放入目錄中,而不是在生產中 - 我沒有想要兩個不同的web.config文件來維護)。

+0

只是想說這是我的工作。我正在更新一個VS2004項目到VS2010,並且電子郵件發送拒絕工作,直到刪除該行。 – spamguy 2012-04-13 15:00:22

0

您還可以指定它爲您的單元測試項目:

public enum TestContextKeys { EmailPickupDirectory, ... }; 

[TestClass] 
public class AssemblyInitializer 
{ 
    [AssemblyInitialize] 
    public static void Init(TestContext testContext) 
    {   
     string configPath = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 
     XDocument xmlConfig = XDocument.Load(configPath); 
     var emailPickupDirectory = xmlConfig.Element("configuration") 
        .Element("system.net") 
        .Element("mailSettings") 
        .Element("smtp") 
        .Element("specifiedPickupDirectory") 
        .Attribute("pickupDirectoryLocation") 
        .Value;    

     testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()] = emailPickupDirectory;  
    } 

而且你的測試代碼:

[TestMethod] 
public void TestEmailRegistration() 
{ 
    MyApp app = new MyApp(); 
    app.RegisterUser("Johny Cash",...); 

    string emailPickupDirectory = (string)_testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()]; 

    string[] allEmails = Directory.GetFiles(emailPickupDirectory); 

    string[] recentEmails = allEmails.Where(e => new FileInfo(e).CreationTime.AddMinutes(1) > DateTime.Now).ToArray(); 

    //check that the registration email was sent 
    foreach (var email in recentEmails) 
    { 
     string content = File.ReadAllText(email); 

     if (content.Contains("Johny Cash") && content.Contains("successful") && content.Contains("registration")) 
     { 
      File.Delete(email); 
      return;//OK found 
     } 
    } 
    Assert.Fail("Registratoin email has not been sent to Johny Cash"); 
} 

[TestMethod] 
public void TestEmailPickupDirectoryConfiguration() 
{ 
    string emailPickupDirectory = (string)_testContext.Properties[TestContextKeys.EmailPickupDirectory.ToString()]; 

    MailAddress mailFrom = new MailAddress("[email protected]", "Tester"); 
    MailAddress mailTo = new MailAddress("[email protected]", "Tester2"); 
    string subject = "Test Message TestEmailPickupDirectory"; 

    using (SmtpClient sc = new SmtpClient()) 
    { 
     System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage(); 

     mail.To.Add(mailTo); 
     mail.Subject = subject; 
     mail.From = mailFrom; 
     mail.IsBodyHtml = true; 
     mail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-9"); 
     mail.Body = "<html><body>"; 
     mail.Body += "TestEmailPickupDirectory"; 
     mail.Body += "</body></html>"; 

     sc.Send(mail); 
    } 


    string[] allEmails = Directory.GetFiles(emailPickupDirectory); 

    string[] recentEmails = allEmails.Where(e => new FileInfo(e).CreationTime.AddMinutes(1) > DateTime.Now).ToArray(); 

    foreach (var email in recentEmails) 
    { 
     string content = File.ReadAllText(email); 

     if (content.Contains(mailFrom.Address) && content.Contains(mailTo.Address) && content.Contains(subject)) 
     { 
      File.Delete(email); 
      return;//OK found 
     } 
    } 
    Assert.Fail("EmailPickupDirectory configuration may be wrong."); 
} 

在單元測試項目中創建app.config文件如果不存在,或合併這些線與現有的app.config。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.net> 
    <mailSettings> 
     <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="d:\temp\Emails\" /> 
     </smtp> 
    </mailSettings> 
    </system.net> 
</configuration>