POP3协议封装类

王朝厨房·作者佚名  2007-01-05
窄屏简体版  字體: |||超大  

目前互连网上,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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航