I found that there is a problem with reading buffer from pop3 server. I modify the POPClient class to make it work properly:
/// <summary> /// get messages info /// </summary> /// <param name="messageNumber">message number</param> /// <returns>Message object</returns> public Message GetMessageHeader(int messageNumber) { writer.WriteLine("TOP "+messageNumber+" 0"); //string tmp=Receive(); //delete +OK (3 chars) and create message Message message=new Message(ReceiveContent(-1).Substring(3),true); return message; }
/// <summary> /// read stream content /// </summary> /// <param name="contentLength">length of content to read</param> /// <returns>content</returns> private string ReceiveContent(int contentLength) { // char []temp=new char[contentLength]; // reader.ReadBlock(temp,0,contentLength); // response=new string(temp); // reader.ReadLine(); // return new Message(response); string response=null; StringBuilder builder = new StringBuilder(); builder.EnsureCapacity(contentLength); //reader.ReadToEnd(); response = reader.ReadLine(); int intLines=0; while (response.IndexOf(".")!=0)// && len<contentLength) { builder.Append(response + "\r\n"); intLines+=1; response = reader.ReadLine(); if((intLines % 50)==0) //make an interval pause to ensure response from server Thread.Sleep(1); }
return builder.ToString();
}
/// <summary> /// get message info /// </summary> /// <param name="number">message number on server</param> /// <returns>Message object</returns> public Message GetMessage(int number) { writer.WriteLine("RETR " + number);
string response=reader.ReadLine(); int messageSize=0;
if(GetCommand(response)!=strOK) return null;
try { messageSize=Convert.ToInt32(GetParameters(response)[0]); } catch(Exception e) { Utility.LogError("GetMessage():"+e.Message); return null; }
// char []temp=new char[messageSize]; // reader.ReadBlock(temp,0,messageSize); // response=new string(temp); // reader.ReadLine(); // return new Message(response); // StringBuilder builder = new StringBuilder(); // builder.EnsureCapacity messageSize; // response = reader.ReadLine(); // int len=0; // while (response.IndexOf(".")!=0 && len<messageSize) // { // builder.Append(response + "\r\n"); // len+=response.Length; // response = reader.ReadLine(); // } return new Message(ReceiveContent(messageSize),false); }
Log in to post a comment.
I found that there is a problem with reading buffer from pop3 server. I modify the POPClient class to make it work properly:
/// <summary>
/// get messages info
/// </summary>
/// <param name="messageNumber">message number</param>
/// <returns>Message object</returns>
public Message GetMessageHeader(int messageNumber)
{
writer.WriteLine("TOP "+messageNumber+" 0");
//string tmp=Receive();
//delete +OK (3 chars) and create message
Message message=new Message(ReceiveContent(-1).Substring(3),true);
return message;
}
/// <summary>
/// read stream content
/// </summary>
/// <param name="contentLength">length of content to read</param>
/// <returns>content</returns>
private string ReceiveContent(int contentLength)
{
// char []temp=new char[contentLength];
// reader.ReadBlock(temp,0,contentLength);
// response=new string(temp);
// reader.ReadLine();
// return new Message(response);
string response=null;
StringBuilder builder = new StringBuilder();
builder.EnsureCapacity(contentLength);
//reader.ReadToEnd();
response = reader.ReadLine();
int intLines=0;
while (response.IndexOf(".")!=0)// && len<contentLength)
{
builder.Append(response + "\r\n");
intLines+=1;
response = reader.ReadLine();
if((intLines % 50)==0) //make an interval pause to ensure response from server
Thread.Sleep(1);
}
return builder.ToString();
}
/// <summary>
/// get message info
/// </summary>
/// <param name="number">message number on server</param>
/// <returns>Message object</returns>
public Message GetMessage(int number)
{
writer.WriteLine("RETR " + number);
string response=reader.ReadLine();
int messageSize=0;
if(GetCommand(response)!=strOK)
return null;
try
{
messageSize=Convert.ToInt32(GetParameters(response)[0]);
}
catch(Exception e)
{
Utility.LogError("GetMessage():"+e.Message);
return null;
}
// char []temp=new char[messageSize];
// reader.ReadBlock(temp,0,messageSize);
// response=new string(temp);
// reader.ReadLine();
// return new Message(response);
// StringBuilder builder = new StringBuilder();
// builder.EnsureCapacity messageSize;
// response = reader.ReadLine();
// int len=0;
// while (response.IndexOf(".")!=0 && len<messageSize)
// {
// builder.Append(response + "\r\n");
// len+=response.Length;
// response = reader.ReadLine();
// }
return new Message(ReceiveContent(messageSize),false);
}