2011-12-07 11 views
9

Estoy usando un "truco" (muy bien descrito here) para almacenar mis correos electrónicos en el servidor de aplicaciones durante las pruebas.SpecifiedPickupDirectory no creará archivos hasta que lo visualice un usuario en el servidor

Mi archivo de configuración se parece a esto: existe

<system.net> 
    <mailSettings>  
     <smtp deliveryMethod="SpecifiedPickupDirectory" from="[email protected]">  
      <specifiedPickupDirectory pickupDirectoryLocation="E:\EmailStore" />  
     </smtp> 
    </mailSettings> 
</system.net> 

El directorio y no tiene problemas de derechos.

Aquí está el problema. Los archivos no se crearán hasta que navegue a la carpeta en el servidor. Entonces, de repente bang todos los archivos están apareciendo en el directorio.

¿Alguien tiene alguna idea de lo que está pasando?

me he dado cuenta de que hay otra opción - PickupDirectoryFromIis - pero estoy claro cuándo debo utilizar SpecifiedPickupDirectory y cuando debería utilizar PickupDirectoryFromIis.

¿Cuál es la diferencia entre SpecifiedPickupDirectory y PickupDirectoryFromIis? ¿Cuándo debería usar uno sobre el otro? ¿Es esta la causa de que los archivos no aparezcan hasta que navegue?

Respuesta

7

Este fue un proyecto que se migró de ASP.NET 3.5 a ASP.NET 4.0

Parece que System.Net.Mail.SmtpClient ahora implementa IDisposable. Cambiar el código para usar el siguiente patrón parece haber resuelto el problema.

La mejor suposición en cuanto a la causa fue que no se estaba llamando al GC y no se estaba limpiando el búfer de archivos.

using (System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage()) 
{ 
    using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient()) 
    { 
     // code 
    } 
} 
0

Eso es extraño. Usamos SpecifiedPickupDirectory para nuestros accesorios de prueba también, para probar funciones de envío/recepción de correo electrónico de prueba. Sin embargo, mantenemos el directorio en la unidad C: \. ¿Está asignada la unidad E: \ a una unidad de red? ¿O es local? ¿Has intentado cambiarlo a una ubicación en C: \? ¿Tienes el mismo problema?

+0

E: \ es local a la máquina. (Toda la máquina es virtual, pero eso no debería importar). El directorio está configurado como una unidad compartida (para que el equipo de control de calidad pueda ver los correos electrónicos). – Hogan

0

Traté de escribir (y obtener de la web también) la diferencia entre los métodos: http://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod.aspx

Network 

El correo electrónico se envía a través de una conexión directa con el servidor SMTP especificado.

SpecifiedPickupDirectory 

Indica que el directorio especificado por PickupDirectoryLocation se usará como el directorio de recogida SMTP. Si el cliente SMTP no puede escribir en la ubicación del directorio de recogida, se lanza una excepción de E/S Enviar. El directorio no se creará si no existe. Las credenciales del subproceso o proceso actualmente en ejecución se usarán para acceder al directorio. Esto es útil cuando se tiene un programa personalizado externo que recoge e-mails de esa carpeta y los procesa

PickupDirectoryFromIis 

El mensaje de correo electrónico está preparado y el archivo EML se guarda en el directorio predeterminado de que el IIS recoge correos electrónicos en cola para enviar. Por defecto, esto es: \ Inetpub \ mailroot \ Queue.

Sin embargo, al usar el segundo y tercer método de entrega, su aplicación web no puede ser notificada de ningún error que pueda ocurrir durante la transmisión del mensaje, y será hasta IIS (u otro agente de correo que pueda usarse) para manejarlos. En general, el método PickupDirectoryFromIis es el preferido, a menos que su aplicación ASP.NET no tenga el derecho de escribir en las carpetas de correo de IIS (consulte con su proveedor de servicios de alojamiento web si no usa sus propios servidores). SO, puede ser un problema de permiso?

+0

Gracias por su respuesta, algunas notas: Tengo control total sobre el servidor y creó el directorio con todos los derechos para la cuenta de servicio y todos los administradores locales y compartió el directorio con derechos de lectura para todos en el dominio. La función de envío no obtiene errores. De hecho, el archivo se guarda bien, excepto que ocurre más tarde cuando inicio sesión en el servidor localmente y navego hasta el directorio. – Hogan

+0

Estoy buscando su problema, ¡pero es realmente extraño! Servidor virtual e IIS 7 ¿verdad? Cuando inicia sesión en el servidor y va a la ruta, ¿camina por \\ server-name \ share \ EmailStore? Espero que el registro del servidor pueda decirte algo; ¿Has intentado cambiar E: \ EmailStore por \\ server-name \ share \ EmailStore en el web.config? –

+0

No, tengo que iniciar sesión en el servidor, entonces utilizo el navegador "Computadora" (desde la pestaña de inicio) para navegar a 'E: \ EmailStore'. (Cuando los usuarios externos al servidor miran '\\ servername \ EmailStore' no ven los archivos. – Hogan

Cuestiones relacionadas