상세 설명 - C#로 POP3 서버에서 메일(소스 코드 다운로드 제공)

8072 단어
  • Download source files - 6 Kb
  • Download demo project - 4 Kb

  • 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.

    Reference

  • MSDN for .NET framework
  • RFC 1725

  • History


    20 Jan 2002 - fixed non-critical GUI problem

    About Agus Kurniawan


    He gradueted from Sepuluh Nopember Institute of Technology (ITS) in Department of Electrical Engineering, Indonesia. His programming interest is VC++, C#, VB, VB.NET, .NET, VBScript, Delphi, C++ Builder, Assembly, ASP/ASP.NET, and JSP. He's consultant and architect for DMC Server (www.dmcserver.com). He's currently based in Jakarta, Indonesia. Click here to view Agus Kurniawan's online profile.

    좋은 웹페이지 즐겨찾기