2012-07-14 9 views
5

Attualmente sto lavorando per creare il mio server SMTP per un progetto su cui sto lavorando.Ottenere una risposta inaspettata da qualche parte al di fuori del mio programma con il server SMTP

È tutto praticamente funzionante tranne che quando inserisco i dati, ottengo una risposta da qualcos'altro che non è il mio programma.

Per eseguire il test, eseguo il mio programma che si collega a IPAddress.Any e sulla porta 25 per smtp. Quindi sto usando telnet dal mio PC locale per testare che sto inviando le risposte corrette. Mentre facevo questo ho acceso il debug e passando il codice per vedere cosa stava facendo il mio programma.

  • Quando collego mando un 220 with my domain name
  • Quando telnet invia il EHLO rimando un 250 with my domain name
  • Da telnet mando MAIL FROM: [email protected] e rimando 250 2.1.0 OK
  • Da telnet mando RCPT TO: [email protected] e mando indietro 250 2.1.5 OK

Ora è qui che iniziano le cose strane, Da telnet mando DATA pronto per il messaggio di posta elettronica principale e nel codice che dovrei essere l'invio di un 354 End data with <CR><LF>.<CR><LF> ma invece ottengo una risposta di 354 please start mail input.

Da tutti i passaggi prima che i dati di Visual Studio è andato in modalità di debug in modo Potrei fare un passo avanti ma quando entri in DATA, lo studio visivo non risponde come se il mio programma non avesse mai ricevuto nulla e invece andasse da qualche altra parte.

Non ho idea da dove provenga, non ho altri server SMTP in esecuzione sul mio PC.

Di seguito è il codice che sto usando

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); 
       } 
      } 

Come si può vedere dal codice della risposta di start mail input non è nel mio codice in modo da alcuna idea di dove questo proviene.

Grazie per tutto l'aiuto che si può offrire

UPDATE Abbiamo appena scoperto qualcosa che è un po 'strano. Se eseguo il server SMTP e il telnet sulla stessa macchina, ovvero telnet localhost 25, funziona correttamente e ottengo la fine 354 con <CR><LF>.<CR><LF>, tuttavia se si effettua il telnet da un server separato, ad esempio telnet 192.168.1.74 25, viene visualizzato 354 please start mail input. Questo è lo stesso sia che si tratti di Windows o Linux, non ho idea del motivo per cui sta generando questa risposta in quanto non c'è dove nel codice viene inserita la risposta, e non c'è nessun server smtp in esecuzione come quando interrompo il mio programma e provo e connettersi a telnet sulla porta 25 Ricevo il messaggio di connessione non riuscita.

UPDATE 2 Come test ho cambiato il codice in modo, invece di telnet entrare DATA per il messaggio io entro MYTEST, quando ho usato MYTEST mio programma riceve il messaggio che mando e il mio programma funziona come previsto, è solo quando nel programma utilizzo DATA, che è ciò che è previsto per SMTP che il mio programma non lo riceve, e ottengo la risposta da qualcos'altro. Ho fatto una scansione di rete per vedere se c'è qualcos'altro in esecuzione come un server SMTP da qualche parte sulla mia rete, ma non viene trovato nulla.

UPDATE 3 ho anche appena scoperto che il problema che sto avendo con l'invio di dati non vengono ricevuti dal mio programma attraverso telnet è solo su Windows a Windows remoto. Se io telnet da un server linux al server smtp in esecuzione su Windows funziona bene, è solo se sto telneting da Windows che ho il problema con il comando DATA.

UPDATE 4 Hanno eseguito un test e scoperto che non è specifico per Windows ma per le macchine di sviluppo desktop e laptop. Ho installato una VM vuota con Windows 7 e se ho telnet a se stessa, cioè localhost funziona bene, se ho telnet dal mio PC di dev alla macchina virtuale, ottengo la risposta inaspettata e non passa attraverso il mio programma. Suppongo che ci sia qualcosa sul mio laptop e desktop che ascolta il traffico smtp in qualche modo, non so come quando il mio programma non è in esecuzione, non sono in grado di connettermi alla porta 25. L'unica cosa che posso pensare è che ho installato Symantec Norton 360, ma ho disattivato il firewall, l'antivirus e l'antispam e non ho fatto alcuna differenza.

+0

se * non * sta eseguendo il programma e si telnet sulla porta 25 si ottiene una risposta? –

+0

@MichaelEdenfield no I don ', t se provo e telnet alla porta 25 mentre il mio programma non è in esecuzione, mi viene richiesto '' Connessione a localhost ... Impossibile aprire la connessione all'host, sulla porta 25: Connect failed'' come previsto – Boardy

+0

@MichaelEdenfield, ho anche appena scoperto che se eseguo una lantrace sul mio client e server, posso vedere i pacchetti per tutto incluso EHLO, MAIL FROM, RCPT TO ma quando inserisco i DATI nessuno dei due viene mostrato su entrambe le tracce LAN – Boardy

risposta

0

Ho appena scoperto il problema. Ho dimostrato che Symantec Norton 360 sembra prendere l'input quando DATA viene inviato tramite il client smtp. Per qualche ragione anche disabilitare Norton incluso l'antispam non sembra fare la differenza. C'è una sezione nelle impostazioni anti-spam per le porte protette e ha aggiunto la porta 25 ma non sembra che mi voglia di rimuovere la porta. Tuttavia, poiché il mio programma consente di configurare la porta smtp, se la cambio in una porta diversa, ad esempio la porta 26, il mio programma funziona correttamente.

Grazie per il vostro aiuto e suggerimenti.

+0

Questo è quello che pensavo;) – Guillaume

+0

Sì, è un po 'strano anche se disabilitare tutto su di esso non fa alcuna differenza e non riesci a essere in grado di disabilitarlo guardando la porta smtp. – Boardy

Problemi correlati