2010-10-05 4 views
2

J'ai essayé d'accéder à mon compte GMail pour récupérer les e-mails non lus de mon compte e-mail. Cependant, je ne fais que connectez-vous ... Tout ce qui après ne fonctionne pas.Envoyer des commandes IMAP à GMail en utilisant C#

Tout d'abord, je me connecte au serveur, puis envoie la commande de connexion et enfin la commande examiner. Le fait est que les réponses reçues ne concernent que la connexion et le login. Après cela, il arrête simplement d'attendre que quelque chose soit lu dans StreamReader.

try 
     { 
      // create an instance of TcpClient 
      TcpClient tcpclient = new TcpClient(); 
      // HOST NAME POP SERVER and gmail uses port number 995 for POP 
      //tcpclient.Connect("pop.gmail.com", 995); 
      tcpclient.Connect("imap.gmail.com", 993); 
      // This is Secure Stream // opened the connection between client and POP Server 
      SslStream sslstream = new SslStream(tcpclient.GetStream()); 
      // authenticate as client 

      sslstream.AuthenticateAsClient("imap.gmail.com"); 

      bool flag = sslstream.IsAuthenticated; // check flag 
      // Asssigned the writer to stream 
      System.IO.StreamWriter sw = new StreamWriter(sslstream); 
      // Assigned reader to stream 
      System.IO.StreamReader reader = new StreamReader(sslstream); 

      sw.WriteLine("tag LOGIN [email protected] pass"); 
      sw.Flush(); 

      sw.WriteLine("tag2 EXAMINE inbox"); 
      sw.Flush(); 

      sw.WriteLine("tag3 LOGOUT "); 
      sw.Flush(); 

      string str = string.Empty; 
      string strTemp = string.Empty; 
      try 
      { 
       while ((strTemp = reader.ReadLine()) != null) 
       { 
        Console.WriteLine(strTemp); 
        // find the . character in line 
        if (strTemp == ".") 
        { 
         //reader.Close(); 
         break; 
        } 
        if (strTemp.IndexOf("-ERR") != -1) 
        { 
         //reader.Close(); 
         break; 
        } 
        str += strTemp; 
       } 
      } 
      catch (Exception ex) 
      { 
       string s = ex.Message; 
      } 
      //reader.Close(); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
+0

(Peut-être un peu en retard, mais finalement une réponse au niveau du protocole ...) – dkarp

Répondre

1

Vous pouvez regarder en utilisant une bibliothèque IMAP/SSL à la place en conserve - il est celui qui est encore here actif.

This alternative n'est pas libre.

La base de l'un d'entre eux a source code that might be helpful puisque vous voulez lancer votre propre gestionnaire de protocole.

+0

je connaissais déjà ces deux mais mon principal objectif était d'apprendre comment communiquer avec un serveur IMAP ... –

+0

@Miguel - merci pour la clarification, voir edit –

1

Votre problème est que vous attendez des réponses POP d'un serveur IMAP. POP termine les messages récupérés avec . et répond aux autres commandes avec une ligne commençant par +OK ou -ERR. IMAP ne fait pas. Vous consommez toutes les réponses du serveur, puis vous attendez que quelque chose corresponde à votre analyseur de réponse de type POP. Si vous examinez les données renvoyées, vous devriez voir le reste des réponses du serveur à vos demandes (correctement formatées).

Il est possible que le serveur ne soit pas renvoyant des réponses à vos deuxième et troisième commandes. Cela pourrait être dû au fait que vous essayez de canaliser trois demandes; c'est-à-dire que vous envoyez les demandes sans attendre les réponses. Le serveur est obliged to allow pipelining while in the SELECTED state, mais le protocole ne garantit pas que vous pouvez effectuer des commandes de pipeline à partir de l'état NOT AUTHENTICATED.

+1

Aussi, l'espace de fin dans la commande 'LOGOUT' n'est pas autorisé, et donnera probablement un' tag3 BAD ... ' réponse. – dkarp

2

Je cherchais juste ce genre d'exemple "Hello World" pour me lancer. Avec l'aide des réponses de dkarp, voici mon avis sur l'exemple de Miguel:

 static void Main(string[] args) { 
     try { 
      TcpClient tcpclient = new TcpClient(); 
      tcpclient.Connect("imap.gmail.com", 993); 

      SslStream sslstream = new SslStream(tcpclient.GetStream()); 
      sslstream.AuthenticateAsClient("imap.gmail.com"); 

      if (sslstream.IsAuthenticated) { 
       StreamWriter sw = new StreamWriter(sslstream); 
       StreamReader sr = new StreamReader(sslstream); 

       sw.WriteLine("tag LOGIN [email protected] pass"); 
       sw.Flush(); 
       ReadResponse("tag", sr); 

       sw.WriteLine("tag2 EXAMINE inbox"); 
       sw.Flush(); 
       ReadResponse("tag2", sr); 

       sw.WriteLine("tag3 LOGOUT"); 
       sw.Flush(); 
       ReadResponse("tag3", sr); 
      } 
     } 
     catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    private static void ReadResponse(string tag, StreamReader sr) { 
     string response; 

     while ((response = sr.ReadLine()) != null) { 
      Console.WriteLine(response); 

      if (response.StartsWith(tag, StringComparison.Ordinal)) { 
       break; 
      } 
     } 
    } 
Questions connexes