Pop3Message.cpp
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:8k
源码类别:

Email客户端

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "Pop3Message.h"
  3. #include "MIMECode.h"
  4. #include "Base64.h"
  5. CPop3Message::CPop3Message(void)
  6. {
  7. }
  8. CPop3Message::~CPop3Message(void)
  9. {
  10. }
  11. ///<summary>
  12. ///   pass the mail header to this object
  13. ///</summary>
  14. void CPop3Message::SetTopMailContent(LPCTSTR pszMail)
  15. {
  16. m_strData = pszMail;
  17. DecodeHeader();
  18. }
  19. ///<summary>
  20. ///   pass all the mail to this object
  21. ///</summary>
  22. ///<param name = pszMail>
  23. ///   the content of the mail
  24. ///</param>
  25. void CPop3Message::SetMailContent(IN LPCTSTR pszMail)
  26. {
  27. m_strData = pszMail;
  28. ExtractMailContent();
  29. }
  30. ///<summary>
  31. ///   override the operator
  32. ///</summary>
  33. BOOL CPop3Message::operator ==(const CPop3Message& cMsg)
  34. {
  35. return ((cMsg.GetMailSubject() == m_strSubject)
  36.  && (cMsg.GetMailFrom() == m_strFrom)
  37.  && (cMsg.GetMailDate() == m_strDate));
  38. }
  39. ///<summary>
  40. ///   parse the mail header
  41. ///</summary>
  42. void CPop3Message::DecodeHeader()
  43. {
  44. int nStartpos = -1;
  45. int nEndpos = -1;
  46. CString strSearchFor;
  47. //We can assume that there's a CR/LF before each of the tags, as the servers insert
  48. //Received: lines on top of the mail while transporting the mail
  49. strSearchFor="rnFrom: ";
  50. nStartpos = m_strData.Find(strSearchFor);
  51. if (nStartpos < 0)
  52. {
  53. m_strFrom.Empty();
  54. }
  55. else
  56. {
  57. nEndpos = m_strData.Mid(nStartpos + strSearchFor.GetLength()).Find("rn");
  58. m_strFrom = m_strData.Mid(nStartpos + strSearchFor.GetLength(), nEndpos);
  59. ParseFrom();
  60. }
  61. strSearchFor = "rnDate:";
  62. nStartpos = m_strData.Find(strSearchFor);
  63. if (nStartpos < 0)
  64. {
  65. m_strDate.Empty();
  66. }
  67. else
  68. {
  69. nEndpos = m_strData.Mid(nStartpos + strSearchFor.GetLength()).Find("rn");
  70. m_strDate = m_strData.Mid(nStartpos + strSearchFor.GetLength(), nEndpos);
  71. ParseTime();
  72. }
  73. strSearchFor = "rnSubject:";
  74. nStartpos = m_strData.Find(strSearchFor);
  75. if (nStartpos < 0)
  76. {
  77. m_strSubject.Empty();
  78. }
  79. else
  80. {
  81. nEndpos = m_strData.Mid(nStartpos + strSearchFor.GetLength()).Find("rn");
  82. m_strSubject = m_strData.Mid(nStartpos + strSearchFor.GetLength(), nEndpos);
  83. ParseSubject();
  84. }
  85. }
  86. ///<summary>
  87. ///   parse the mail to extract the mail content
  88. ///</summary>
  89. void CPop3Message::ExtractMailContent()
  90. {
  91. int nPos = -1;
  92. nPos = m_strData.Find("Content-Type: text/plain");
  93. if (-1 == nPos)
  94. {
  95. //only process the text part now
  96. return;
  97. }
  98. m_strData = m_strData.Right(m_strData.GetLength() - nPos - 24);
  99. nPos = -1;
  100. nPos = m_strData.Find("Content-Transfer-Encoding: ");
  101. if (-1 == nPos)
  102. {
  103. return;
  104. }
  105. m_strData = m_strData.Right(m_strData.GetLength() - nPos - 27);
  106. nPos = -1;
  107. nPos = m_strData.Find("7bit");
  108. if (0 == nPos)
  109. {
  110. m_strData = m_strData.Right(m_strData.GetLength() - nPos - 8);//7bitrnrn
  111. nPos = -1;
  112. nPos = m_strData.Find("--");
  113. if (-1 != nPos)
  114. {
  115. m_strContent = m_strData.Left(nPos);
  116. }
  117. return;
  118. }
  119. nPos = -1;
  120. nPos = m_strData.Find("base64");
  121. if (0 == nPos)
  122. {
  123. m_strData = m_strData.Right(m_strData.GetLength() - nPos - 10);//base64rnrn
  124. nPos = -1;
  125. nPos = m_strData.Find("--");
  126. if (-1 != nPos)
  127. {
  128. CString strContent;
  129. strContent = m_strData.Left(nPos);
  130. CBase64 base64;
  131. m_strContent = base64.Decode(strContent);
  132. }
  133. }
  134. }
  135. ///<summary>
  136. ///   acquire the sender of the mail
  137. ///</summary>
  138. CString CPop3Message::GetMailFrom()const
  139. {
  140. return m_strFrom;
  141. }
  142. ///<summary>
  143. ///   acquire the subject of the mail
  144. ///</summary>
  145. CString CPop3Message::GetMailSubject()const
  146. {
  147. return m_strSubject;
  148. }
  149. ///<summary>
  150. ///   acquire the Date of the mail
  151. ///</summary>
  152. CString CPop3Message::GetMailDate()const
  153. {
  154. return m_strDate;
  155. }
  156. ///<summary>
  157. ///   acquire the mail content
  158. ///</summary>
  159. CString CPop3Message::GetMailContent()const
  160. {
  161. return m_strContent;
  162. }
  163. ///<summary>
  164. ///   parse the time format to give a more proper one to show
  165. ///</summary>
  166. void CPop3Message::ParseTime()
  167. {
  168. //we assume that the time format is like Wed, 15 Oct 2008 14:08:40 +0800
  169. CString strTmp1, strTmp2;
  170. int nPos = -1;
  171. nPos = m_strDate.Find(',');
  172. if (nPos > 0)
  173. {
  174. strTmp1 = m_strDate.Left(nPos);
  175. strTmp1.Trim();
  176. strTmp1 = ConvertWeekToChinese(strTmp1);
  177. m_strDate = m_strDate.Right(m_strDate.GetLength() - nPos - 2);
  178. }
  179. else
  180. {
  181. return;
  182. }
  183. nPos = -1;
  184. nPos = m_strDate.Find(' ');
  185. if (nPos > 0)
  186. {
  187. strTmp2 = m_strDate.Left(nPos);
  188. m_strDate = m_strDate.Right(m_strDate.GetLength() - nPos - 1);
  189. strTmp2 += _T("日");
  190. strTmp2 += strTmp1;
  191. }
  192. else
  193. {
  194. return;
  195. }
  196. nPos = -1;
  197. nPos = m_strDate.Find(' ');
  198. if (nPos > 0)
  199. {
  200. strTmp1 = m_strDate.Left(nPos);
  201. strTmp1 = ConvertMonthToChinese(strTmp1);
  202. m_strDate = m_strDate.Right(m_strDate.GetLength() - nPos - 1);
  203. strTmp1 += strTmp2;
  204. }
  205. else
  206. {
  207. return;
  208. }
  209. nPos = -1;
  210. nPos = m_strDate.Find(' ');
  211. if (nPos > 0)
  212. {
  213. strTmp2 = m_strDate.Left(nPos);
  214. m_strDate = m_strDate.Right(m_strDate.GetLength() - nPos - 1);
  215. strTmp2 += _T("年");
  216. strTmp2 += strTmp1;
  217. }
  218. else
  219. {
  220. return;
  221. }
  222. nPos = -1;
  223. nPos = m_strDate.Find(' ');
  224. if (nPos > 0)
  225. {
  226. strTmp1 = m_strDate.Left(nPos);
  227. m_strDate = m_strDate.Right(m_strDate.GetLength() - nPos - 1);
  228. strTmp2 += strTmp1;
  229. m_strDate = strTmp2;
  230. }
  231. else
  232. {
  233. return;
  234. }
  235. }
  236. ///<summary>
  237. ///   convert the English name referred to week into Chinese
  238. ///</summary>
  239. CString CPop3Message::ConvertWeekToChinese(IN const CString& strEng)
  240. {
  241. int nPos = -1;
  242. nPos = strEng.Find("Mon");
  243. if (nPos >= 0)
  244. {
  245. return _T(" (星期一) ");
  246. }
  247. nPos = -1;
  248. nPos = strEng.Find("Tue");
  249. if (nPos >= 0)
  250. {
  251. return _T(" (星期二) ");
  252. }
  253. nPos = -1;
  254. nPos = strEng.Find("Wed");
  255. if (nPos >= 0)
  256. {
  257. return _T(" (星期三) ");
  258. }
  259. nPos = -1;
  260. nPos = strEng.Find("Thu");
  261. if (nPos >= 0)
  262. {
  263. return _T(" (星期四) ");
  264. }
  265. nPos = -1;
  266. nPos = strEng.Find("Fri");
  267. if (nPos >= 0)
  268. {
  269. return _T(" (星期五) ");
  270. }
  271. nPos = -1;
  272. nPos = strEng.Find("Sat");
  273. if (nPos >= 0)
  274. {
  275. return _T(" (星期六) ");
  276. }
  277. nPos = -1;
  278. nPos = strEng.Find("Sun");
  279. if (nPos >= 0)
  280. {
  281. return _T(" (星期日) ");
  282. }
  283. ASSERT(FALSE);
  284. return _T(" (未知) ");
  285. }
  286. ///<summary>
  287. ///   convert the English name referred to month into Chinese
  288. ///</summary>
  289. CString CPop3Message::ConvertMonthToChinese(IN const CString& strEng)
  290. {
  291. if (_T("Jan") == strEng)
  292. {
  293. return _T("1月");
  294. }
  295. else if (_T("Feb") == strEng)
  296. {
  297. return _T("2月");
  298. }
  299. else if (_T("Mar") == strEng)
  300. {
  301. return _T("3月");
  302. }
  303. else if (_T("Apr") == strEng)
  304. {
  305. return _T("4月");
  306. }
  307. else if (_T("May") == strEng)
  308. {
  309. return _T("5月");
  310. }
  311. else if (_T("Jun") == strEng)
  312. {
  313. return _T("6月");
  314. }
  315. else if (_T("Jul") == strEng)
  316. {
  317. return _T("7月");
  318. }
  319. else if (_T("Aug") == strEng)
  320. {
  321. return _T("8月");
  322. }
  323. else if (_T("Sep") == strEng)
  324. {
  325. return _T("9月");
  326. }
  327. else if (_T("Oct") == strEng)
  328. {
  329. return _T("10月");
  330. }
  331. else if (_T("Nov") == strEng)
  332. {
  333. return _T("11月");
  334. }
  335. else if (_T("Dec") == strEng)
  336. {
  337. return _T("12月");
  338. }
  339. ASSERT(FALSE);
  340. return _T(" (未知)");
  341. }
  342. ///<summary>
  343. ///   parse the "From" part
  344. ///</summary>
  345. void CPop3Message::ParseFrom()
  346. {
  347. int nPos = -1;
  348. nPos = m_strFrom.Find('<');
  349. if (nPos > 0)
  350. {
  351. int nEndPos = -1;
  352. nEndPos = m_strFrom.Find('>');
  353. m_strFrom = m_strFrom.Mid(nPos + 1, nEndPos - nPos - 1);
  354. }
  355. }
  356. ///<summary>
  357. ///   parse the "Subject" part
  358. ///</summary>
  359. void CPop3Message::ParseSubject()
  360. {
  361. CString strHead;
  362. strHead = m_strSubject.Left(2);
  363. if (strHead != _T("=?"))
  364. {
  365. return;
  366. }
  367. m_strSubject = m_strSubject.Right(m_strSubject.GetLength() - 2);//delete the "=?"
  368. int nPos = -1;
  369. nPos = m_strSubject.Find('?');
  370. if (nPos > 0)
  371. {
  372. m_strSubject = m_strSubject.Right(m_strSubject.GetLength() - nPos - 1);
  373. nPos = -1;
  374. nPos = m_strSubject.Find('?');
  375. if (nPos > 0)
  376. {
  377. m_strSubject = m_strSubject.Right(m_strSubject.GetLength() - nPos - 1);
  378. m_strSubject = m_strSubject.Left(m_strSubject.GetLength() - 2);//delete the "?="
  379. CBase64 base64;
  380. m_strSubject = base64.Decode(m_strSubject);
  381. }
  382. }
  383. }