2009-06-05 31 views
5

Estoy trabajando en un proyecto donde tengo que validar el servidor SMTP dado, es decir, en un cuadro de texto, el usuario proporcionará los detalles y luego hará clic en un botón de prueba. Quiero comprobar si el servidor ingresado por el usuario es un servidor Smtp o no?Cómo validar el servidor SMTP

¿Alguna idea ??

Respuesta

5

Intente conectarse al puerto SMTP y asegúrese de obtener una línea que comienza con "220" y contiene las letras "SMTP". Una respuesta típica ejemplo sería:

220 prod.monadic.cynic.net ESMTP Postfix (2.5.5) 

entonces ser educado y enviar "QUIT \ r \ n" para colgar.

Puede hacer algunas pruebas adicionales, si lo desea, como las pruebas de que el usuario probablemente pueda entregar mensajes. Para esto, enviaría un comando HELO con su nombre de host (o cualquier cadena, realmente), un comando MAIL FROM usando la dirección de correo electrónico del usuario, y un RCPT TO:<[email protected]>. La mayoría de los servidores en ese momento le dirán si la retransmisión no está permitida. (Supongo que está haciendo esto desde la computadora desde la que luego enviará el correo). Siempre y cuando QUIT después de eso, en lugar de emitir un comando DATA y los datos del mensaje, no se enviará nada.

Aquí hay una sesión de ejemplo, hecha desde el shell usando el comando "netcat", que muestra que mi servidor existe, pero no retransmite correo para personas desde direcciones IP aleatorias.

 
    $ nc prod.monadic.cynic.net. 25 
    220 prod.monadic.cynic.net ESMTP Postfix (2.5.5) 
    HELO cynic.net 
    250 prod.monadic.cynic.net 
    MAIL FROM:<[email protected]> 
    250 2.1.0 Ok 
    RCPT TO:<[email protected]> 
    554 5.7.1 <[email protected]>: Relay access denied 
    QUIT 
    221 2.0.0 Bye 
    $ 
+1

Como ya le han dicho a Curt, intente una conexión y compruebe si puede abrir un puerto. Luego, eche un vistazo si recibió una respuesta, pero si está configurado, un servidor no le enviará inicialmente algo. Entonces, para estar seguro, primero comience con un comando 'HELO' o 'EHLO' y verifique su respuesta. Cualquier comando adicional que pueda probar para verificar se detalla en RFC 821, 2821 y 5321. – Oliver

+1

Un servidor inicialmente le enviará una línea 220 tan pronto como se conecte. He agregado un ejemplo arriba para aclarar esto. –

+0

Hola Curt esto es realmente pero puedo seguir la primera parte correctamente pero no puedo entender el synatx RCPT TO: <[email protected]> ¿puedes dar algún código en C# para esto? –

6

Es posible que desee mejorar en este código de forma rápida con el manejo de excepciones adecuada y tal vez también configurar los tiempos de espera - se tarda unos 15 segundos para fallar si no se podrá conectar, pero que podría ser una limitación del protocolo TCP/Apretón de manos de IP.

Y enviar un comando QUIT como sugirió Curt sería bueno.

private bool ValidSMTP(string hostName) 
{ 
    bool valid = false; 
    try 
    { 
     TcpClient smtpTest = new TcpClient(); 
     smtpTest.Connect(hostName, 25); 
     if (smtpTest.Connected) 
     { 
      NetworkStream ns = smtpTest.GetStream(); 
      StreamReader sr = new StreamReader(ns); 
      if (sr.ReadLine().Contains("220")) 
      { 
       valid = true; 
      } 
      smtpTest.Close(); 
     } 
    } 
    catch 
    { 

    } 
    return valid; 
} 
+2

Si no desea esperar tanto, configure smtpTest.ReceiveTimeout = 500; – ulrichb

+0

Gracias, esto también funciona para POP, solo puerto y en lugar de 220, busco + OK. –

Cuestiones relacionadas