2009-06-05 38 views
5

Ich arbeite an einem Projekt, wo ich den angegebenen SMTP-Server validieren muss, d. H. In einem Textfeld Benutzer wird das Detail bereitstellen und dann wird er auf eine Testschaltfläche klicken. Ich möchte überprüfen, ob der vom Benutzer eingegebene Server ein Smtp-Server ist oder nicht?So validieren Sie SMTP-Server

Irgendeine Idee ??

Antwort

5

Versuchen Sie, eine Verbindung mit dem SMTP-Port herzustellen, und stellen Sie sicher, dass Sie eine Zeile zurück erhalten, die mit "220" beginnt und die Buchstaben "SMTP" enthält. Ein typisches Beispiel Antwort wäre:

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

Dann höflich sein und „QUIT \ r \ n“ aufzuhängen senden.

Sie können weitere Tests durchführen, wenn Sie möchten, z. B. testen, ob der Benutzer wahrscheinlich Nachrichten übermitteln kann. Dazu senden Sie einen HELO-Befehl mit Ihrem Hostnamen (oder einer beliebigen Zeichenfolge), einem MAIL FROM-Befehl mit der E-Mail-Adresse des Benutzers und einer RCPT TO:<[email protected]>. Die meisten Server an diesem Punkt werden Ihnen sagen, ob das Relaying nicht erlaubt ist. (Ich gehe davon aus, dass Sie dies von dem Computer aus tun, von dem Sie später E-Mails senden werden.) So lange Sie QUIT danach, anstatt einen DATA Befehl und die Nachricht Daten, wird nichts gesendet werden.

Hier ist eine Beispielsitzung, die von der Shell aus mit dem Befehl "netcat" ausgeführt wird und anzeigt, dass mein Server existiert, aber keine E-Mails für Personen von zufälligen IP-Adressen weiterleitet.

 
    $ 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

Wie Curt bereits gesagt, versuchen Sie eine Verbindung und prüfen Sie, ob Sie einen Port öffnen können. Dann schaue nach, ob du eine Antwort bekommen hast, aber falls konfiguriert, wird dir ein Server anfangs nichts senden. Beginnen Sie also mit einem 'HELO' oder 'EHLO' Befehl und überprüfen Sie die Antwort. Weitere Befehle, die Sie für die Überprüfung versuchen könnten, sind in RFC 821, 2821 und 5321 aufgeführt. – Oliver

+1

Ein Server sendet Ihnen tatsächlich in der Tat eine 220-Linie, sobald Sie eine Verbindung herstellen. Ich habe ein Beispiel oben hinzugefügt, um dies klarer zu machen. –

+0

Hi Curt das ist wirklich, aber ich kann den ersten Teil richtig folgen, aber ich bin nicht in der Lage, die synatx RCPT zu verstehen: <[email protected]> können Sie etwas Code in C# dafür geben. –

6

Sie könnten auf diesem schnellen Code mit dem richtigen Ausnahmebehandlung verbessern wollen und vielleicht auch den Timeouts einstellen - es etwa 15 Sekunden dauert, zum Scheitern verurteilt, wenn es keine Verbindung herstellen kann, aber das könnte eine Einschränkung des TCP sein/IP-Handshake.

Und senden Sie einen QUIT Befehl wie Curt vorgeschlagen wäre nett.

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

Wenn Sie nicht so lange warten möchten, setzen Sie smtpTest.ReceiveTimeout = 500; – ulrichb

+0

Danke - das funktioniert grob auch für POP - nur Port und statt 220 suche ich nach + OK. –

Verwandte Themen