Introduction
in this article, I'll show you how to retrieve mail from POP server based on RFC 1725.

Algorithm for Retrieving Mail
to retrieve mail from POP server, I just follow rule of RFC 1725. You also can download that paper (RFC 1725).

 
here's the algorithm:  

 Client   : +OK Server POP  Ready!!

 Client   : USER xxx

 Server   : +OK

 Client   : PASS yyy

 Server   : +OK user successfully logged on

 Client   : STAT

 Server   : +OK n m

 Client   : RETR 1

 Server   : +OK

               ---{ data }-----

 Client   : QUIT

 Server   : +OK Server POP signing off
Implementation
it's easy to implement an application if we know the algorithm to retrieve mail from a POP server. In this article, I use the TcpClient and NetworkStream classes. Firstly, declare public variables:

 public TcpClient Server;

 public NetworkStream NetStrm;

 public StreamReader  RdStrm;

 public string Data;

 public byte[] szData;

 public string CRLF = "\r\n";


here's the code for when the Connect Button is clicked:

private void ConnectBtn_Click(object sender, System.EventArgs e)

{

    // change cursor into wait cursor

    Cursor cr = Cursor.Current;

    Cursor.Current = Cursors.WaitCursor;

 

    // create server POP3 with port 110

    Server = new TcpClient(POPServ.Text,110);

    Status.Items.Clear();

 

    try

    {

        // initialization

        NetStrm = Server.GetStream();

        RdStrm= new StreamReader(Server.GetStream());

        Status.Items.Add(RdStrm.ReadLine());

 

        // Login Process

        Data = "USER "+ User.Text+CRLF;

        szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

        NetStrm.Write(szData,0,szData.Length);

        Status.Items.Add(RdStrm.ReadLine());

 

        Data = "PASS "+ Passw.Text+CRLF;

        szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

        NetStrm.Write(szData,0,szData.Length);

        Status.Items.Add(RdStrm.ReadLine());

 

        // Send STAT command to get information ie: number of mail and size

        Data = "STAT"+CRLF;

        szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

        NetStrm.Write(szData,0,szData.Length);

        Status.Items.Add(RdStrm.ReadLine());

 

        // change enabled - disabled button

        ConnectBtn.Enabled = false;

        DisconnectBtn.Enabled = true;

        RetrieveBtn.Enabled = true;

 

        // back to normal cursor

        Cursor.Current = cr;

 

    }

    catch(InvalidOperationException err)

    {

        Status.Items.Add("Error: "+err.ToString());

    }

}   


here's the code for when the Disconnect Button is clicked:

private void DisconnectBtn_Click(object sender, System.EventArgs e)

{

    // change cursor into wait cursor

    Cursor cr = Cursor.Current;

    Cursor.Current = Cursors.WaitCursor;

 

    // Send QUIT command to close session from POP server

    Data = "QUIT"+CRLF;

    szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

    NetStrm.Write(szData,0,szData.Length);

    Status.Items.Add(RdStrm.ReadLine());

 

    //close connection

    NetStrm.Close();

    RdStrm.Close();

 

    // change enabled - disabled button

    ConnectBtn.Enabled = true;

    DisconnectBtn.Enabled = false;

    RetrieveBtn.Enabled = false;

 

    // back to normal cursor

    Cursor.Current = cr;

}


here's code when Retrieve Button clicked:

private void RetrieveBtn_Click(object sender, System.EventArgs e)

{

    // change cursor into wait cursor

    Cursor cr = Cursor.Current;

    Cursor.Current = Cursors.WaitCursor;

    string szTemp;

    Message.Clear();

    try

    {

        // retrieve mail with number mail parameter

        Data = "RETR "+ Number.Text+CRLF;

        szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray());

        NetStrm.Write(szData,0,szData.Length);

 

        szTemp = RdStrm.ReadLine();

        if(szTemp[0]!='-')

        {

       

            while(szTemp!=".")

            {

                Message.Text += szTemp;

                szTemp = RdStrm.ReadLine();

            }

        }

        else

        {

            Status.Items.Add(szTemp);

        }

       

        // back to normal cursor

        Cursor.Current = cr;

 

    }

    catch(InvalidOperationException err)

    {

        Status.Items.Add("Error: "+err.ToString());

    }

 

}


Testing
build and run this project. Set the POP server, user and password. After that you'll get a response message from the POP server (you can see on status box) ie: +OK 2 624 if success or -ERR if fail. The words "+OK 2 624" mean you have two emails and total size 624.

now, you can set the mail message number and then click Retrieve button. Then you'll get the mail according to the mail number that you wrote on Mail Number Box.

posted on 2008-09-15 02:13  睿达团队  阅读(283)  评论(0编辑  收藏  举报