2009-06-05 44 views
5

Tôi đang làm việc trên một dự án mà tôi phải xác thực máy chủ SMTP đã cho trong một người dùng hộp văn bản sẽ cung cấp chi tiết và sau đó anh ta sẽ nhấp vào nút kiểm tra. Tôi muốn kiểm tra xem máy chủ được nhập bởi người dùng có phải là Máy chủ Smtp hay không?Cách xác thực máy chủ SMTP

Bất kỳ ý tưởng nào ??

Trả lời

5

Cố gắng kết nối với cổng SMTP và đảm bảo bạn lấy lại dòng từ bắt đầu bằng "220" và chứa các chữ cái "SMTP". Một ví dụ điển hình phản ứng sẽ là:

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

Sau đó, hãy lịch sự và gửi "QUIT \ r \ n" để ngắt kết nối.

Bạn có thể thực hiện thêm một số thử nghiệm, nếu bạn muốn, chẳng hạn như thử nghiệm để người dùng có thể gửi tin nhắn. Đối với điều này, bạn sẽ gửi một lệnh HELO với tên máy chủ của bạn (hoặc bất kỳ chuỗi nào, thực sự), một lệnh MAIL FROM bằng địa chỉ e-mail của người dùng và RCPT TO:<[email protected]>. Hầu hết các máy chủ tại thời điểm đó sẽ cho bạn biết nếu chuyển tiếp không được phép. (Tôi cho rằng bạn đang thực hiện việc này từ máy tính mà sau này bạn sẽ gửi thư.) Miễn là bạn QUIT sau đó, thay vì phát hành lệnh DATA và dữ liệu tin nhắn, sẽ không có nội dung nào được gửi.

Đây là phiên ví dụ, được thực hiện từ trình bao bằng lệnh "netcat", cho biết máy chủ của tôi tồn tại, nhưng sẽ không chuyển tiếp thư cho những người từ địa chỉ IP ngẫu nhiên.

 
    $ 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

Như đã nói, hãy thử kết nối và kiểm tra xem bạn có thể mở cổng không. Sau đó, hãy xem nếu bạn có một phản ứng, nhưng nếu cấu hình một máy chủ sẽ không gửi cho bạn ban đầu một cái gì đó. Vì vậy, để chắc chắn đầu tiên bắt đầu bằng lệnh 'HELO' hoặc 'EHLO' và kiểm tra phản hồi của nó. Bất kỳ lệnh nào khác bạn có thể thử để kiểm tra được liệt kê trong RFC 821, 2821 và 5321. – Oliver

+1

Một máy chủ ban đầu sẽ gửi cho bạn một dòng 220 ngay sau khi bạn kết nối. Tôi đã thêm một ví dụ ở trên để làm cho điều này rõ ràng hơn. –

+0

Hi Curt này là thực sự nhưng tôi có thể làm theo phần đầu tiên đúng cách nhưng tôi không thể hiểu được RCPT đồng bộ TO: <[email protected]> bạn có thể cung cấp cho một số mã trong C# cho việc này không. –

6

Bạn có thể muốn cải thiện mã nhanh này với xử lý ngoại lệ phù hợp và có thể đặt thời gian chờ. IP bắt tay.

Và gửi lệnh QUIT như Curt được đề xuất sẽ tốt đẹp.

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

Nếu bạn không muốn chờ đợi nhiều, hãy đặt smtpTest.ReceiveTimeout = 500; – ulrichb

+0

Cảm ơn - điều này gần như đã làm việc cho POP - chỉ cần cổng và thay vì 220, tôi tìm kiếm + OK. –

Các vấn đề liên quan