2009-06-05 4 views
5

Je travaille sur un projet où je dois valider le serveur SMTP donné i.e dans un textbox l'utilisateur fournira le détail et il cliquera sur un bouton de test. Je veux vérifier si le serveur entré par l'utilisateur est un serveur Smtp ou pas?Comment valider le serveur SMTP

Une idée?

Répondre

5

Essayez de vous connecter au port SMTP et assurez-vous de récupérer une ligne commençant par "220" et contenant les lettres "SMTP". Une réponse exemple typique serait:

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

Alors soyez poli et envoyer « QUIT \ r \ n » pour raccrocher.

Vous pouvez effectuer d'autres tests si vous le souhaitez, par exemple tester que l'utilisateur peut probablement envoyer des messages. Pour cela, vous devez envoyer une commande HELO avec votre nom d'hôte (ou n'importe quelle chaîne, en fait), une commande MAIL FROM en utilisant l'adresse e-mail de l'utilisateur, et une RCPT TO:<[email protected]>. À ce stade, la plupart des serveurs vous diront si le relais n'est pas autorisé. (Je suppose que vous faites ceci à partir de l'ordinateur à partir duquel vous enverrez plus tard le courrier.) Tant que vous QUIT après cela, plutôt que d'émettre une commande DATA et les données de message, rien ne sera envoyé.

Voici un exemple de session, réalisée à partir du shell en utilisant la commande "netcat", montrant que mon serveur existe, mais ne relaiera pas le courrier des personnes provenant d'adresses IP aléatoires.

 
    $ 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

Comme Curt l'a déjà dit, essayez une connexion et vérifiez si vous pouvez ouvrir un port. Alors jetez un oeil si vous avez une réponse, mais si configuré, un serveur ne vous enverra pas initialement quelque chose. Donc, pour être sûr, commencez par une commande 'HELO' ou 'EHLO' et vérifiez sa réponse. Toutes les autres commandes que vous pourriez essayer de vérifier sont listées dans les RFC 821, 2821 et 5321. – Oliver

+1

Un serveur vous enverra en effet initialement une ligne 220 dès que vous vous connecterez. J'ai ajouté un exemple ci-dessus pour le rendre plus clair. –

+0

Salut Curt c'est vraiment mais je peux bien suivre la première partie mais je ne suis pas capable de comprendre le syntx RCPT A: <[email protected]> peux-tu donner du code en C# pour ça. –

6

Vous pouvez améliorer ce code rapide avec la gestion des exceptions appropriée et peut-être mettre aussi les délais d'attente - il faut environ 15 secondes pour échouer si elle ne peut pas se connecter, mais cela pourrait être une limitation du TCP/Protocole de communication IP.

Et l'envoi d'une commande QUIT comme Curt suggéré serait bien.

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

Si vous ne voulez pas attendre autant, définissez smtpTest.ReceiveTimeout = 500; – ulrichb

+0

Merci - cela a fonctionné à peu près aussi pour POP - juste le port et au lieu de 220, je cherche + OK. –