2009-11-12 5 views
1

J'écris une application qui teste les adresses e-mail, pour une partie de cela, j'ai besoin d'envoyer une petite quantité de données à une adresse email pour la valider complètement, j'utilise actuellement des sockets pour cela. Pendant que je testais, j'ai utilisé un serveur SMTP d'amis pour tester, et mon socket fonctionnait bien, mais quand j'essayais la même chose sur un gros fournisseur d'email (gmail, hotmail, etc.) il n'en avait pas. Maintenant que j'en suis arrivé à la conclusion qu'il s'agit d'authentification et de sécurité, j'ai testé l'envoi d'un message à gmail en utilisant .Nets construit dans SmtpClient et divers objets Mail en utilisant SslEnabled et en lui donnant les informations d'identification demandées. travailler.C# SMTP Problèmes de socket

Ce que je dois accomplir est:

envoyer ces données sans avoir à fournir des détails de connexion purement agissant comme un échange. également un moyen d'encorper la sécurité SSL dans ma socket.

Toute aide avec tout cela serait géniale et appréciée! Code ci-dessous ...

/// <summary> 
    /// Opens up the socket and begins trying to connect to the provided domain 
    /// </summary> 
    /// <param name="domain">The domain listening on SMTP ports</param> 
    /// <param name="recipient">The email recipient</param> 
    /// <returns>Bool verifying success</returns> 
    public static bool ActivateSocket(string domain, string recipient) 
    { 
     //X509Certificate cert = new X509Certificate(); 

     //Prepare our first command 
     string SMTPcommand = "HELO www.codegremlin.co.uk\r\n"; 
     Encoding ASCII = Encoding.ASCII; 
     //convert to byte array and get the buffers ready 
     Byte[] ByteCommand = ASCII.GetBytes(SMTPcommand); 
     Byte[] RecvResponseCode = new Byte[3]; 
     Byte[] RecvFullMessage = new Byte[256]; 
     //method response value 
     bool TransactionSuccess = false; 



     try 
     { 
      // do all of this outside so its fresh after every iteration 
      Socket s = null; 
      IPEndPoint hostEndPoint; 
      IPAddress hostAddress = null; 
      int conPort = 587; 

      // get all the ip's assosciated with the domain 
      IPHostEntry hostInfo = Dns.GetHostEntry(domain); 
      IPAddress[] IPaddresses = hostInfo.AddressList; 

      // go through each ip and attempt a connection 
      for (int index = 0; index < IPaddresses.Length; index++) 
      { 
       hostAddress = IPaddresses[index]; 
       // get our end point 
       hostEndPoint = new IPEndPoint(hostAddress, conPort); 

       // prepare the socket 
       s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
       s.ReceiveTimeout = 2000; 
       s.SendTimeout = 4000; 
       try { s.Connect(hostEndPoint); } 
       catch { Console.WriteLine("Connection timed out..."); } 

       if (!s.Connected) 
       { 
        // Connection failed, try next IPaddress. 
        TransactionSuccess = false; 
        s = null; 
        continue; 
       } 
       else 
       { 
        // im going through the send mail, SMTP proccess here, slightly incorrectly but it 
        //is enough to promote a response from the server 

        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("MAIL FROM:[email protected]\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("RCPT TO:[email protected]\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("DATA\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("this email was sent as a test!\r\n.\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("SEND\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        ByteCommand = ASCII.GetBytes("QUIT\r\n"); 
        s.Send(ByteCommand, ByteCommand.Length, 0); 
        s.Receive(RecvFullMessage); 
        Console.WriteLine(ASCII.GetString(RecvFullMessage)); 

        int i = 0; 
        TransactionSuccess = true; 
       } 

      } 


     } 

     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException caught!!!"); 
      Console.WriteLine("Source : " + e.Source); 
      Console.WriteLine("Message : " + e.Message); 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("ArgumentNullException caught!!!"); 
      Console.WriteLine("Source : " + e.Source); 
      Console.WriteLine("Message : " + e.Message); 
     } 
     catch (NullReferenceException e) 
     { 
      Console.WriteLine("NullReferenceException caught!!!"); 
      Console.WriteLine("Source : " + e.Source); 
      Console.WriteLine("Message : " + e.Message); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception caught!!!"); 
      Console.WriteLine("Source : " + e.Source); 
      Console.WriteLine("Message : " + e.Message); 
     } 

     return TransactionSuccess; 

    } 
+0

Désolé, supprimé mon message car il était inexact. Merci pour les corrections, @Daniel A. White et @Storm – David

+0

Salut, quel est le but de ce code? Il ressemble à un épurateur de liste de diffusion à des fins de spam. De toute façon, je vous suggère de regarder l'erreur que vous recevez du serveur auquel vous vous connectez et d'en déduire une solution. Sans une indication claire du problème, il est difficile de suggérer des solutions. – Lazarus

+0

le but est purement la validation par courriel, im sur le bon côté de la guerre sur le spam: P – DevlopingTheNextGen

Répondre

2

Pourquoi essayez-vous d'implémenter cette fonctionnalité par vous-même?

Vous devriez réutiliser une implémentation existante de SMTP, sinon vous ne verrez jamais tous les détails des nombreuses RFC implémentées correctement.

Je vous suggère de jeter un second regard sur la classe SmtpClient, car elle semble faire exactement ce que vous voulez faire.

Encore une chose: Vous savez que le serveur SMTP auquel vous devez parler pour les adresses gmail n'est pas gmail.com, n'est-ce pas? Vous devez récupérer les enregistrements MX du DNS pour gmail.com et vous connecter à l'un de ceux-ci. En plus de cela, vous ne devez pas vous connecter directement à un SMTP pour distribuer du courrier. Vous ne réussirez pas si le serveur implémente graylisting et d'autres techniques de lutte contre le spam. Faites confiance au MTA de votre système pour envoyer des e-mails. Si vous implémentez cette fonction pour vérifier l'exactitude des adresses de messagerie, vous devez fournir une adresse FROM active et vérifier que cette boîte aux lettres ne renvoie pas de messages de votre MTA.

+0

merci pour la réponse rapide Je vais aborder ces points et vous faire savoir! – DevlopingTheNextGen