Click here to Skip to main content
12,688,944 members (31,706 online)
Click here to Skip to main content
Add your own
alternative version

Stats

411.7K views
18.1K downloads
141 bookmarked
Posted

Retrieve Mail From a POP3 Server Using C#

, 19 Jan 2002
Rate this:
Please Sign up or sign in to vote.
A simple program for retrieving mails from a POP3 server, based on RFC 1725.

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

Share

About the Author

Agus Kurniawan
Founder PE College
Indonesia Indonesia
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 founder for PE College(www.pecollege.net), free video tutorial about programming, infrastructure, and computer science. He's currently based in Depok, Indonesia. His blog is http://geeks.netindonesia.net/blogs/agus and http://blog.aguskurniawan.net

You may also be interested in...

Pro
Pro

Comments and Discussions

 
Generali can't write correctly data with NetStr Pin
fjlherrera3-May-05 11:51
memberfjlherrera3-May-05 11:51 
GeneralSSL Pin
prashant.majhwar2-Feb-05 8:50
memberprashant.majhwar2-Feb-05 8:50 
GeneralRe: SSL Pin
Anonymous22-Feb-05 13:06
sussAnonymous22-Feb-05 13:06 
GeneralRe: SSL Pin
Anonymous20-Jun-05 17:50
sussAnonymous20-Jun-05 17:50 
GeneralRe: SSL Pin
Anonymous7-Sep-05 10:09
sussAnonymous7-Sep-05 10:09 
GeneralRe: SSL Pin
Codah444415-Sep-07 8:09
memberCodah444415-Sep-07 8:09 
GeneralRe: SSL Pin
bird.man17-Mar-09 1:46
memberbird.man17-Mar-09 1:46 
Generalrequery the STAT... Pin
alon ronen21-Oct-04 3:56
memberalon ronen21-Oct-04 3:56 
GeneralRe: requery the STAT... Pin
bruno cortona5-Jan-05 5:07
memberbruno cortona5-Jan-05 5:07 
Questionhow to download attachment Pin
okoji Cyril18-Oct-04 10:40
memberokoji Cyril18-Oct-04 10:40 
AnswerRe: how to download attachment Pin
Anonymous17-Dec-04 8:31
sussAnonymous17-Dec-04 8:31 
GeneralRe: how to download attachment Pin
lesnikowski6-Nov-05 14:01
memberlesnikowski6-Nov-05 14:01 
QuestionHow can I change the password? Pin
arko16-Oct-04 11:59
sussarko16-Oct-04 11:59 
GeneralFails to Write Pin
jhblankenship10-Sep-04 9:40
memberjhblankenship10-Sep-04 9:40 
QuestionHow to solve the timeout problem? Pin
BeginnerQL8-Sep-04 22:01
memberBeginnerQL8-Sep-04 22:01 
QuestionWhy do people still write code like this? Pin
SaurweinAndreas17-Jun-04 7:03
memberSaurweinAndreas17-Jun-04 7:03 
AnswerRe: Why do people still write code like this? Pin
vadimSuraev7-Aug-04 5:04
membervadimSuraev7-Aug-04 5:04 
GeneralRe: Why do people still write code like this? Pin
SaurweinAndreas7-Aug-04 6:26
memberSaurweinAndreas7-Aug-04 6:26 
GeneralRe: Why do people still write code like this? Pin
vadimSuraev7-Aug-04 13:51
membervadimSuraev7-Aug-04 13:51 
GeneralRe: Why do people still write code like this? Pin
SaurweinAndreas7-Aug-04 16:52
memberSaurweinAndreas7-Aug-04 16:52 
GeneralRe: Why do people still write code like this? Pin
Adam Ainsworth6-Mar-07 4:34
memberAdam Ainsworth6-Mar-07 4:34 
AnswerRe: Why do people still write code like this? Pin
Smak18-Aug-04 8:37
memberSmak18-Aug-04 8:37 
GeneralRe: Why do people still write code like this? Pin
SaurweinAndreas18-Aug-04 9:48
memberSaurweinAndreas18-Aug-04 9:48 
GeneralRe: Why do people still write code like this? Pin
spooky manus23-Jun-05 22:12
memberspooky manus23-Jun-05 22:12 
GeneralRe: Why do people still write code like this? Pin
SaurweinAndreas24-Jun-05 4:07
memberSaurweinAndreas24-Jun-05 4:07 
GeneralRe: Why do people still write code like this? Pin
spooky manus24-Jun-05 4:27
memberspooky manus24-Jun-05 4:27 
AnswerRe: Why do people still write code like this? Pin
csharp_wiz11-Sep-05 16:08
membercsharp_wiz11-Sep-05 16:08 
Generaldownload source codes Pin
Ali Vahaj6-Apr-04 11:53
sussAli Vahaj6-Apr-04 11:53 
GeneralRe: download source codes Pin
Xins20-Apr-04 20:24
memberXins20-Apr-04 20:24 
QuestionHow to List the mail letters? Pin
Jcxl13-Jan-04 16:52
memberJcxl13-Jan-04 16:52 
Generalemail server Pin
Xins8-Dec-03 18:04
memberXins8-Dec-03 18:04 
GeneralRe: email server Pin
moserwi8-Mar-04 8:46
membermoserwi8-Mar-04 8:46 
Generallooking for rfc Pin
Xins8-Dec-03 17:58
memberXins8-Dec-03 17:58 
GeneralRe: looking for rfc Pin
yu-yu11-Jul-04 16:17
memberyu-yu11-Jul-04 16:17 
Questionhow to decode iso-8859-1-headers? Pin
SamJost30-Jul-03 7:39
memberSamJost30-Jul-03 7:39 
AnswerRe: how to decode iso-8859-1-headers? Pin
Anonymous17-Dec-04 8:29
sussAnonymous17-Dec-04 8:29 
QuestionHow to parse an attachment Pin
SandraR14-May-03 23:06
memberSandraR14-May-03 23:06 
QuestionWhy the hassle? Pin
GroovBird3-Apr-03 10:35
memberGroovBird3-Apr-03 10:35 
GeneralSimple, and works:) Pin
Stoyan Damov8-Mar-03 19:24
sussStoyan Damov8-Mar-03 19:24 
GeneralRe: Simple, and works:) Pin
Apoc704-Oct-04 2:34
memberApoc704-Oct-04 2:34 
Generaltest Pin
Anonymous25-Feb-03 10:54
sussAnonymous25-Feb-03 10:54 
GeneralSame Here... Pin
Anonymous5-Feb-03 13:31
sussAnonymous5-Feb-03 13:31 
QuestionHow do you parse attachments? Pin
Albert Pascual19-Jun-02 13:22
memberAlbert Pascual19-Jun-02 13:22 
Generalgood article Pin
Anonymous17-Feb-02 0:44
memberAnonymous17-Feb-02 0:44 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170113.4 | Last Updated 20 Jan 2002
Article Copyright 2002 by Agus Kurniawan
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid