POP3 Protocol wrapper class | CodeGuru

POP3 Protocol wrapper class

. On the Internet, electronic mail (e-mail) is the most widely used application. According to experts, of all TCP connections that Internet users establish, about one-half are for sending and receiving e-mail messages. So it is impossible for any Internet programmer to leave this area. Usually e-mail systems use SMTP as a mail sending Protocol […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 7, 1998
7 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

.

On the Internet, electronic mail (e-mail) is the most widely used application.
According to experts, of all TCP connections that Internet users establish,
about one-half are for sending and receiving e-mail messages. So it is
impossible for any Internet programmer to leave this area.

Usually e-mail systems use SMTP as a mail sending Protocol and POP3
as a mail receiving Protocol. For details about these Protocols you can
refere to RCF 821 (for SMTP) and RFC 1225 (for POP3). Since in Windows
environment we have MAPI for e-mail handling but it do not provide enough
power to commuincate with e-mail server directly.

Here I developed a class for POP 3 protocol. In this class I used CSocket
as class member (surperise not inherent it), so that I can used it in Threads.
POP Class has methods which are resembled with POP 3 protocol commands.
Following is code of the class with comments.

/*——————————————————————–

     Pop.h : main header
file for the POP application


———————————————————————–*/

#if !defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)

#define AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_

#define CONNECTION_CHECK 0

#define USER_CHECK  1

#define PASSWORD_CHECK 2

#define QUIT_CHECK  3

#define DELETE_CHECK 4

#define RSET_CHECK  5

#define STAT_CHECK  6

#define NOOP_CHECK  7

#define LIST_CHECK  8

#define RETR_CHECK  9

/////////////////////////////////////////////////////////////////////////////

class CPop

{

public:

 BOOL List();

 CWordArray m_SizeOfMsg;

 CString GetErrorMessage();   
// If there is any error this will return it method


 CString GetPassword();          
// Getting Password stored in class


 void SetPassword(CString& Password);   
// Setting Password in class


 CString GetUser();                  
// Getting user name stored in class


 void SetUser(CString& User); 
// Setting user name in class


 CString GetHost();                   
// Getting Host name (email server name) stored in class


 void SetHost(CString& Host);   
// Setting Host name (email server name) in class


 BOOL Connect();                   
// Connecting to email server


 int GetTotalMailSize();               
// it returns the Total Mail Size


 int GetNumberOfMails();           
// It return the number of mails


 CString GetMsgContents();        

 BOOL Statistics();                   
// issue the STAT command on email server


 BOOL Retrieve(int MsgNumber);   
// Getting any particular mail message


 BOOL Reset();                       
// issue the reset command on email server


 int  GetMessageSize(int MsgNumber);   
// Return a size of any particular mail


 BOOL Noop();                    
// issue the NOOP command on email server


 BOOL Disconnect();           
// issue the QUIT command on email server


 BOOL Delete(int& MsgNumber); // Deleteing
a particular message from email server


 BOOL Connect(CString& Host, CString&
User, CString& Password);


 CPop();

 virtual ~CPop();

private:

 CString m_ErrorMessage;

 BOOL CheckResponse(int ResponseType);

 CString m_Password;

 CString m_User;

 CString m_Host;

 CString m_MsgContents;

 int m_TotalSize;

 int m_NumberMail;

 CSocket m_PopServer;

};

/#endif // !defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)

 

/*———————————————————————————————–

// Pop.cpp : Defines the class behaviors for
the application.


—————————————————————————————————*/

#include “stdafx.h”

#include “Pop.h”

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

////////////////////////////////////////////////////////////////////

// CPop Class

//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CPop::CPop()

{

 m_PopServer.Create();

}

//{4EEC1C91-6BE1-11d1-8824-00001C302581}

CPop::~CPop()

{

 m_PopServer.Close();

}

BOOL CPop::Connect(CString & Host, CString
& User, CString & Password)


{

 char buf [512];

 if (!m_PopServer.Connect(Host,110)) // 110
Pop3 Port


 {

  m_ErrorMessage = _T(“Server cannot be
connected”);


  return FALSE;

 }

 else

 {

  if(CheckResponse(CONNECTION_CHECK)==FALSE)

   return FALSE;

  wsprintf (buf, “USER %srn”, (LPCSTR)
User);


  m_PopServer.Send(buf, strlen (buf));

  if(CheckResponse(USER_CHECK)==FALSE)

   return FALSE;

  wsprintf (buf, “PASS %srn”, (LPCSTR)
Password);


  m_PopServer.Send(buf, strlen (buf));

  if (CheckResponse(PASSWORD_CHECK)==FALSE)

   return FALSE;

  return TRUE;

 }

}

BOOL CPop::Delete(int & MsgNumber)

{

 char buf [512];

 wsprintf (buf, “DELE %drn”,MsgNumber );

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(DELETE_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

BOOL CPop::Disconnect()

{

 char buf [512];

 wsprintf (buf, “QUIT rn”);

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(QUIT_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

BOOL CPop::Noop()

{

 char buf [512];

 wsprintf (buf, “NOOP  rn”);

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(NOOP_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

// Return the Msg Size for given msg number

int CPop::GetMessageSize(int MsgNumber)

{

 if(m_SizeOfMsg.GetSize() < MsgNumber+1)

  return 0;

 else

  return m_SizeOfMsg[MsgNumber+1];

}

BOOL CPop::Reset()

{

 char buf [512];

 wsprintf (buf, “RSET rn”);

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(RSET_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

// MsgContents will hold the msg body

BOOL CPop::Retrieve(int  MsgNumber)

{

 char buf [512];

 wsprintf (buf, “RETR %drn”,MsgNumber );

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(RETR_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

BOOL CPop::Statistics()

{

 char buf [512];

 wsprintf (buf, “STAT rn”);

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(STAT_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

CString CPop::GetMsgContents()

{

 return m_MsgContents;

}

int CPop::GetNumberOfMails()

{

 return m_NumberMail;

}

int CPop::GetTotalMailSize()

{

 return m_TotalSize;

}

BOOL CPop::Connect()

{

 Connect(m_Host, m_User, m_Password);

 return TRUE;

}

void CPop::SetHost(CString & Host)

{

 m_Host = Host;

}

CString CPop::GetHost()

{

 return m_Host;

}

void CPop::SetUser(CString & User)

{

 m_User = User;

}

CString CPop::GetUser()

{

 return m_User;

}

void CPop::SetPassword(CString & Password)

{

 m_Password = Password;

}

CString CPop::GetPassword()

{

 return m_Password;

}

BOOL CPop::CheckResponse(int ResponseType)

{

 char buf [1000];

 for (int i=0;i<512;i++)

  buf[i]=’’;

 m_PopServer.Receive(buf, sizeof(buf));

 switch (ResponseType)

 {

  case CONNECTION_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Bad Connection”);

    return FALSE;

   }

   break;

  case USER_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Bad User
Name”);


    return FALSE;

   }

   break;

  case PASSWORD_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Bad Password
Name”);


    return FALSE;

   }

   break;

  case QUIT_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during QUIT”);


    return FALSE;

   }

   break;

  case DELETE_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during DELE”);


    return FALSE;

   }

   break;

  case RSET_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during RSET”);


    return FALSE;

   }

   break;

  case STAT_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during STAT”);


    return FALSE;

   }

   else

   {

    BOOL EmailNumber = TRUE;

    for (char *p = buf; *p !=
‘’; p++)


    {

     if (*p == ‘t’ || *p
== ‘ ‘)


     {

      if(EmailNumber
== TRUE)


      {

       m_NumberMail
= atoi(p);


       EmailNumber
= FALSE;


      }

      else

      {

       m_TotalSize
= atoi(p);


       return TRUE;

      }

     }

    }

   }

   break;

  case NOOP_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during NOOP”);


    return FALSE;

   }

   break;

  case LIST_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during LIST”);


    return FALSE;

   }

   else

   {

    m_PopServer.Receive(buf, sizeof(buf));

    for (char *p = buf; *p != ‘.’;
p++)


     if (*p == ‘t’ || *p
== ‘ ‘)


      m_SizeOfMsg.Add(atoi(p));

   }

   break;

  case RETR_CHECK:

   if (strnicmp(buf,”-ERR”, 4) == 0)

   {

    m_ErrorMessage = _T(“Error
occured during RETR”);


    return FALSE;

   }

   else

   {

    char temp[9000];

    m_PopServer.Receive(temp,
sizeof(temp));


    m_MsgContents = temp;

   }

   break;

 }

 return TRUE;

}

CString CPop::GetErrorMessage()

{

 return m_ErrorMessage;

}

BOOL CPop::List()

{

 char buf [512];

 wsprintf (buf, “LIST  rn”);

 m_PopServer.Send(buf, strlen (buf));

 if (CheckResponse(LIST_CHECK)==FALSE)

  return FALSE;

 else

  return TRUE;

}

 

 

 

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.