2010-02-03 19 views
9

He estado usando el error .El 127.0.0.1 servidor SMTP me sale:No se puede obtener el directorio de recogida IIS

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

Esto produjo un error, cuando el correo electrónico enviado desde ASP EMail page.But WEB de emisión de Página ASP.NET, no se produjo el error. Por favor ayuda.

Respuesta

14

Lamentablemente, esta excepción se produce cuando se produce algún tipo de problema al tratar de determinar la ubicación del directorio de recogida IIS/SMTP. Una causa común es que falta el servicio IIS SMTP.

Si va a enviar correo utilizando System.Net.Mail.SmtpClient, intente configurar el directorio de recogida manualmente:

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

O configurar esto en Web.config de ASP.NET en su lugar:

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

Alternativamente, use el método SmtpDeliveryMethod.Network y envíe las propiedades Host y Port a su servidor SMTP.

Más información: http://forums.iis.net/p/1149338/1869548.aspx

+1

¿Puedes aclarar más sobre PickupDirectoryLocation? ¿Qué valor tenemos para usar PickupDirectoryLocation? – ManirajSS

+1

PickupDirectoryLocation debe establecerse en una ruta a un directorio que utilice el servicio SMTP de IIS (o un servicio de terceros compatible) como directorio de recogida; todos los correos electrónicos guardados se enviarán. Por ejemplo, podría ser "C: \ Inetpub \ mailroot \ Pickup". –

9

El directorio de recogida se almacena en el II6 la metabase, por lo que si la cuenta de que su aplicación Web se ejecuta como no tiene acceso a los nodos necesarios, este error puede ser lanzado (tenido este mí mismo). permisos de metabase están separados de los permisos de archivos, por lo que explorar con Metabase Explorer:

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

Estos nodos deben tener permiso de lectura dado al usuario web-app: \ LM \ SmtpSvc \ LM \ SmtpSvc \ 1

+0

Debo mencionar que también tuve que arreglar los permisos de los archivos para que esto funcione. – Peter

+0

Esto es genial y ahora puedo entender el problema. Sin embargo, en mi cuadro de Windows 2008, estoy usando la identidad de grupo de aplicaciones y no puedo usar la GUI para configurar los permisos para esa cuenta de usuario. Anteriormente tuve que configurar permisos de archivo desde la línea de comandos para evitar esto. ¿Sabes si es posible hacer lo mismo para estos permisos? – ProNotion

3

Estaba teniendo el mismo error en Windows 7 con un código que funcionaba bien en XP. Después de mucho ensayo y error. Configuro IIS para almacenar el correo en un directorio de recogida. Pero todavía tuve el error.

En mi código que comentada la línea:

client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

Al eliminar esta línea de código funcionó, no estoy seguro de por qué. Espero que funcione para usted también porque este problema es un desperdicio de tiempo real para tropezar.

NO tuve que cambiar ningún permiso en el directorio. NO tuve que modificar la metabase. NO tuve que modificar el web.config (que realmente no quería hacer porque solo quiero que los correos electrónicos se coloquen en un directorio mientras desarrollo en mi máquina local, no en producción, no lo hice) quiere dos archivos web.config diferentes para mantener).

+0

Solo interviniendo para decir que esto fue lo que funcionó para mí. Estaba actualizando un proyecto VS2004 a VS2010 y el envío de correo electrónico se negó a trabajar hasta que se eliminó esta línea. – spamguy

0

También puede especificar que para su proyecto 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;  
    } 

Y su código de prueba:

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

Crear el archivo app.config en su proyecto unittest si no existe o fusionar estas líneas con app.config existente.

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