2012-07-14 6 views
5

Obecnie pracuję nad utworzeniem własnego serwera SMTP dla projektu, nad którym pracuję.Uzyskiwanie nieoczekiwanej odpowiedzi z innego miejsca niż mój program za pomocą serwera SMTP

To wszystko prawie działa, z wyjątkiem sytuacji, gdy wprowadzam dane, otrzymuję odpowiedź od czegoś innego, co nie jest moim programem.

Za wykonanie testu uruchamiam program, który łączy się z adresem IPAddress. Any i na porcie 25 dla smtp. Korzystam wtedy z telnetu z mojego lokalnego komputera, aby przetestować, czy wysyłam prawidłowe odpowiedzi. Robiąc to, włączyłem debugowanie i przechodzenie przez kod, aby zobaczyć, co robi mój program.

  • Po podłączeniu wysłać 220 with my domain name
  • Kiedy telnet wysyła EHLO I odesłać 250 with my domain name
  • Od telnet wyślę MAIL FROM: [email protected] i odesłać 250 2.1.0 OK
  • Od telnet wyślę RCPT TO: [email protected] i wyślę wróć 250 2.1.5 OK

To tutaj zaczynają się dziwne rzeczy, Od telnet wyślę DATA gotowy do głównej wiadomości e-mail oraz w kodzie mam ma być wysłanie 354 End data with <CR><LF>.<CR><LF> ale zamiast ja dostaję odpowiedź 354 please start mail input.

Od wszystkich kroków, zanim dane Visual Studio wszedł do trybu debugowania tak Mógłbym przejść, ale po wejściu do DATA visual studio nie zareagowało tak, jak gdyby mój program nigdy nie otrzymał niczego, a zamiast tego poszedł gdzie indziej.

Nie mam pojęcia, skąd to pochodzi, nie mam innego serwera SMTP działającego na moim komputerze.

Poniżej znajduje się kod używam

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

Jak widać z kodu odpowiedź start mail input nie jest w moim kodu, więc nie mam pojęcia, gdzie to pochodzi.

Dzięki za wszelką pomoc można zapewnić

UPDATE Właśnie dowiedziałem się, że coś jest nieco dziwne. Jeśli uruchomię serwer SMTP i telnet na tym samym komputerze, tj. telnet localhost 25, to działa poprawnie, a ja otrzymuję koniec 354 z <CR><LF>.<CR><LF>, jednak jeśli wykonam telnet z oddzielnego serwera, tj. telnet 192.168.1.74 25, otrzymam numer 354 please start mail input. To jest takie samo, niezależnie od tego, czy jest to w systemie Windows czy Linux, nie mam pojęcia, dlaczego generuje tę odpowiedź, ponieważ w kodzie tej odpowiedzi nie ma miejsca, a serwer SMTP nie działa, gdy zatrzymuję program i próbuję i połączyć się z telnetem na porcie 25 Otrzymuję komunikat o błędzie połączenia.

UPDATE 2 W teście zmieniłem kod tak zamiast z telnet wchodzącego DATA dla wiadomości wchodzę MYTEST, kiedy używany MYTEST mój program otrzymuje wiadomość, że jestem wysyłanie i mój program działa zgodnie z oczekiwaniami, to tylko wtedy, gdy w programie używam DATA, czyli tego, czego oczekuje się od SMTP, którego mój program nie otrzymuje, i otrzymuję odpowiedź od czegoś innego. Zrobiłem skanowanie sieci, aby sprawdzić, czy w sieci jest coś jeszcze działającego jako serwer SMTP, ale nic nie znaleziono.

UPDATE 3 Ja również właśnie okazało się, że problem mam z wysyłając dane nie są odbierane przez mój program poprzez telnet jest tylko w systemie Windows do zdalnego systemu Windows. Jeśli telnetuję z serwera linuksowego do serwera SMTP działającego w systemie Windows, działa dobrze, to tylko wtedy, gdy telnetuję z Windows, że mam problem z poleceniem DATA.

UPDATE 4 wykonali test i okazało się, że to nie jest specyficzne dla Windows, ale moich maszynach stacjonarnych i rozwoju laptop. Zainstalowałem pustą maszynę wirtualną w systemie Windows 7 i jeśli telnetuję do siebie, tj. Localhost, to działa dobrze, jeśli telnetuję z mojego komputera PC na maszynę wirtualną, otrzymuję nieoczekiwaną odpowiedź i nie przechodzi ona przez mój program. Chyba musi być coś na moim laptopie i komputerze, który słucha w pewien sposób ruchu smtp, nie wiem jak jak wtedy, gdy mój program nie działa Nie jestem w stanie połączyć się z portem 25. Jedyne co mogę pomyśleć czy mam zainstalowany program Symantec Norton 360, ale wyłączyłem zaporę, program antywirusowy i antyspam i nie zrobiłem żadnej różnicy.

+0

jeśli nie * uruchamiasz swój program i telnet do portu 25 dostaniesz odpowiedź? –

+0

@ Michael Edenfield nie, nie, jeśli spróbuję i telnet do portu 25, podczas gdy mój program nie działa, otrzymuję '' Łączenie z localhost ... Nie można otworzyć połączenia z hostem, na porcie 25: Connect failed'' zgodnie z oczekiwaniami – Boardy

+0

@MichaelEdenfield, właśnie się dowiedziałem, że jeśli wykonuję lantrace na moim kliencie i serwerze, widzę pakiety dla wszystkiego, w tym EHLO, MAIL FROM, RCPT TO, ale kiedy wprowadzam DANE, żadne z nich się nie wyświetla w sieci LAN – Boardy

Odpowiedz

0

Właśnie znalazłem problem. Udowodniłem, że program Symantec Norton 360 pobiera dane wejściowe, gdy dane są wysyłane za pośrednictwem klienta smtp. Z jakiegoś powodu nawet wyłączenie nortona, w tym antyspamu, nie wydaje się mieć znaczenia. W ustawieniach antyspamowych znajduje się sekcja chronionych portów i dodano port 25, ale nie wydaje mi się, żebym chciał usunąć port. Jednakże, ponieważ mój program pozwala na konfigurację portu smtp, jeśli zmienię go na inny port, np. Port 26, mój program będzie działał poprawnie.

Dzięki za pomoc i sugestie.

+0

Tak właśnie myślałem;) – Guillaume

+0

To trochę dziwne, ale wyłączenie wszystkiego na tym nie ma znaczenia i nie można go wyłączyć, patrząc na port smtp. – Boardy