Pop3.cpp
上传用户:pyhyhg
上传日期:2022-08-11
资源大小:56k
文件大小:6k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // Pop31.cpp: implementation of the CPop3 class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Pop3Base4.h"
  6. #include "POP3SMTPDlg.h"
  7. #include "Pop3.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. #define MAX_BUFF 20000
  14. //////////////////////////////////////////////////////////////////////
  15. // Construction/Destruction
  16. //////////////////////////////////////////////////////////////////////
  17. CPop3::CPop3()
  18. {
  19. state=FIRST;
  20. error="Not ed to serverrn";
  21. delAfterRead=FALSE;
  22. }
  23. CPop3::~CPop3()
  24. {
  25. }
  26. void CPop3::OnReceive(int err)
  27. {
  28. if(err==0) //if no error
  29. {
  30. char buff[MAX_BUFF];
  31. int rec=Receive(buff,MAX_BUFF); //receive data
  32. buff[rec]=NULL;
  33. lastMsg=buff;
  34. ParseMsg(); //parse data
  35. }
  36. else
  37. {
  38. error="Error while receiving!rn";
  39. ((DLG)m_pWnd)->Dispatch(S_CLOSE);
  40. }
  41. }
  42. void CPop3::GetLastMsg(CString &s)
  43. {
  44. s=lastMsg;
  45. }
  46. void CPop3::SetProp(CString u, CString p)
  47. {
  48. user=u;
  49. pass=p;
  50. }
  51. void CPop3::ParseMsg()
  52. {
  53. CString s;
  54. strstream str;
  55. string check;
  56. str<<(LPCSTR)lastMsg;
  57. str>>check;
  58. if(check=="-ERR") //if there is an error
  59. {
  60. error="从服务器收到 -ERR:"+lastMsg;
  61. Close(); //dis and stop
  62. return;
  63. }
  64. switch(state) //what should we do next?
  65. {
  66. case FIRST: //if we are already ed
  67. msgs.clear();
  68. ((DLG)m_pWnd)->Dispatch(S_RECEIVE); //send message to parent
  69. s.Format("user %s%c%c",user,13,10);
  70. Send((LPCSTR)s,s.GetLength()); //send user id
  71. state=USER;
  72. break;
  73. case USER:
  74. ((DLG)m_pWnd)->Dispatch(S_RECEIVE);
  75. s.Format("pass %s%c%c",pass,13,10); 
  76. Send((LPCSTR)s,s.GetLength()); //now send password
  77. state=PASS;
  78. break;
  79. case PASS:
  80. ((DLG)m_pWnd)->Dispatch(S_RECEIVE);
  81. s.Format("stat%c%c",13,10);
  82. Send((LPCSTR)s,s.GetLength()); //now send stat request
  83. state=STAT; 
  84. break;
  85. case STAT:
  86. {
  87. string s1;
  88. str.seekg(0);
  89. str>>s1>>numMsg>>sizeMsg; //obtain number and size of messages
  90. flush(str);
  91. ((DLG)m_pWnd)->Dispatch(S_GETNUMMSGS);
  92. ((DLG)m_pWnd)->Dispatch(S_GETSIZEMSGS);
  93. if(numMsg>0) //if there are any messages then send retr command
  94. {
  95. state=RETR;
  96. s.Format("retr 1%c%c",13,10);
  97. retrMsg=1;
  98. MESSAGEPROP prop;
  99. prop.msgSize=0;
  100. prop.retrSize=0;
  101. prop.text="";
  102. msgs.push_back(prop); 
  103. Send((LPCSTR)s,s.GetLength()); //send retr request
  104. }
  105. else //if not, dis
  106. {
  107. error="没有新的信件!rn";
  108. Close();
  109. }
  110. }
  111. break;
  112. case RETR:
  113. {
  114. if(msgs[retrMsg-1].msgSize==0) //if it's first data then skip +OK
  115. {
  116. string temp;
  117. str.seekg(0);
  118. str>>temp>>msgs[retrMsg-1].msgSize; //and obtain size of message
  119. }
  120. msgs[retrMsg-1].text+=lastMsg; //append data to messagetext
  121. msgs[retrMsg-1].retrSize+=lastMsg.GetLength(); //add data size to retr size
  122. if(msgs[retrMsg-1].retrSize>=msgs[retrMsg-1].msgSize) //if we've got whole message
  123. { //check if there are any other messages
  124. if(retrMsg<numMsg) //if yes
  125. {
  126. MESSAGEPROP prop;
  127. prop.msgSize=0;
  128. prop.retrSize=0;
  129. prop.text="";
  130. msgs.push_back(prop);
  131. retrMsg++;
  132. s.Format("retr %d%c%c",retrMsg,13,10); //request another
  133. Send((LPCSTR)s,s.GetLength());
  134. }
  135. else
  136. {
  137. //we've got now all messages
  138. if(delAfterRead && numMsg>0) //we want to delete them from server
  139. {
  140. state=DELE;
  141. delMsg=1;
  142. s.Format("dele %d%c%c",delMsg,13,10);
  143. Send((LPCSTR)s,s.GetLength());
  144. }
  145. else //leave them and dis
  146. {
  147. state=ENDRETR;
  148. ((DLG)m_pWnd)->Dispatch(S_ENDRETR);
  149. error="Session endedrn";
  150. s.Format("quit%c%c",13,10);
  151. Send((LPCSTR)s,s.GetLength());
  152. Close();
  153. }
  154. }
  155. }
  156. }break;
  157. case DELE:
  158. {
  159. //delete another message
  160. if(delMsg<numMsg)
  161. {
  162. delMsg++;
  163. s.Format("dele %d%c%c",delMsg,13,10);
  164. Send((LPCSTR)s,s.GetLength());
  165. }
  166. else //no more messages - dis
  167. {
  168. ((DLG)m_pWnd)->Dispatch(S_ENDRETR);
  169. state=GOON;
  170. error="Deleted all messagesrn";
  171. s.Format("quit%c%c",13,10);
  172. Send((LPCSTR)s,s.GetLength());
  173. Close();
  174. }
  175. }
  176. break;
  177. case GOON: //default
  178. default:
  179. ((DLG)m_pWnd)->Dispatch(S_RECEIVE);
  180. break;
  181. }
  182. }
  183. void CPop3::Close()
  184. {
  185. CString str;
  186. str.Format("quit%c%c",13,10);
  187. Send((LPCSTR)str,str.GetLength());
  188. ((DLG)m_pWnd)->Dispatch(S_CLOSE);
  189. state=FIRST;
  190. CAsyncSocket::Close();
  191. error="Not ed to serverrn";
  192. }
  193. CString CPop3::GetError()
  194. {
  195. return error;
  196. }
  197. int CPop3::GetNumMsg()
  198. {
  199. return numMsg;
  200. }
  201. int CPop3::GetSizeMsg()
  202. {
  203. return sizeMsg;
  204. }
  205. int CPop3::GetRetrMsgNum()
  206. {
  207. return msgs.size();
  208. }
  209. CString CPop3::GetMsg(int i)
  210. {
  211. return msgs[i].text;
  212. }
  213. CString CPop3::GetMsgSubject(int i)
  214. {
  215. int where=msgs[i].text.Find("Subject:");
  216. CString ret;
  217. ReadLn(where,msgs[i].text,ret);
  218. return ret;
  219. }
  220. void CPop3::DelAfterRead(BOOL del)
  221. {
  222. delAfterRead=del;
  223. }
  224. CString CPop3::GetMsgBody(int i)
  225. {
  226. CString ret;
  227. int where=msgs[i].text.Find("rnrn");
  228. if(where!=-1)
  229. where+=4;
  230. else where=0;
  231. ret=msgs[i].text.Right(msgs[i].text.GetLength()-where);
  232. ret=ret.Left(ret.GetLength()-3);
  233. return ret;
  234. }
  235. CString CPop3::GetMsgStuff(int i)
  236. {
  237. CString ret;
  238. int where=msgs[i].text.Find("From:");
  239. ReadLn(where,msgs[i].text,ret);
  240. ret+="rn";
  241. where=msgs[i].text.Find("To:");
  242. ReadLn(where,msgs[i].text,ret);
  243. ret+="rn";
  244. where=msgs[i].text.Find("Date:");
  245. ReadLn(where,msgs[i].text,ret);
  246. ret+="rn";
  247. ret+=GetMsgSubject(i);
  248. ret+="rn";
  249. return ret;
  250. }
  251. void CPop3::ReadLn(int index,CString src, CString &dst)
  252. {
  253. CString comp;
  254. comp=src[index];
  255. while(comp!="r")
  256. {
  257. dst+=comp;
  258. comp=src[++index];
  259. }
  260. }
  261. void CPop3::WriteMsg(int i, CString name)
  262. {
  263. CStdioFile file(name,CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
  264. file.Write((LPCSTR)msgs[i].text,msgs[i].text.GetLength());
  265. file.Close();
  266. }
  267.