2012-07-14 20 views
5

Actualmente estoy trabajando en la creación de mi propio servidor SMTP para un proyecto en el que estoy trabajando.Obteniendo una respuesta inesperada de algún lugar fuera de mi programa con el servidor SMTP

Todo funciona, excepto cuando ingreso datos, obtengo una respuesta de otra cosa que no es mi programa.

Para hacer la prueba estoy ejecutando mi programa que se une a IPAddress.Any y en el puerto 25 para smtp. Entonces estoy usando telnet desde mi PC local para probar que estoy enviando las respuestas correctas. Mientras hacía esto, activé la depuración y revisaba el código para ver qué estaba haciendo mi programa.

  • Cuando conecto envío un 220 with my domain name
  • Cuando telnet envía el EHLO que enviar de vuelta un 250 with my domain name
  • De telnet envío MAIL FROM: [email protected] y envío de vuelta 250 2.1.0 OK
  • De telnet envío RCPT TO: [email protected] y envío 250 2.1.5 OK

Ahora aquí es donde comienzan a suceder cosas extrañas, De telnet yo envío DATA listo para el mensaje de correo electrónico principal y en el código se supone que debo estar enviando un 354 End data with <CR><LF>.<CR><LF> sino consigo una respuesta de 354 please start mail input.

De todos los pasos antes de datos de Visual Studio entró en el modo de depuración de modo Podría pasar, pero al ingresar a DATA, el estudio visual no respondió como si mi programa nunca hubiera recibido nada y, en cambio, se fue a otra parte.

No tengo idea de dónde viene esto, no tengo otro servidor SMTP ejecutándose en mi PC.

A continuación se muestra el código que estoy utilizando

private void processSmtpReceived(TcpClient client) 
     { 
      stream = client.GetStream(); 
      reader = new StreamReader(stream); 
      writer = new StreamWriter(stream); 
      writer.NewLine = "\r\n"; 
      writer.AutoFlush = true; 

      //writer.WriteLine("220 localhost -- Fake proxy server"); 
      string line = ""; 
      string message = ""; 
      string subject = ""; 
      bool readingData = false; 
      if (client.Connected) 
      { 
       writer.WriteLine("220 localhost -- Fake proxy server"); 

       while ((line = reader.ReadLine()) != null && reader != null) 
       { 
        line = line.Replace("\b", ""); 
        if (readingData) 
        { 
         message += line; 
         if (line.Contains("Subject:")) 
         { 
          subject = line; 
         } 
         else if (line == ".") 
         { 
          writer.WriteLine("250 2.0.0 OK"); 
          readingData = false; 
         } 
        } 
        else if (line.Contains("EHLO")) 
        { 
         writer.WriteLine("250 OK localhost-workgroup"); 
        } 
        else if (line.Contains("MAIL FROM")) 
        { 
         writer.WriteLine("250 2.1.0 OK"); 
        } 
        else if (line.Contains("RCPT TO")) 
        { 
         writer.WriteLine("250 2.1.5 OK"); 
        } 
        else if (line.Contains("DATA")) 
        { 
         writer.WriteLine("354 End data with <CR><LF>.<CR><LF>"); 
         readingData = true; 
        } 
        else if (line == ".") 
        { 
         writer.WriteLine("250 2.0.0 OK"); 
        } 
        else if (line == "QUIT") 
        { 
         writer.WriteLine("221 2.0.0 Bye"); 
         Console.WriteLine("Message: " + message); 
        } 
        else 
        { 
         writer.WriteLine("250 OK"); 
        } 
        Console.WriteLine("Received: {0}", line); 
       } 
      } 

Como se puede ver en el código de la respuesta de start mail input no está en mi código para que ni idea de dónde está viniendo.

Gracias por cualquier ayuda que puede proporcionar

ACTUALIZACIÓN acaba de encontrar algo que es un poco raro. Si ejecuto el servidor SMTP y telnet en la misma máquina, es decir, telnet localhost 25, funciona correctamente, y obtengo el 354 final con <CR><LF>.<CR><LF>, sin embargo, si telnet desde un servidor diferente, es decir, telnet 192.168.1.74 25, obtengo el . Esto es lo mismo ya sea en Windows o Linux, no tengo idea de por qué está generando esta respuesta ya que no hay ningún lugar en el código donde se ingrese la respuesta, y no hay ningún servidor smtp funcionando como cuando detengo mi programa y pruebo y me conecto a telnet en el puerto 25 recibo el mensaje de conexión fallida.

ACTUALIZACIÓN 2 Como prueba de que ha cambiado el código de modo que en lugar de telnet entrar DATA para el mensaje Entro MYTEST, cuando solía MYTEST mi programa recibe el mensaje que estoy enviando y mi programa funciona como se espera, es solo cuando en el programa uso DATA, que es lo que se espera de SMTP que mi programa no lo reciba, y recibo la respuesta de otra cosa. He realizado una exploración de red para ver si hay algo más ejecutándose como servidor SMTP en algún lugar de mi red, pero no se ha encontrado nada.

ACTUALIZACIÓN 3 También acabo de conocer que el problema que estoy teniendo con el envío de datos no siendo recibido por mi programa a través de telnet es sólo en Windows a Windows remoto. Si uso telnet desde un servidor Linux al servidor smtp que se ejecuta en Windows, funciona bien, es solo si estoy contactando desde Windows que tengo el problema con el comando DATA.

ACTUALIZACIÓN 4 Hice una prueba y descubrí que no es específica de Windows, sino de mis máquinas de desarrollo de equipos de escritorio y portátiles. He instalado una máquina virtual en blanco con Windows 7 y si me hago telnet, es decir, localhost, funciona bien, si telnet desde mi PC de desarrollo a la máquina virtual recibo la respuesta inesperada y no pasa por mi programa. Supongo que debe haber algo en mi laptop y mi computadora de escritorio que escuche el tráfico smtp de alguna manera, no estoy seguro de cómo cuando mi programa no está en ejecución no puedo conectarme al puerto 25. Lo único que se me ocurre ¿Tengo Symantec Norton 360 instalado pero he desactivado el firewall, antivirus y antispam y no hice ninguna diferencia.

+0

si * no * está ejecutando su programa y telnet al puerto 25 ¿recibe una respuesta? –

+0

@MichaelEdenfield no, no, si intento y telnet en el puerto 25 mientras mi programa no se ejecuta, obtengo '' Conectando a localhost ... No se pudo abrir la conexión al host, en el puerto 25: Falló la conexión'' como esperaba – Boardy

+0

@MichaelEdenfield, también descubrí que si realizo un análisis de lantrace en mi cliente y servidor, puedo ver los paquetes de todo, incluidos EHLO, MAIL FROM, RCPT TO, pero cuando ingreso DATA ninguno de ellos se muestra en cualquier rastro de lan – Boardy

Respuesta

0

Acabo de descubrir el problema. He probado que Symantec Norton 360 parece tomar la entrada cuando DATA se envía a través del cliente smtp. Por alguna razón, incluso inhabilitar a Norton, incluido el antispam, no parece marcar la diferencia. Hay una sección en la configuración antispam para puertos protegidos y tiene el puerto 25 agregado, pero parece que no me permite eliminar el puerto. Sin embargo, como mi programa permite que el puerto smtp sea configurable, si lo cambio a un puerto diferente, es decir, al puerto 26, entonces mi programa funciona bien.

Gracias por su ayuda y sugerencias.

+0

Eso es lo que pensé;) – Guillaume

+0

Sí, es un poco extraño, aunque deshabilitar todo en él no hace ninguna diferencia y parece que no se puede desactivar mirando el puerto smtp. – Boardy

Cuestiones relacionadas