2012-07-14 3 views
5

현재 작업중인 프로젝트에 대한 자체 SMTP 서버를 만들고 있습니다.SMTP 서버로 프로그램 외부의 예기치 않은 응답 받기

데이터를 입력 할 때를 제외하고 모두 거의 작동하지만 내 프로그램이 아닌 다른 것에서 응답을받습니다.

테스트를 수행하기 위해 나는 IPAddress.Any에 바인드하고 smtp에 대해 포트 25에 프로그램을 실행하고 있습니다. 그런 다음 로컬 PC의 텔넷을 사용하여 올바른 응답을 보내고 있는지 테스트하고 있습니다. 이렇게하는 동안 디버그를 켜고 코드를 단계적으로 실행하여 내 프로그램이 무엇을하고 있는지 확인했습니다. 내가 보내는 연결하면 텔넷을 보낼 때

  • 220 with my domain name
  • EHLO는 내가 MAIL FROM: [email protected] 보내고 나는 텔넷에서 다시 250 2.1.0 OK
  • 보내 내가 RCPT TO: [email protected] 보내고 내가 보내 텔넷에서을 250 with my domain name
  • 다시 보내 뒤로 250 2.1.5 OK

이제는 이상한 일이 일어나기 시작합니다.텔넷에서나는 내가 354 End data with <CR><LF>.<CR><LF>을 보낼 예정하고 있지만 데이터 비주얼 스튜디오 그렇게 디버그 모드로 들어가기 전에 대신 내가 모든 단계에서 354 please start mail input.

의 응답을 주 전자 메일 메시지 및 코드의 준비 DATA을 보내 단계를 밟을 수 있었지만 DATA 입력시 비주얼 스튜디오는 내 프로그램이받은 적이없는 것처럼 반응하지 않았으며 대신 다른 곳으로갔습니다.

나는 이것이 어디에서 왔는지 전혀 모르겠다. 나는 내 PC에서 다른 SMTP 서버를 실행하고 있지 않다. 다음은

start mail input의 응답이 내 코드에서이에서오고 그래서 생각하지 않습니다 코드에서 볼 수 있듯이 내가

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

을 사용하고있는 코드입니다. 당신이

UPDATE 를 제공 할 수있는 모든 도움을

덕분에 조금 이상한 뭔가를 발견했다. SMTP 서버와 텔넷을 동일한 머신 (예 : telnet localhost 25)에서 실행하면 올바르게 작동하지만 <CR><LF>.<CR><LF>으로 354 끝을 얻을 수 있습니다. 단, 별도의 서버 (예 : telnet 192.168.1.74 25)에서 텔넷을 보내면 354 please start mail input이 표시됩니다. 이 질문은 Windows 또는 Linux에 관계없이 동일합니다. 응답이 입력되는 코드가 없기 때문에이 응답을 생성하는 이유를 알 수 없습니다. 프로그램을 중지 할 때 실행되는 SMTP 서버가 없으므로 시도 할 필요가 없습니다. 포트 25의 텔넷에 연결합니다. 연결 실패 메시지가 나타납니다.

업데이트 2 테스트로서 나는, 내 프로그램은 내가 발송하고있는 메시지를 수신 MYTEST 사용 나는 MYTEST 입력 메시지에 대한 DATA를 입력 텔넷에서 그렇게하는 대신 코드를 변경하고 내 프로그램이 기대 작품으로 프로그램에서 데이터를 사용할 때만 SMTP가 내 프로그램에서 수신하지 못하는 것으로 예상되며, 다른 응답을받습니다. 내 네트워크의 다른 곳에서 SMTP 서버로 실행중인 것이 있는지 확인하기 위해 네트워크 검사를 수행했지만 아무것도 발견되지 않았습니다.

UPDATE 3 나는 또한 그냥 데이터가 텔넷을 통해 내 프로그램에 의해 수신되지 보내와 데 문제는 원격 Windows의 Windows에있는 것을 발견했습니다. Linux 서버에서 Windows에서 실행중인 smtp 서버로 telnet을 실행하면 DATA 명령에 문제가있는 창에서 telneting하는 경우에만 제대로 작동합니다.

업데이트 4 테스트를 완료 한 결과 Windows는 아니지만 데스크톱 및 랩톱 개발 컴퓨터임을 확인했습니다. 비어있는 VM을 Windows 7에 설치했는데 telnet으로 로컬 호스트에 연결하면 localhost로 작동합니다. 내 dev PC에서 가상 컴퓨터로 telnet하면 예기치 않은 응답이 나타나고 프로그램을 거치지 않습니다. 나는 내 노트북과 데스크탑 모두에서 어떤 방식 으로든 smtp 트래픽을 청취하는 무언가가 있어야하며 내 프로그램이 실행되고 있지 않을 때 포트 25에 연결할 수없는 방법을 확신하지 못한다. 내가 생각할 수있는 유일한 방법은 시만텍 노턴 360을 설치 했는데도 방화벽, 안티 바이러스 및 스팸 방지 기능을 비활성화하고 아무런 차이가 없습니다.

+0

* 프로그램을 실행하지 않고 포트 25로 telnet하면 회신합니까? –

+0

@MichaelEdenfield 아니오 프로그램을 실행하지 않는 동안 25 번 포트로 텔넷 연결을 시도하면 연결이되지 않습니다. "로컬 호스트에 연결 중 ... 포트 25에서 호스트에 연결할 수 없습니다 : 연결에 실패했습니다." 예상대로 – Boardy

+0

@MichaelEdenfield, 나는 또한 클라이언트와 서버에서 lantrace를 수행하면 EHLO, MAIL FROM, RCPT TO를 포함한 모든 패킷을 볼 수 있지만 데이터를 입력하면 어느 것도 표시되지 않는다는 것을 알았습니다 어느 하나의 추적에 – Boardy

답변

0

방금 ​​문제가 발견되었습니다. 나는 Symantec Norton 360이 DATA가 smtp 클라이언트를 통해 전송 될 때 입력을받는 것으로 보인다. 어떤 이유로 안티 스팸을 포함하여 노턴 (Norton)을 사용하지 않도록 설정해도 차이가없는 것처럼 보입니다. 스팸 방지 설정에는 보호 된 포트에 대한 섹션이 있으며 포트 25가 추가되었지만 포트를 제거하지는 않습니다. 그러나 내 프로그램으로 smtp 포트를 구성 할 수 있으므로 다른 포트 즉 포트 26로 변경하면 프로그램이 정상적으로 작동합니다.

도움과 의견을 보내 주셔서 감사합니다.

+0

그건 내가 생각한거야;) – Guillaume

+0

그래, 그게 조금 이상하지만 그것의 모든 것을 무력화 시키면 아무런 차이가 없으며 SMTP 포트를보고 사용을 중지 할 수없는 것처럼 보일 수 있습니다. – Boardy