2009-02-15 23 views
51

Necesito configurar un servidor SMTP para probar mi sitio web que envía correos electrónicos (para confirmación de registro, etc.).Prueba SMTP con .net

En realidad, no quiero que se envíe el correo electrónico, solo quiero asegurarme de que mi código sea correcto. Así que quiero poder verificar que el correo electrónico esté en una carpeta de cola, por ejemplo.

¿Alguien puede recomendar un servidor SMTP que sea fácil de configurar?

Respuesta

7

creo que la entrada en el blog A Simple SMTP Server Mock for .NET le da lo que necesita: un servidor SMTP simulacro

Una maqueta del servidor SMTP es básicamente un servidor SMTP falso que se puede utilizar para la unidad pruebas de las aplicaciones que envían mensajes de correo electronico

Además, un google search for smtp mock server le proporcionará una selección de servidores SMTP para realizar pruebas. Al igual que:

+0

Dumbster permite que su unidad pruebe el servicio SMTP, pruebe algún código de envío y luego haga afirmaciones sobre cuántos correos electrónicos se enviaron, cuáles fueron sus contenidos, etc. –

+0

nDumpster parece no estar en mantenimiento y es muy lento, por lo que no es realmente adecuado para pruebas unitarias. Ver http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –

4

Una forma alternativa de hacer esto es crear una envoltura alrededor de la SmtpClient que implementa la misma interfaz. Luego, inyecta y usa el contenedor en tu clase. Al hacer pruebas unitarias, puede sustituir un contenedor simulado que tenga expectativas para las llamadas y respuestas al método.

EDIT: El envoltorio es necesario (para RhinoMocks, al menos) porque SmtpClient no se deriva de una interfaz y no tiene métodos virtuales. Si usa un marco de simulación que puede simular una clase directamente sin métodos virtuales, puede omitir el envoltorio e inyectar el simulacro de SmtpClient directamente.

public class SmtpClientWrapper 
{ 
    private SmtpClient Client { get; set; } 

    public SmtpClientWrapper(SmtpClient client) 
    { 
     this.Client = client; 
    } 

    public virtual void Send(MailMessage msg) 
    { 
     this.Client.Send(msg); 
    } 

    ... 
} 


public class MyClass 
{ 
    private SmtpClientWrapper Client { get; set; } 

    public MyClass(SmtpClientWrapper client) 
    { 
     this.Client = client; 
    } 

    public void DoSomethingAndNotify() 
    { 
     ... 
     this.Client.Send(msg); 
    } 
} 

Probado (con RhinoMocks) como:

public void DoSomethingAndNotifySendsAMessageTest() 
{ 
    SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>(); 
    client.Expect(c => c.Send(new MailMessage())).IgnoreArguments(); 

    MyClass klass = new MyClass(client); 

    klass.DoSomethingAndNotify(); 

    client.VerifyAllExpectations(); 
} 
+2

Sé que esta es una respuesta antigua, pero me gustaría señalar que esta es una buena idea, pero el código proporcionado no refleja lo que dices. El contenedor no implementa una interfaz o tiene métodos virtuales para sobrescribir. Personalmente, prefiero usar una interfaz. Entonces esta clase debería implementar ISmtpClientWrapper y luego se deberían generar simulaciones con un tipo de ISmtpClientWrapper para lograr lo que necesita. En general, estoy de acuerdo con su recomendación. Hacer esto en lugar de configurar un servidor SMTP falso asegura que cualquiera pueda obtener sus pruebas y ejecutarlas sin configuración adicional. – jlafay

+0

@jlafay - Estaba usando la palabra * interfaz * en el sentido de la firma de clase, no específicamente definida. No estoy seguro de que valga la pena crear una interfaz real cuando solo la clase contenedora lo implementará. – tvanfosson

+0

correcto, pero debe poder anular la implementación real con una interfaz o métodos virtuales. Parece que editó su publicación hace unas horas y cambió el método de envío a virtual, así que creo que eso lo haría. Es por eso que mencioné ambas soluciones. Como ya dije, prefiero una interfaz, de todos modos son bastante ligeras. – jlafay

41

También hay Papercut que es un servidor SMTP que recibirá los mensajes pero no entregarlos en cualquier lugar (lo que le permite asegurarse de que están siendo enviados correctamente) . Los mensajes recibidos son visibles en una GUI pequeña y también se escriben en un directorio.

+3

Papercut se ha movido de la URL anterior a Codeplex: http://papercut.codeplex.com/ – Drarok

+0

Actualicé el enlace, @Drarok. –

2

El DevNull SMTP server registra todos los detalles sangrientos sobre la comunicación entre el cliente y el servidor SMTP. Parece que sería útil si intentara diagnosticar por qué su código de envío no funcionaba.

Está escrito en Java y se implementa como un archivo ejecutable. El código fuente no parece estar disponible.

19

El proyecto smtp4dev es otro servidor SMTP ficticio. Me gusta porque tiene una interfaz de usuario agradable y simple que registra los mensajes y le permite ver el contenido de los mensajes recientes. Escrito en C# con un instalador de MSI. El código fuente está disponible.

+0

También me gusta este. ¡Voto! – granadaCoder

+0

El lanzamiento en el enlace ya no está allí, así que use este enlace desnudo: http://smtp4dev.codeplex.com/ –

+0

Gracias, @Csaba Toth, no puedo recordar por qué me he vinculado a un lanzamiento específico, así que Cambié a la página de inicio del proyecto. –

0

También hay mi propio http://ssfd.codeplex.com/ que es un emulador de SMTP de código abierto. recibirá los correos electrónicos y los deja caer en una carpeta que se puede acceder por un icono de la tarea

27

En .NET, SmtpClient puede ser configurado para enviar correo electrónico por colocándolo en un directorio de recolección.

El constructor predeterminado de SmtpClient toma su configuración de app.config, por lo que para un entorno de prueba podemos configurarlo de la siguiente manera.

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="specifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="path to a directory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 

referencia de MSDN - mailSettings app.config elemento http://msdn.microsoft.com/en-us/library/w355a94k.aspx

+0

A menos que esté en .NET 4.5 , tenga cuidado de especificar también un host de red, o obtendrá una excepción al desechar el smtpclient; consulte [SmtpClient informa InvalidOperationException cuando se desecha de manera inmediata después de enviar el correo y se utiliza el directorio de recogida] (http://connect.microsoft.com/VisualStudio/feedback/details/539160/smtpclient-reports-invalidoperationexception-when-disposed-immediatelly-after-sending-mail-and-pickup-directory-is-used), específicamente la respuesta de Raymondr –

+0

@argatxa la respuesta es correcta con respecto al uso de el elemento especificadoPickupDirectory. Lo anterior no es del todo correcto, consulte: http://msdn.microsoft.com/en-us/library/ms164241.aspx –

7

Para los chicos por ahí .NET. Manteniéndolo simple.

Estábamos investigando esto y luego uno de los desarrolladores recordó una configuración de configuración que le permite anular cómo se envían los correos electrónicos.

Esto creará un archivo por correo electrónico y lo dejará en paz.

<system.net> 
    <mailSettings> 
     <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" /> 
     </smtp>  
    </mailSettings> 
    </system.net> 
0

Tenga en cuenta que la clase SmtpClientWrapper propuesto por tvanfosson necesita la palabra clave importantísima "virtual" en su declaración del método Send, de lo contrario están de vuelta en el mismo barco que tratar de burlarse de la SmtpClient directamente.

+0

Debe ser un comentario, no una respuesta. –

0

De acuerdo con muchas de las otras sugerencias de una herramienta gratuita que he usado mucho: http://www.toolheap.com/test-mail-server-tool/

No es realmente para TDD, pero útil en las pruebas manuales, ya que puede aparecer una ventana de Outlook Express con cada correo electrónico que lo haría ser enviado.

0

Como se ha señalado por Sean Carpenter, Papercut es un potente solución para el desarrollo local. Sin embargo, si también ejecuta un servidor de ensayo o prueba, mailtrap.io puede ser una solución más simple en general, porque puede usar el mismo enfoque para sus entornos de desarrollo y prueba.