2009-06-05 14 views
5

को प्रमाणित करने के लिए कैसे करें मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मुझे दिए गए एसएमटीपी सर्वर को सत्यापित करना होगा iee टेक्स्टबॉक्स उपयोगकर्ता में विवरण प्रदान करेगा और फिर वह एक परीक्षण बटन पर क्लिक करेगा। मैं यह जांचना चाहता हूं कि उपयोगकर्ता द्वारा दर्ज किया गया सर्वर एक SMTP सर्वर है या नहीं?एसएमटीपी सर्वर

कोई विचार ??

उत्तर

5

एसएमटीपी पोर्ट से कनेक्ट करने का प्रयास करें, और सुनिश्चित करें कि आपको "220" से शुरू होने वाली रेखा से वापस मिल जाए और इसमें "SMTP" अक्षर शामिल हों। एक विशिष्ट उदाहरण प्रतिक्रिया होगा:

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

फिर विनम्र हो सकता है और भेजें "QUIT \ r \ n" लटका सकें।

यदि आप चाहें तो कुछ और परीक्षण कर सकते हैं, जैसे कि परीक्षण करने वाले उपयोगकर्ता संदेश दे सकते हैं। इसके लिए, आप उपयोगकर्ता के ई-मेल पते और RCPT TO:<[email protected]> का उपयोग करके अपने होस्टनाम (या किसी भी स्ट्रिंग, वास्तव में), MAIL FROM कमांड के साथ एक HELO आदेश भेजेंगे। उस बिंदु पर अधिकांश सर्वर आपको बताएंगे कि रिलेइंग की अनुमति नहीं है या नहीं। (मुझे लगता है कि आप इसे कंप्यूटर से कर रहे हैं, जिससे आप बाद में मेल भेज रहे होंगे।) जब तक आप DATA कमांड और संदेश डेटा जारी करने के बजाय, QUIT, संदेश डेटा को कुछ भी नहीं भेजा जाएगा।

"netcat" कमांड का उपयोग करके खोल से किया गया एक उदाहरण सत्र है, यह दर्शाता है कि मेरा सर्वर मौजूद है, लेकिन यादृच्छिक आईपी पते से लोगों के लिए मेल रिले नहीं करेगा।

 
    $ 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

जैसा कि कर्ट पहले से ही बताया गया है, एक कनेक्शन आज़माएं और जांचें कि क्या आप एक पोर्ट खोल सकते हैं। फिर अगर आपको कोई प्रतिक्रिया मिली तो देखो, लेकिन अगर कॉन्फ़िगर किया गया है तो सर्वर आपको प्रारंभ में कुछ नहीं भेजेगा। इसलिए सुनिश्चित करें कि पहले 'हेल्लो' या 'ईएचएलओ' कमांड से शुरू करें और इसकी प्रतिक्रिया जांचें। जांच के लिए आप कोशिश कर सकते हैं कि कोई और आदेश आरएफसी 821, 2821 और 5321 में सूचीबद्ध हैं। – Oliver

+1

एक सर्वर वास्तव में आपको कनेक्ट होने के तुरंत बाद 220 लाइन भेज देगा। मैंने इसे और स्पष्ट करने के लिए ऊपर एक उदाहरण जोड़ा है। –

+0

हाय कर्ट यह वास्तव में है लेकिन मैं पहले भाग का सही ढंग से पालन कर सकता हूं लेकिन मैं synatx आरसीपीटी को समझने में सक्षम नहीं हूं: <[email protected]> क्या आप इसके लिए सी # में कुछ कोड दे सकते हैं। –

6

आप उचित अपवाद हैंडलिंग और शायद यह भी समय समाप्ति की स्थापना के साथ इस त्वरित कोड पर सुधार करने के लिए चाहते हो सकता है - इसके बारे में 15 सेकंड लेता है विफल अगर यह कनेक्ट नहीं कर सकता लेकिन यह है कि टीसीपी की एक सीमा हो सकती है/आईपी ​​हैंडशेकिंग

और QUIT कमांड भेजकर कर्ट सुझाव दिया गया अच्छा होगा।

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

यदि आप इसे और अधिक इंतजार नहीं करना चाहते हैं, तो smtpTest.ReceiveTimeout = 500 सेट करें; – ulrichb

+0

धन्यवाद - यह लगभग पीओपी के लिए भी काम करता है - बस बंदरगाह और 220 के बजाय, मैं + ठीक दिखता हूं। –

संबंधित मुद्दे