Bonjours à tous et à toutes
Je m’essaye aujourd’hui à la lecture des messages en POP3 et j’ai un problème: lorsque j’envoie certaines requetes, la réponse du serveur est incorrecte, ou peut-etre je tente de lire la mauvaise réponse: exemple:
j’envoire RETR 1,et la réponse est la liste des messages, soit LIST, commande que j’ai envoyé juste avant. Faut-il que je laisse un peu de temps au serveur pour “souffler”?
Le bug apparait sur différents serveurs POP3, comme laposte.net ou ifrance.com
Voila le code
public string LastMessage;
public Session(string host,int port,string username,string password)
{
Host=host;
Port=port;
UserName=username;
Password=password;
}
private bool dataReady=false;
private string CurrentData;
public string ExecuteCommand(string command)
{
dataReady=false;
CurrentData="";
command+=System.Environment.NewLine;
byte[] data=System.Text.Encoding.ASCII.GetBytes(command.ToCharArray());
Buffer=new byte[client.ReceiveBufferSize];
stream.Write(data,0,data.Length);
stream.BeginRead(Buffer,0,client.ReceiveBufferSize,new AsyncCallback(ReceiveData),null);
while(dataReady==false)
{
Thread.Sleep(100);
}
return CurrentData;
}
private void ReceiveData( IAsyncResult ar )
{
CurrentData+=System.Text.Encoding.ASCII.GetString(Buffer);
dataReady=true;
}
private bool DoLogin()
{
try
{
client.Connect(Host,Port);
}
catch
{
LastMessage=“Erreur de connection avec le serveur”;
return false;
}
stream=client.GetStream();
if(TryCommand("user "+UserName)==false)
{
LastMessage=“Identifiant incorrect”;
return false;
}
if(TryCommand("pass "+Password)==false)
{
LastMessage=“Mot de passe incorrect”;
return false;
}
return true;
}
public bool Connect()
{
return DoLogin();
}
public bool Disconnect()
{
bool z=TryCommand(“QUIT”);
client.Close();
if(z==false)
LastMessage=“Erreur lors de la fermeture de la connection”;
return z;
}
public bool GetMessages()
{
if(Connect())
{
bool z=PrepareMessages();
if(z)
{
foreach(Message m in Messages)
{
m.Retrieve();
}
}
else
LastMessage=“Erreur lors de la vérification des messages”;
Disconnect();
return z;
}
else
{
return false;
}
}
private bool PrepareMessages()
{
string r;
r=ExecuteCommand(“LIST”);
if(CheckResponse®==true)
{
ArrayList list=ParseResponse®;
string[] minf;
int idx=0;
foreach(string s in list)
{
if(idx>0 & idx<list.Count-1)
{
minf=s.Split(’ ');
Messages.Add(new Message(this,minf[0],int.Parse(minf[1])));
}
idx++;
}
return true;
}
else
{
LastMessage=“Erreur lors de la requete de la liste de messages”;
return false;
}
}
public bool TryCommand(string command)
{
string s=ExecuteCommand(command);
return CheckResponse(s);
}
private string GetResponse()
{
byte[] bytes=new byte[client.ReceiveBufferSize];
int ret=stream.Read(bytes,0,bytes.Length);
string returndata=System.Text.Encoding.ASCII.GetString(bytes) ;
stream.Flush();
return returndata;
}
public bool CheckResponse(string response)
{
if(response.StartsWith("+OK"))
return true;
else
return false;
}
public static ArrayList ParseResponse(string response)
{
int idx=0;
int pos=-1;
int next=0;
ArrayList ret=new ArrayList();
while(next>(-1))
{
next=response.IndexOf(System.Environment.NewLine,pos+1);
if(next>-1)
ret.Add(response.Substring(pos+1,next-pos-1));
pos=next+1;
}
return ret;
}
}
public class Message
{
private Session session;
private string ID;
public int Length;
internal Message(Session s,string id,int lenght)
{
session=s;
ID=id;
Length=lenght;
}
public void Retrieve()
{
string m;
m=session.ExecuteCommand("retr " + ID);
ArrayList l=Session.ParseResponse(m);
}
}
[/quote]Une idée peut-etre?