2010-02-03 5 views
9

Sto usando l'errore .Il server SMTP 127.0.0.1 ottengo:Non è possibile ottenere IIS directory di prelievo

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

Questo errore si è verificato, quando E-mail inviare da ASP web page.But un'email invia da Pagina ASP.NET, errore non si è verificato. Aiuto Plz.

risposta

14

Sfortunatamente, questa eccezione viene sollevata quando il tipo di problema si verifica durante il tentativo di determinare la posizione della directory di prelievo IIS/SMTP durante il periodo. Una causa comune manca il servizio SMTP IIS.

Se si invia la posta utilizzando System.Net.Mail.SmtpClient, provare a impostare la directory di prelievo manualmente:

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

O impostare questo nel web.config di ASP.NET, invece:

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

In alternativa, utilizzare invece il metodo SmtpDeliveryMethod.Network e inviare le proprietà Host e Port al server SMTP.

Maggiori informazioni: http://forums.iis.net/p/1149338/1869548.aspx

+1

puoi chiarire di più su PickupDirectoryLocation? quale valore dobbiamo dare per utilizzare PickupDirectoryLocation? – ManirajSS

+1

PickupDirectoryLocation deve essere impostato su un percorso per una directory utilizzata dal servizio SMTP IIS (o servizio di terze parti compatibile) come directory di prelievo: tutte le e-mail salvate verranno inviate. Ad esempio, potrebbe essere "C: \ Inetpub \ mailroot \ Pickup". –

9

La directory di prelievo viene memorizzato nella II6 Metabase, quindi, se l'account che il vostro web-app viene eseguito come non ha accesso ai nodi richiesti, questo errore può essere lanciato (ha avuto questo me stessa). autorizzazioni della metabase sono separate da permessi dei file, in modo da esplorare con Metabase Explorer:

http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92ee-a71a-4c73-b628-ade629c89499&displaylang=en (parte del Resource Kit IIS sua)

Questi nodi devono avere il permesso di leggere dato al vostro utente web-app: \ LM \ SmtpSvc \ LM \ SmtpSvc \ 1

+0

Devo dire che ho dovuto anche correggere i permessi dei file per farlo funzionare. – Peter

+0

Questo è ottimo e ora posso vedere/comprendere il problema sulla mia casella di Windows 2008 Sto usando Identità Pool di applicazioni e non riesco a utilizzare la GUI per impostare le autorizzazioni per tale account utente. In precedenza ho dovuto impostare i permessi dei file dalla riga di comando per aggirare questo problema. Sai se è possibile fare lo stesso per queste autorizzazioni? – ProNotion

3

Stavo avendo lo stesso errore su Windows 7 con codice che funzionava bene su XP. Dopo molte prove ed errori. Ho configurato IIS per memorizzare la posta in una directory di prelievo. Ma ho ancora avuto l'errore.

Nel mio codice ho commentato la linea:

client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

La rimozione di questa riga di codice ha funzionato, non è sicuro del perché. Spero che funzioni anche per te, perché questo problema è una perdita di tempo reale da risolvere.

Non ho dovuto modificare alcun permesso sulla directory. NON ho dovuto modificare la metabase. Non ho dovuto modificare il web.config (che non volevo proprio fare perché voglio solo che le e-mail siano inserite in una directory mentre sto facendo lo sviluppo sul mio computer locale, non in produzione - non l'ho fatto vogliono due diversi file web.config da mantenere).

+0

Solo intervenire per dire che questo è ciò che ha funzionato per me. Stavo aggiornando un progetto VS2004 su VS2010 e l'invio di e-mail si è rifiutato di funzionare fino a quando questa linea non è stata rimossa. – spamguy

0

È inoltre possibile specificare che per il progetto unittest:

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;  
    } 

E il tuo codice di prova:

[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."); 
} 

Creare il file app.config nel progetto unittest se non esiste o unire queste righe con app.config esistente.

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