Pop.cpp
上传用户:huaqiang
上传日期:2007-01-03
资源大小:19k
文件大小:6k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // Pop.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "Pop.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. //////////////////////////////////////////////////////////////////////
  11. // CPop Class
  12. //////////////////////////////////////////////////////////////////////
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CPop::CPop()
  17. {
  18. m_PopServer.Create();
  19. }
  20. //{4EEC1C91-6BE1-11d1-8824-00001C302581}
  21. CPop::~CPop()
  22. {
  23. m_PopServer.Close();
  24. }
  25. BOOL CPop::Connect(CString & Host, CString & User, CString & Password)
  26. {
  27. char buf [512];
  28. if (!m_PopServer.Connect(Host,110)) // 110 Pop3 Port
  29. {
  30. m_ErrorMessage = _T("Server cannot be connected");
  31. return FALSE;
  32. }
  33. else
  34. {
  35. if(CheckResponse(CONNECTION_CHECK)==FALSE)
  36. return FALSE;
  37. wsprintf (buf, "USER %srn", (LPCSTR) User);
  38. m_PopServer.Send(buf, strlen (buf));
  39. if(CheckResponse(USER_CHECK)==FALSE)
  40. return FALSE;
  41. wsprintf (buf, "PASS %srn", (LPCSTR) Password);
  42. m_PopServer.Send(buf, strlen (buf)); 
  43. if (CheckResponse(PASSWORD_CHECK)==FALSE)
  44. return FALSE;
  45. return TRUE;
  46. }
  47. }
  48. BOOL CPop::Delete(int & MsgNumber)
  49. {
  50. char buf [512];
  51. wsprintf (buf, "DELE %drn",MsgNumber );
  52. m_PopServer.Send(buf, strlen (buf)); 
  53. if (CheckResponse(DELETE_CHECK)==FALSE)
  54. return FALSE;
  55. else
  56. return TRUE;
  57. }
  58. BOOL CPop::Disconnect()
  59. {
  60. char buf [512];
  61. wsprintf (buf, "QUIT rn");
  62. m_PopServer.Send(buf, strlen (buf)); 
  63. if (CheckResponse(QUIT_CHECK)==FALSE)
  64. return FALSE;
  65. else
  66. return TRUE;
  67. }
  68. BOOL CPop::Noop()
  69. {
  70. char buf [512];
  71. wsprintf (buf, "NOOP  rn");
  72. m_PopServer.Send(buf, strlen (buf)); 
  73. if (CheckResponse(NOOP_CHECK)==FALSE)
  74. return FALSE;
  75. else
  76. return TRUE;
  77. }
  78. // Return the Msg Size for given msg number
  79. int CPop::GetMessageSize(int MsgNumber)
  80. {
  81. if(m_SizeOfMsg.GetSize() < MsgNumber+1)
  82. return 0;
  83. else
  84. return m_SizeOfMsg[MsgNumber+1];
  85. }
  86. BOOL CPop::Reset()
  87. {
  88. char buf [512];
  89. wsprintf (buf, "RSET rn");
  90. m_PopServer.Send(buf, strlen (buf)); 
  91. if (CheckResponse(RSET_CHECK)==FALSE)
  92. return FALSE;
  93. else
  94. return TRUE;
  95. }
  96. // MsgContents will hold the msg body
  97. BOOL CPop::Retrieve(int  MsgNumber)
  98. {
  99. char buf [512];
  100. wsprintf (buf, "RETR %drn",MsgNumber );
  101. m_PopServer.Send(buf, strlen (buf)); 
  102. if (CheckResponse(RETR_CHECK)==FALSE)
  103. return FALSE;
  104. else
  105. return TRUE;
  106. }
  107. BOOL CPop::Statistics()
  108. {
  109. char buf [512];
  110. wsprintf (buf, "STAT rn");
  111. m_PopServer.Send(buf, strlen (buf)); 
  112. if (CheckResponse(STAT_CHECK)==FALSE)
  113. return FALSE;
  114. else
  115. return TRUE;
  116. }
  117. CString CPop::GetMsgContents()
  118. {
  119. return m_MsgContents;
  120. }
  121. int CPop::GetNumberOfMails()
  122. {
  123. return m_NumberMail;
  124. }
  125. int CPop::GetTotalMailSize()
  126. {
  127. return m_TotalSize;
  128. }
  129. BOOL CPop::Connect()
  130. {
  131. Connect(m_Host, m_User, m_Password);
  132. return TRUE;
  133. }
  134. void CPop::SetHost(CString & Host)
  135. {
  136. m_Host = Host;
  137. }
  138. CString CPop::GetHost()
  139. {
  140. return m_Host;
  141. }
  142. void CPop::SetUser(CString & User)
  143. {
  144. m_User = User;
  145. }
  146. CString CPop::GetUser()
  147. {
  148. return m_User;
  149. }
  150. void CPop::SetPassword(CString & Password)
  151. {
  152. m_Password = Password;
  153. }
  154. CString CPop::GetPassword()
  155. {
  156. return m_Password;
  157. }
  158. BOOL CPop::CheckResponse(int ResponseType)
  159. {
  160. char buf [1000];
  161. for (int i=0;i<512;i++)
  162. buf[i]='';
  163. m_PopServer.Receive(buf, sizeof(buf));
  164. switch (ResponseType)
  165. {
  166. case CONNECTION_CHECK:
  167. if (strnicmp(buf,"-ERR", 4) == 0)
  168. {
  169. m_ErrorMessage = _T("Bad Connection");
  170. return FALSE;
  171. break;
  172. case USER_CHECK:
  173. if (strnicmp(buf,"-ERR", 4) == 0)
  174. {
  175. m_ErrorMessage = _T("Bad User Name");
  176. return FALSE;
  177. break;
  178. case PASSWORD_CHECK:
  179. if (strnicmp(buf,"-ERR", 4) == 0)
  180. {
  181. m_ErrorMessage = _T("Bad Password Name");
  182. return FALSE;
  183. }
  184. break;
  185. case QUIT_CHECK:
  186. if (strnicmp(buf,"-ERR", 4) == 0)
  187. {
  188. m_ErrorMessage = _T("Error occured during QUIT");
  189. return FALSE;
  190. }
  191. break;
  192. case DELETE_CHECK:
  193. if (strnicmp(buf,"-ERR", 4) == 0)
  194. {
  195. m_ErrorMessage = _T("Error occured during DELE");
  196. return FALSE;
  197. }
  198. break;
  199. case RSET_CHECK:
  200. if (strnicmp(buf,"-ERR", 4) == 0)
  201. {
  202. m_ErrorMessage = _T("Error occured during RSET");
  203. return FALSE;
  204. }
  205. break;
  206. case STAT_CHECK:
  207. if (strnicmp(buf,"-ERR", 4) == 0)
  208. {
  209. m_ErrorMessage = _T("Error occured during STAT");
  210. return FALSE;
  211. }
  212. else
  213. {
  214. BOOL EmailNumber = TRUE;
  215. for (char *p = buf; *p != ''; p++)
  216. {
  217. if (*p == 't' || *p == ' ')
  218. {
  219. if(EmailNumber == TRUE)
  220. {
  221. m_NumberMail = atoi(p);
  222. EmailNumber = FALSE;
  223. }
  224. else
  225. {
  226. m_TotalSize = atoi(p);
  227. return TRUE;
  228. }
  229. }
  230. }
  231. }
  232. break;
  233. case NOOP_CHECK:
  234. if (strnicmp(buf,"-ERR", 4) == 0)
  235. {
  236. m_ErrorMessage = _T("Error occured during NOOP");
  237. return FALSE;
  238. }
  239. break;
  240. case LIST_CHECK:
  241. if (strnicmp(buf,"-ERR", 4) == 0)
  242. {
  243. m_ErrorMessage = _T("Error occured during LIST");
  244. return FALSE;
  245. }
  246. else
  247. {
  248. m_PopServer.Receive(buf, sizeof(buf));
  249. for (char *p = buf; *p != '.'; p++)
  250. if (*p == 't' || *p == ' ')
  251. m_SizeOfMsg.Add(atoi(p));
  252. }
  253. break;
  254. case RETR_CHECK:
  255. if (strnicmp(buf,"-ERR", 4) == 0)
  256. {
  257. m_ErrorMessage = _T("Error occured during RETR");
  258. return FALSE;
  259. }
  260. else
  261. {
  262. char temp[9000];
  263. m_PopServer.Receive(temp, sizeof(temp));
  264. m_MsgContents = temp;
  265. }
  266. break;
  267. }
  268. return TRUE;
  269. }
  270. CString CPop::GetErrorMessage()
  271. {
  272. return m_ErrorMessage;
  273. }
  274. BOOL CPop::List()
  275. {
  276. char buf [512];
  277. wsprintf (buf, "LIST  rn");
  278. m_PopServer.Send(buf, strlen (buf)); 
  279. if (CheckResponse(LIST_CHECK)==FALSE)
  280. return FALSE;
  281. else
  282. return TRUE;
  283. }