POP3协议封装类

目前互连网上,EMAIL的使用是越来越广泛了。在所有的TCP连接线路中,大概有一半的线路是用来收发EMAIL的。因此,许多网络应用程序要想离开POP3协议是不可能的。
  而且,很多EMAIL系统都是使用SMTP协议来作为发送协议,而POP3协议来作为接受协议。关于这2个协议的许多资料,你可以看一下RCF821(关于SMTP的)和RCF1225(关于POP3的)。虽然在WINDOWS操作系统中,有一个叫MAPI应用程序是来管理EMAIL的,但是它的功能还不够强大,不足以直接处理一些EMAIL服务。所以,我写了一个有关于POP3协议的C++类,在这个类中我还使用了CSocket作为一个类成员(这好象有点不可想象),这样的话呢,我们可以在连接的时候使用它。并且,该POP类使用的一些功能类似于POP3协议中的一些命令。下面就代码:
c 代码
  1. /*--------------------------------------------------------------------   
  2. Pop.h:mainheaderfileforthePOPapplication   
  3. -----------------------------------------------------------------------*/    
  4. #if!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)    
  5. #defineAFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_    
  6. #defineCONNECTION_CHECK0    
  7. #defineUSER_CHECK1    
  8. #definePASSWORD_CHECK2    
  9. #defineQUIT_CHECK3    
  10. #defineDELETE_CHECK4    
  11. #defineRSET_CHECK5    
  12. #defineSTAT_CHECK6    
  13. #defineNOOP_CHECK7    
  14. #defineLIST_CHECK8    
  15. #defineRETR_CHECK9    
  16. /////////////////////////////////////////////////////////////////////////////    
  17. classCPop    
  18. {    
  19. public:    
  20. BOOLList();    
  21. CWordArraym_SizeOfMsg;    
  22. CStringGetErrorMessage();//Ifthereisanyerrorthiswillreturnitmethod    
  23. CStringGetPassword();//GettingPasswordstoredinclass    
  24. voidSetPassword(CString&Password);//SettingPasswordinclass    
  25. CStringGetUser();//Gettingusernamestoredinclass    
  26. voidSetUser(CString&User);//Settingusernameinclass    
  27. CStringGetHost();//GettingHostname(emailservername)storedinclass    
  28. voidSetHost(CString&Host);//SettingHostname(emailservername)inclass    
  29. BOOLConnect();//Connectingtoemailserver    
  30. intGetTotalMailSize();//itreturnstheTotalMailSize    
  31. intGetNumberOfMails();//Itreturnthenumberofmails    
  32. CStringGetMsgContents();    
  33. BOOLStatistics();//issuetheSTATcommandonemailserver    
  34. BOOLRetrieve(intMsgNumber);//Gettinganyparticularmailmessage    
  35. BOOLReset();//issuetheresetcommandonemailserver    
  36. intGetMessageSize(intMsgNumber);//Returnasizeofanyparticularmail    
  37. BOOLNoop();//issuetheNOOPcommandonemailserver    
  38. BOOLDisconnect();//issuetheQUITcommandonemailserver    
  39. BOOLDelete(int&MsgNumber);//Deleteingaparticularmessagefromemailserver    
  40. BOOLConnect(CString&Host,CString&User,CString&Password);    
  41. CPop();    
  42. virtual~CPop();    
  43. private:    
  44. CStringm_ErrorMessage;    
  45. BOOLCheckResponse(intResponseType);    
  46. CStringm_Password;    
  47. CStringm_User;    
  48. CStringm_Host;    
  49. CStringm_MsgContents;    
  50. intm_TotalSize;    
  51. intm_NumberMail;    
  52. CSocketm_PopServer;    
  53. };    
  54. /#endif//!defined(AFX_POP_H__A44B38B6_697C_11D1_881E_00001C302581__INCLUDED_)    
  55.   
  56. /*-----------------------------------------------------------------------------------------------   
  57. //Pop.cpp:Definestheclassbehaviorsfortheapplication.   
  58. ---------------------------------------------------------------------------------------------------*/    
  59. #include"stdafx.h"    
  60. #include"Pop.h"    
  61. #ifdef_DEBUG    
  62. #definenewDEBUG_NEW    
  63. #undefTHIS_FILE    
  64. staticcharTHIS_FILE[]=__FILE__;    
  65. #endif    
  66. ////////////////////////////////////////////////////////////////////    
  67. //CPopClass    
  68. //////////////////////////////////////////////////////////////////////    
  69. //////////////////////////////////////////////////////////////////////    
  70. //Construction/Destruction    
  71. //////////////////////////////////////////////////////////////////////    
  72. CPop::CPop()    
  73. {    
  74. m_PopServer.Create();    
  75. }    
  76. //{4EEC1C91-6BE1-11d1-8824-00001C302581}    
  77. CPop::~CPop()    
  78. {    
  79. m_PopServer.Close();    
  80. }    
  81. BOOLCPop::Connect(CString&Host,CString&User,CString&Password)    
  82. {    
  83. charbuf[512];    
  84. if(!m_PopServer.Connect(Host,110))//110Pop3Port    
  85. {    
  86. m_ErrorMessage=_T("Servercannotbeconnected");    
  87. returnFALSE;    
  88. }    
  89. else    
  90. {    
  91. if(CheckResponse(CONNECTION_CHECK)==FALSE)    
  92. returnFALSE;    
  93. wsprintf(buf,"USER%s\r\n",(LPCSTR)User);    
  94. m_PopServer.Send(buf,strlen(buf));    
  95. if(CheckResponse(USER_CHECK)==FALSE)    
  96. returnFALSE;    
  97. wsprintf(buf,"PASS%s\r\n",(LPCSTR)Password);    
  98. m_PopServer.Send(buf,strlen(buf));    
  99. if(CheckResponse(PASSWORD_CHECK)==FALSE)    
  100. returnFALSE;    
  101. returnTRUE;    
  102. }    
  103. }    
  104. BOOLCPop::Delete(int&MsgNumber)    
  105. {    
  106. charbuf[512];    
  107. wsprintf(buf,"DELE%d\r\n",MsgNumber);    
  108. m_PopServer.Send(buf,strlen(buf));    
  109. if(CheckResponse(DELETE_CHECK)==FALSE)    
  110. returnFALSE;    
  111. else    
  112. returnTRUE;    
  113. }    
  114. BOOLCPop::Disconnect()    
  115. {    
  116. charbuf[512];    
  117. wsprintf(buf,"QUIT\r\n");    
  118. m_PopServer.Send(buf,strlen(buf));    
  119. if(CheckResponse(QUIT_CHECK)==FALSE)    
  120. returnFALSE;    
  121. else    
  122. returnTRUE;    
  123. }    
  124. BOOLCPop::Noop()    
  125. {    
  126. charbuf[512];    
  127. wsprintf(buf,"NOOP\r\n");    
  128. m_PopServer.Send(buf,strlen(buf));    
  129. if(CheckResponse(NOOP_CHECK)==FALSE)    
  130. returnFALSE;    
  131. else    
  132. returnTRUE;    
  133. }    
  134. //ReturntheMsgSizeforgivenmsgnumber    
  135. intCPop::GetMessageSize(intMsgNumber)    
  136. {    
  137. if(m_SizeOfMsg.GetSize()<MsgNumber+1)    
  138. return0;    
  139. else    
  140. returnm_SizeOfMsg[MsgNumber+1];    
  141. }    
  142. BOOLCPop::Reset()    
  143. {    
  144. charbuf[512];    
  145. wsprintf(buf,"RSET\r\n");    
  146. m_PopServer.Send(buf,strlen(buf));    
  147. if(CheckResponse(RSET_CHECK)==FALSE)    
  148. returnFALSE;    
  149. else    
  150. returnTRUE;    
  151. }    
  152. //MsgContentswillholdthemsgbody    
  153. BOOLCPop::Retrieve(intMsgNumber)    
  154. {    
  155. charbuf[512];    
  156. wsprintf(buf,"RETR%d\r\n",MsgNumber);    
  157. m_PopServer.Send(buf,strlen(buf));    
  158. if(CheckResponse(RETR_CHECK)==FALSE)    
  159. returnFALSE;    
  160. else    
  161. returnTRUE;    
  162. }    
  163. BOOLCPop::Statistics()    
  164. {    
  165. charbuf[512];    
  166. wsprintf(buf,"STAT\r\n");    
  167. m_PopServer.Send(buf,strlen(buf));    
  168. if(CheckResponse(STAT_CHECK)==FALSE)    
  169. returnFALSE;    
  170. else    
  171. returnTRUE;    
  172. }    
  173. CStringCPop::GetMsgContents()    
  174. {    
  175. returnm_MsgContents;    
  176. }    
  177. intCPop::GetNumberOfMails()    
  178. {    
  179. returnm_NumberMail;    
  180. }    
  181. intCPop::GetTotalMailSize()    
  182. {    
  183. returnm_TotalSize;    
  184. }    
  185. BOOLCPop::Connect()    
  186. {    
  187. Connect(m_Host,m_User,m_Password);    
  188. returnTRUE;    
  189. }    
  190. voidCPop::SetHost(CString&Host)    
  191. {    
  192. m_Host=Host;    
  193. }    
  194. CStringCPop::GetHost()    
  195. {    
  196. returnm_Host;    
  197. }    
  198. voidCPop::SetUser(CString&User)    
  199. {    
  200. m_User=User;    
  201. }    
  202. CStringCPop::GetUser()    
  203. {    
  204. returnm_User;    
  205. }    
  206. voidCPop::SetPassword(CString&Password)    
  207. {    
  208. m_Password=Password;    
  209. }    
  210. CStringCPop::GetPassword()    
  211. {    
  212. returnm_Password;    
  213. }    
  214. BOOLCPop::CheckResponse(intResponseType)    
  215. {    
  216. charbuf[1000];    
  217. for(inti=0;i<512;i++)    
  218. buf[i]=’\0’;    
  219. m_PopServer.Receive(buf,sizeof(buf));    
  220. switch(ResponseType)    
  221. {    
  222. caseCONNECTION_CHECK:    
  223. if(strnicmp(buf,"-ERR",4)==0)    
  224.     
  225. m_ErrorMessage=_T("BadConnection");    
  226. returnFALSE;    
  227. }    
  228. break;    
  229. caseUSER_CHECK:    
  230. if(strnicmp(buf,"-ERR",4)==0)    
  231. {    
  232. m_ErrorMessage=_T("BadUserName");    
  233. returnFALSE;    
  234. }    
  235. break;    
  236. casePASSWORD_CHECK:    
  237. if(strnicmp(buf,"-ERR",4)==0)    
  238. {    
  239. m_ErrorMessage=_T("BadPasswordName");    
  240. returnFALSE;    
  241. }    
  242. break;    
  243. caseQUIT_CHECK:    
  244. if(strnicmp(buf,"-ERR",4)==0)    
  245. {    
  246. m_ErrorMessage=_T("ErroroccuredduringQUIT");    
  247. returnFALSE;    
  248. }    
  249. break;    
  250. caseDELETE_CHECK:    
  251. if(strnicmp(buf,"-ERR",4)==0)    
  252. {    
  253. m_ErrorMessage=_T("ErroroccuredduringDELE");    
  254. returnFALSE;    
  255. }    
  256. break;    
  257. caseRSET_CHECK:    
  258. if(strnicmp(buf,"-ERR",4)==0)    
  259. {    
  260. m_ErrorMessage=_T("ErroroccuredduringRSET");    
  261. returnFALSE;    
  262. }    
  263. break;    
  264. caseSTAT_CHECK:    
  265. if(strnicmp(buf,"-ERR",4)==0)    
  266. {    
  267. m_ErrorMessage=_T("ErroroccuredduringSTAT");    
  268. returnFALSE;    
  269. }    
  270. else    
  271. {    
  272. BOOLEmailNumber=TRUE;    
  273. forchar*p=buf;*p!=’\0’;p++)    
  274. {    
  275. if(*p==’\t’||*p==’’)    
  276. {    
  277. if(EmailNumber==TRUE)    
  278. {    
  279. m_NumberMail=atoi(p);    
  280. EmailNumber=FALSE;    
  281. }    
  282. else    
  283. {    
  284. m_TotalSize=atoi(p);    
  285. returnTRUE;    
  286. }    
  287. }    
  288. }    
  289. }    
  290. break;    
  291. caseNOOP_CHECK:    
  292. if(strnicmp(buf,"-ERR",4)==0)    
  293. {    
  294. m_ErrorMessage=_T("ErroroccuredduringNOOP");    
  295. returnFALSE;    
  296. }    
  297. break;    
  298. caseLIST_CHECK:    
  299. if(strnicmp(buf,"-ERR",4)==0)    
  300. {    
  301. m_ErrorMessage=_T("ErroroccuredduringLIST");    
  302. returnFALSE;    
  303. }    
  304. else    
  305. {    
  306. m_PopServer.Receive(buf,sizeof(buf));    
  307. forchar*p=buf;*p!=’.’;p++)    
  308. if(*p==’\t’||*p==’’)    
  309. m_SizeOfMsg.Add(atoi(p));    
  310. }    
  311. break;    
  312. caseRETR_CHECK:    
  313. if(strnicmp(buf,"-ERR",4)==0)    
  314. {    
  315. m_ErrorMessage=_T("ErroroccuredduringRETR");    
  316. returnFALSE;    
  317. }    
  318. else    
  319. {    
  320. chartemp[9000];    
  321. m_PopServer.Receive(temp,sizeof(temp));    
  322. m_MsgContents=temp;    
  323. }    
  324. break;    
  325. }    
  326. returnTRUE;    
  327. }    
  328. CStringCPop::GetErrorMessage()    
  329. {    
  330. returnm_ErrorMessage;    
  331. }    
  332. BOOLCPop::List()    
  333. {    
  334. charbuf[512];    
  335. wsprintf(buf,"LIST\r\n");    
  336. m_PopServer.Send(buf,strlen(buf));    
  337. if(CheckResponse(LIST_CHECK)==FALSE)    
  338. returnFALSE;    
  339. else    
  340. returnTRUE;    
  341. }    

你可能感兴趣的:(windows,网络协议,网络应用)