5,427,303 members and growing! (20,381 online)
Email Password   helpLost your password?
General Programming » Internet / Network » Email     Intermediate

Retrieve Mail From a POP3 Server Using C#

By Agus Kurniawan

A simple program for retrieving mails from a POP3 server, based on RFC 1725.
C#, Windows, .NET 1.0, .NETVisual Studio, VS.NET2002, Dev

Posted: 12 Jan 2002
Updated: 19 Jan 2002
Views: 181,034
Bookmarked: 82 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
32 votes for this Article.
Popularity: 5.78 Rating: 3.84 out of 5
2 votes, 7.7%
1
1 vote, 3.8%
2
2 votes, 7.7%
3
3 votes, 11.5%
4
18 votes, 69.2%
5

Sample Image - GUI.gif

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

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

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,and ASP/ASP.NET. He's consultant and architect for People Enterprise (www.PeopleEnterprise.com). He's currently based in Depok, Indonesia. His blog is http://geeks.netindonesia.net/blogs/agus
Occupation: Web Developer
Location: Indonesia Indonesia

Other popular Internet / Network articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 62 (Total in Forum: 62) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralHow do I save the message in the Inbox\new fodermembernirmalamari10:00 11 Aug '08  
Generalim using pop3mimeclientmemberjayas3:31 22 Mar '08  
Questionhi Good pls help mememberyogarajan ganesan3:32 14 Mar '08  
GeneralError In This Codemember~V~1:56 18 Feb '08  
GeneralValue can not be null [modified]membernpipaliya19:57 29 Nov '07  
Generalconnection attempts failedmemberjain_abhishek_siet23:15 12 Sep '07  
QuestionNeed the helpmemberminpeng20068:08 10 Sep '07  
Generalhelp me!!!membersaobangtn2218:01 31 Aug '07  
QuestionNeed helpmemberkanzz23:03 7 Aug '07  
Generalproblem with retreiving mailmemberMostafa_Ismail3:41 22 Jul '07  
GeneralHow To read Attached doc file from pop3 [modified]memberu3033822:31 27 Apr '07  
GeneralCan it be stored in outlook?memberzjkida9:19 25 May '06  
GeneralProblem in POP3 ServermemberSR Ranjini20:24 19 Apr '06  
GeneralRe: Problem in POP3 Servermembergohil770:09 16 Jun '06  
GeneralQuestionmemberkraster2:41 19 Apr '06  
GeneralThanks for the codesussLalitha V6:17 19 Oct '05  
GeneralConnect to SSL POP3sussAnonymous8:08 23 Aug '05  
GeneralRe: Connect to SSL POP3sussAnonymous10:09 7 Sep '05  
GeneralRe: Connect to SSL POP3memberbhavesh_13030:09 14 Dec '05  
Generali can't write correctly data with NetStrmemberfjlherrera11:51 3 May '05  
GeneralSSLmemberprashant.majhwar8:50 2 Feb '05  
GeneralRe: SSLsussAnonymous13:06 22 Feb '05  
GeneralRe: SSLsussAnonymous17:50 20 Jun '05  
GeneralRe: SSLsussAnonymous10:09 7 Sep '05  
GeneralRe: SSLmemberCodah44448:09 15 Sep '07  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 19 Jan 2002
Editor: Chris Maunder
Copyright 2002 by Agus Kurniawan
Everything else Copyright © CodeProject, 1999-2008
Web12 | Advertise on the Code Project