目前互连网上,EMAIL的使用是越来越广泛了。在所有的TCP连接线路中,大概有一半的线路是用来收发EMAIL的。因此,许多网络应用程序要想离开POP3协议是不可能的。
而且,很多EMAIL系统都是使用SMTP协议来作为发送协议,而POP3协议来作为接受协议。关于这2个协议的许多资料,你可以看一下RCF821(关于SMTP的)和RCF1225(关于POP3的)。虽然在WINDOWS操作系统中,有一个叫MAPI应用程序是来管理EMAIL的,但是它的功能还不够强大,不足以直接处理一些EMAIL服务。所以,我写了一个有关于POP3协议的C++类,在这个类中我还使用了CSocket作为一个类成员(这好象有点不可想象),这样的话呢,我们可以在连接的时候使用它。并且,该POP类使用的一些功能类似于POP3协议中的一些命令。下面就代码:
/*--------------------------------------------------------------------
Pop.h:mainheaderfileforthePOPapplication
-----------------------------------------------------------------------*/
#if!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)
#defineAFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_
#defineCONNECTION_CHECK0
#defineUSER_CHECK1
#definePASSWORD_CHECK2
#defineQUIT_CHECK3
#defineDELETE_CHECK4
#defineRSET_CHECK5
#defineSTAT_CHECK6
#defineNOOP_CHECK7
#defineLIST_CHECK8
#defineRETR_CHECK9
/////////////////////////////////////////////////////////////////////////////
classCPop
{
public:
BOOLList();
CWordArraym_SizeOfMsg;
CStringGetErrorMessage();//Ifthereisanyerrorthiswillreturnitmethod
CStringGetPassword();//GettingPasswordstoredinclass
voidSetPassword(CString&Password);//SettingPasswordinclass
CStringGetUser();//Gettingusernamestoredinclass
voidSetUser(CString&User);//Settingusernameinclass
CStringGetHost();//GettingHostname(emailservername)storedinclass
voidSetHost(CString&Host);//SettingHostname(emailservername)inclass
BOOLConnect();//Connectingtoemailserver
intGetTotalMailSize();//itreturnstheTotalMailSize
intGetNumberOfMails();//Itreturnthenumberofmails
CStringGetMsgContents();
BOOLStatistics();//issuetheSTATcommandonemailserver
BOOLRetrieve(intMsgNumber);//Gettinganyparticularmailmessage
BOOLReset();//issuetheresetcommandonemailserver
intGetMessageSize(intMsgNumber);//Returnasizeofanyparticularmail
BOOLNoop();//issuetheNOOPcommandonemailserver
BOOLDisconnect();//issuetheQUITcommandonemailserver
BOOLDelete(int&MsgNumber);//Deleteingaparticularmessagefromemailserver
BOOLConnect(CString&Host,CString&User,CString&Password);
CPop();
virtual~CPop();
private:
CStringm_ErrorMessage;
BOOLCheckResponse(intResponseType);
CStringm_Password;
CStringm_User;
CStringm_Host;
CStringm_MsgContents;
intm_TotalSize;
intm_NumberMail;
CSocketm_PopServer;
};
/#endif//!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)
/*-----------------------------------------------------------------------------------------------
//Pop.cpp:Definestheclassbehaviorsfortheapplication.
---------------------------------------------------------------------------------------------------*/
#include"stdafx.h"
#include"Pop.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
////////////////////////////////////////////////////////////////////
//CPopClass
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPop::CPop()
{
m_PopServer.Create();
}
//{4EEC1C91-6BE1-11d1-8824-00001C302581}
CPop::~CPop()
{
m_PopServer.Close();
}
BOOLCPop::Connect(CString&Host,CString&User,CString&Password)
{
charbuf[512];
if(!m_PopServer.Connect(Host,110))//110Pop3Port
{
m_ErrorMessage=_T("Servercannotbeconnected");
returnFALSE;
}
else
{
if(CheckResponse(CONNECTION_CHECK)==FALSE)
returnFALSE;
wsprintf(buf,"USER%s\r\n",(LPCSTR)User);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(USER_CHECK)==FALSE)
returnFALSE;
wsprintf(buf,"PASS%s\r\n",(LPCSTR)Password);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(PASSWORD_CHECK)==FALSE)
returnFALSE;
returnTRUE;
}
}
BOOLCPop::Delete(int&MsgNumber)
{
charbuf[512];
wsprintf(buf,"DELE%d\r\n",MsgNumber);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(DELETE_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Disconnect()
{
charbuf[512];
wsprintf(buf,"QUIT\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(QUIT_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Noop()
{
charbuf[512];
wsprintf(buf,"NOOP\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(NOOP_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
//ReturntheMsgSizeforgivenmsgnumber
intCPop::GetMessageSize(intMsgNumber)
{
if(m_SizeOfMsg.GetSize()<MsgNumber+1)
return0;
else
returnm_SizeOfMsg[MsgNumber+1];
}
BOOLCPop::Reset()
{
charbuf[512];
wsprintf(buf,"RSET\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(RSET_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
//MsgContentswillholdthemsgbody
BOOLCPop::Retrieve(intMsgNumber)
{
charbuf[512];
wsprintf(buf,"RETR%d\r\n",MsgNumber);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(RETR_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Statistics()
{
charbuf[512];
wsprintf(buf,"STAT\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(STAT_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
CStringCPop::GetMsgContents()
{
returnm_MsgContents;
}
intCPop::GetNumberOfMails()
{
returnm_NumberMail;
}
intCPop::GetTotalMailSize()
{
returnm_TotalSize;
}
BOOLCPop::Connect()
{
Connect(m_Host,m_User,m_Password);
returnTRUE;
}
voidCPop::SetHost(CString&Host)
{
m_Host=Host;
}
CStringCPop::GetHost()
{
returnm_Host;
}
voidCPop::SetUser(CString&User)
{
m_User=User;
}
CStringCPop::GetUser()
{
returnm_User;
}
voidCPop::SetPassword(CString&Password)
{
m_Password=Password;
}
CStringCPop::GetPassword()
{
returnm_Password;
}
BOOLCPop::CheckResponse(intResponseType)
{
charbuf[1000];
for(inti=0;i<512;i++)
buf[i]='\0';
m_PopServer.Receive(buf,sizeof(buf));
switch(ResponseType)
{
caseCONNECTION_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadConnection");
returnFALSE;
}
break;
caseUSER_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadUserName");
returnFALSE;
}
break;
casePASSWORD_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadPasswordName");
returnFALSE;
}
break;
caseQUIT_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringQUIT");
returnFALSE;
}
break;
caseDELETE_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringDELE");
returnFALSE;
}
break;
caseRSET_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringRSET");
returnFALSE;
}
break;
caseSTAT_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringSTAT");
returnFALSE;
}
else
{
BOOLEmailNumber=TRUE;
for(char*p=buf;*p!='\0';p++)
{
if(*p=='\t'||*p=='')
{
if(EmailNumber==TRUE)
{
m_NumberMail=atoi(p);
EmailNumber=FALSE;
}
else
{
m_TotalSize=atoi(p);
returnTRUE;
}
}
}
}
break;
caseNOOP_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringNOOP");
returnFALSE;
}
break;
caseLIST_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringLIST");
returnFALSE;
}
else
{
m_PopServer.Receive(buf,sizeof(buf));
for(char*p=buf;*p!='.';p++)
if(*p=='\t'||*p=='')
m_SizeOfMsg.Add(atoi(p));
}
break;
caseRETR_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringRETR");
returnFALSE;
}
else
{
chartemp[9000];
m_PopServer.Receive(temp,sizeof(temp));
m_MsgContents=temp;
}
break;
}
returnTRUE;
}
CStringCPop::GetErrorMessage()
{
returnm_ErrorMessage;
}
BOOLCPop::List()
{
charbuf[512];
wsprintf(buf,"LIST\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(LIST_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
而且,很多EMAIL系统都是使用SMTP协议来作为发送协议,而POP3协议来作为接受协议。关于这2个协议的许多资料,你可以看一下RCF821(关于SMTP的)和RCF1225(关于POP3的)。虽然在WINDOWS操作系统中,有一个叫MAPI应用程序是来管理EMAIL的,但是它的功能还不够强大,不足以直接处理一些EMAIL服务。所以,我写了一个有关于POP3协议的C++类,在这个类中我还使用了CSocket作为一个类成员(这好象有点不可想象),这样的话呢,我们可以在连接的时候使用它。并且,该POP类使用的一些功能类似于POP3协议中的一些命令。下面就代码:
/*--------------------------------------------------------------------
Pop.h:mainheaderfileforthePOPapplication
-----------------------------------------------------------------------*/
#if!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)
#defineAFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_
#defineCONNECTION_CHECK0
#defineUSER_CHECK1
#definePASSWORD_CHECK2
#defineQUIT_CHECK3
#defineDELETE_CHECK4
#defineRSET_CHECK5
#defineSTAT_CHECK6
#defineNOOP_CHECK7
#defineLIST_CHECK8
#defineRETR_CHECK9
/////////////////////////////////////////////////////////////////////////////
classCPop
{
public:
BOOLList();
CWordArraym_SizeOfMsg;
CStringGetErrorMessage();//Ifthereisanyerrorthiswillreturnitmethod
CStringGetPassword();//GettingPasswordstoredinclass
voidSetPassword(CString&Password);//SettingPasswordinclass
CStringGetUser();//Gettingusernamestoredinclass
voidSetUser(CString&User);//Settingusernameinclass
CStringGetHost();//GettingHostname(emailservername)storedinclass
voidSetHost(CString&Host);//SettingHostname(emailservername)inclass
BOOLConnect();//Connectingtoemailserver
intGetTotalMailSize();//itreturnstheTotalMailSize
intGetNumberOfMails();//Itreturnthenumberofmails
CStringGetMsgContents();
BOOLStatistics();//issuetheSTATcommandonemailserver
BOOLRetrieve(intMsgNumber);//Gettinganyparticularmailmessage
BOOLReset();//issuetheresetcommandonemailserver
intGetMessageSize(intMsgNumber);//Returnasizeofanyparticularmail
BOOLNoop();//issuetheNOOPcommandonemailserver
BOOLDisconnect();//issuetheQUITcommandonemailserver
BOOLDelete(int&MsgNumber);//Deleteingaparticularmessagefromemailserver
BOOLConnect(CString&Host,CString&User,CString&Password);
CPop();
virtual~CPop();
private:
CStringm_ErrorMessage;
BOOLCheckResponse(intResponseType);
CStringm_Password;
CStringm_User;
CStringm_Host;
CStringm_MsgContents;
intm_TotalSize;
intm_NumberMail;
CSocketm_PopServer;
};
/#endif//!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)
/*-----------------------------------------------------------------------------------------------
//Pop.cpp:Definestheclassbehaviorsfortheapplication.
---------------------------------------------------------------------------------------------------*/
#include"stdafx.h"
#include"Pop.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
////////////////////////////////////////////////////////////////////
//CPopClass
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPop::CPop()
{
m_PopServer.Create();
}
//{4EEC1C91-6BE1-11d1-8824-00001C302581}
CPop::~CPop()
{
m_PopServer.Close();
}
BOOLCPop::Connect(CString&Host,CString&User,CString&Password)
{
charbuf[512];
if(!m_PopServer.Connect(Host,110))//110Pop3Port
{
m_ErrorMessage=_T("Servercannotbeconnected");
returnFALSE;
}
else
{
if(CheckResponse(CONNECTION_CHECK)==FALSE)
returnFALSE;
wsprintf(buf,"USER%s\r\n",(LPCSTR)User);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(USER_CHECK)==FALSE)
returnFALSE;
wsprintf(buf,"PASS%s\r\n",(LPCSTR)Password);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(PASSWORD_CHECK)==FALSE)
returnFALSE;
returnTRUE;
}
}
BOOLCPop::Delete(int&MsgNumber)
{
charbuf[512];
wsprintf(buf,"DELE%d\r\n",MsgNumber);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(DELETE_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Disconnect()
{
charbuf[512];
wsprintf(buf,"QUIT\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(QUIT_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Noop()
{
charbuf[512];
wsprintf(buf,"NOOP\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(NOOP_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
//ReturntheMsgSizeforgivenmsgnumber
intCPop::GetMessageSize(intMsgNumber)
{
if(m_SizeOfMsg.GetSize()<MsgNumber+1)
return0;
else
returnm_SizeOfMsg[MsgNumber+1];
}
BOOLCPop::Reset()
{
charbuf[512];
wsprintf(buf,"RSET\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(RSET_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
//MsgContentswillholdthemsgbody
BOOLCPop::Retrieve(intMsgNumber)
{
charbuf[512];
wsprintf(buf,"RETR%d\r\n",MsgNumber);
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(RETR_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
BOOLCPop::Statistics()
{
charbuf[512];
wsprintf(buf,"STAT\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(STAT_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}
CStringCPop::GetMsgContents()
{
returnm_MsgContents;
}
intCPop::GetNumberOfMails()
{
returnm_NumberMail;
}
intCPop::GetTotalMailSize()
{
returnm_TotalSize;
}
BOOLCPop::Connect()
{
Connect(m_Host,m_User,m_Password);
returnTRUE;
}
voidCPop::SetHost(CString&Host)
{
m_Host=Host;
}
CStringCPop::GetHost()
{
returnm_Host;
}
voidCPop::SetUser(CString&User)
{
m_User=User;
}
CStringCPop::GetUser()
{
returnm_User;
}
voidCPop::SetPassword(CString&Password)
{
m_Password=Password;
}
CStringCPop::GetPassword()
{
returnm_Password;
}
BOOLCPop::CheckResponse(intResponseType)
{
charbuf[1000];
for(inti=0;i<512;i++)
buf[i]='\0';
m_PopServer.Receive(buf,sizeof(buf));
switch(ResponseType)
{
caseCONNECTION_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadConnection");
returnFALSE;
}
break;
caseUSER_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadUserName");
returnFALSE;
}
break;
casePASSWORD_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("BadPasswordName");
returnFALSE;
}
break;
caseQUIT_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringQUIT");
returnFALSE;
}
break;
caseDELETE_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringDELE");
returnFALSE;
}
break;
caseRSET_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringRSET");
returnFALSE;
}
break;
caseSTAT_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringSTAT");
returnFALSE;
}
else
{
BOOLEmailNumber=TRUE;
for(char*p=buf;*p!='\0';p++)
{
if(*p=='\t'||*p=='')
{
if(EmailNumber==TRUE)
{
m_NumberMail=atoi(p);
EmailNumber=FALSE;
}
else
{
m_TotalSize=atoi(p);
returnTRUE;
}
}
}
}
break;
caseNOOP_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringNOOP");
returnFALSE;
}
break;
caseLIST_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringLIST");
returnFALSE;
}
else
{
m_PopServer.Receive(buf,sizeof(buf));
for(char*p=buf;*p!='.';p++)
if(*p=='\t'||*p=='')
m_SizeOfMsg.Add(atoi(p));
}
break;
caseRETR_CHECK:
if(strnicmp(buf,"-ERR",4)==0)
{
m_ErrorMessage=_T("ErroroccuredduringRETR");
returnFALSE;
}
else
{
chartemp[9000];
m_PopServer.Receive(temp,sizeof(temp));
m_MsgContents=temp;
}
break;
}
returnTRUE;
}
CStringCPop::GetErrorMessage()
{
returnm_ErrorMessage;
}
BOOLCPop::List()
{
charbuf[512];
wsprintf(buf,"LIST\r\n");
m_PopServer.Send(buf,strlen(buf));
if(CheckResponse(LIST_CHECK)==FALSE)
returnFALSE;
else
returnTRUE;
}