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

Email客户端

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "SimpleMail.h"
  5. #include "MailMessage.h"
  6. #include "SmtpSendManger.h"
  7. #include "Pop3Message.h"
  8. #include "MailSaveMngr.h"
  9. #include "RecvProgressDlg.h"
  10. #include "PopReceiveManager.h"
  11. #include "MailManager.h"
  12. #include "LeftPaneView.h"
  13. #include "MainFrm.h"
  14. #include "SettingDlg.h"
  15. #include "ExpandEditCtrl.h"
  16. #include "SendDlg.h"
  17. #include "ListCtrlView.h"
  18. #include "EditCtrlView.h"
  19. #include "SplitterView.h"
  20. #include "RightPaneFrame.h"
  21. #include <Shlwapi.h>
  22. #include <windows.h>
  23. #include "MIMECode.h"
  24. #include "Base64.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #endif
  28. // CMainFrame
  29. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  30. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  31. ON_WM_CREATE()
  32. ON_MESSAGE(WM_ICON_NOTIFY, OnTrayNotification)
  33. ON_MESSAGE(WM_LIST_SELECTED, OnMailListSelected)
  34. ON_COMMAND(ID_MAIL_SETTING, &CMainFrame::OnMailSetting)
  35. ON_COMMAND(ID_MAIL_SEND, &CMainFrame::OnMailSend)
  36. ON_COMMAND(ID_MAIL_RECEIVE, &CMainFrame::OnMailReceive)
  37. ON_WM_CLOSE()
  38. ON_WM_SYSCOMMAND()
  39. ON_WM_PAINT()
  40. ON_WM_SHOWWINDOW()
  41. END_MESSAGE_MAP()
  42. static UINT indicators[] =
  43. {
  44. ID_SEPARATOR,           // status line indicator
  45. ID_INDICATOR_CAPS,
  46. ID_INDICATOR_NUM,
  47. ID_INDICATOR_SCRL,
  48. };
  49. // CMainFrame construction/destruction
  50. CMainFrame::CMainFrame()
  51. {
  52. // TODO: add member initialization code here
  53. m_nOldMailCount = 0;
  54. m_bHaveSavedMail = FALSE;
  55. m_pProgDlg = NULL;
  56. m_pLeftPaneView = NULL;
  57. m_bIntialize = TRUE;
  58. memset(m_szSetFileName, 0, sizeof(m_szSetFileName));
  59. }
  60. CMainFrame::~CMainFrame()
  61. {
  62. DelIconFromTray();
  63. }
  64. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  65. {
  66. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  67. return -1;
  68. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  69. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  70. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  71. {
  72. TRACE0("Failed to create toolbarn");
  73. return -1;      // fail to create
  74. }
  75. if (!m_wndStatusBar.Create(this) ||
  76. !m_wndStatusBar.SetIndicators(indicators,
  77.   sizeof(indicators)/sizeof(UINT)))
  78. {
  79. TRACE0("Failed to create status barn");
  80. return -1;      // fail to create
  81. }
  82. // TODO: Delete these three lines if you don't want the toolbar to be dockable
  83. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  84. EnableDocking(CBRS_ALIGN_ANY);
  85. DockControlBar(&m_wndToolBar);
  86. ReadMailSetting();
  87. return 0;
  88. }
  89. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
  90. CCreateContext* pContext)
  91. {
  92. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  93. {
  94. TRACE0("Failed to create splitter windown");
  95. return FALSE;
  96. }
  97. // Get the client rect first for calculating left pane size
  98. CRect rect;
  99. GetClientRect(&rect);
  100. // create the left tree view first.
  101. if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(rect.Width()/3, 0), pContext))
  102. {
  103. TRACE0("Failed to create left pane viewn");
  104. return FALSE;
  105. }
  106. // The right pane is a frame which and contain several different views.
  107. // The is can be set to active or non-active
  108. if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightPaneFrame), CSize(0, 0), pContext))
  109. {
  110. TRACE0("Failed to create right pane framen");
  111. return FALSE;
  112. }
  113. m_pLeftPaneView = (CLeftPaneView*) m_wndSplitter.GetPane(0,0);
  114. m_pLeftPaneView->m_pRightPaneFrame = (CRightPaneFrame*) m_wndSplitter.GetPane(0, 1);
  115. // Set the left pane as the active view
  116. SetActiveView((CView*) m_wndSplitter.GetPane(0, 0));
  117. return TRUE;
  118. }
  119. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  120. {
  121. if( !CFrameWnd::PreCreateWindow(cs) )
  122. return FALSE;
  123. // TODO: Modify the Window class or styles here by modifying
  124. //  the CREATESTRUCT cs
  125. cs.style &=  ~FWS_ADDTOTITLE;   
  126. return TRUE;
  127. }
  128. // CMainFrame diagnostics
  129. #ifdef _DEBUG
  130. void CMainFrame::AssertValid() const
  131. {
  132. CFrameWnd::AssertValid();
  133. }
  134. void CMainFrame::Dump(CDumpContext& dc) const
  135. {
  136. CFrameWnd::Dump(dc);
  137. }
  138. #endif //_DEBUG
  139. // CMainFrame message handlers
  140. void CMainFrame::OnMailSetting()
  141. {
  142. // TODO: Add your command handler code here
  143. CSettingDlg dlg;
  144. dlg.m_strUserName = m_MailMgnr.GetUserName();
  145. dlg.m_strPassword = m_MailMgnr.GetPassword();
  146. dlg.m_strSmtpServer = m_MailMgnr.GetSmtpServer();
  147. dlg.m_strSendMail = m_MailMgnr.GetSendMail();
  148. dlg.m_strPopServer = m_MailMgnr.GetPopServer();
  149. dlg.m_bValidate = m_MailMgnr.GetValidate();
  150. if (IDOK == dlg.DoModal())
  151. {
  152. m_MailMgnr.SetUserName(dlg.m_strUserName);
  153. m_MailMgnr.SetPassword(dlg.m_strPassword);
  154. m_MailMgnr.SetSmtpServer(dlg.m_strSmtpServer);
  155. m_MailMgnr.SetSendMail(dlg.m_strSendMail);
  156. m_MailMgnr.SetPopServer(dlg.m_strPopServer);
  157. m_MailMgnr.SetValidate(dlg.m_bValidate);
  158. WritePrivateProfileString(_T("Setting"), _T("UserName"), dlg.m_strUserName, m_szSetFileName);
  159. WritePrivateProfileString(_T("Setting"), _T("Password"), dlg.m_strPassword, m_szSetFileName);
  160. WritePrivateProfileString(_T("Setting"), _T("SmtpServer"), dlg.m_strSmtpServer, m_szSetFileName);
  161. WritePrivateProfileString(_T("Setting"), _T("SendMail"), dlg.m_strSendMail, m_szSetFileName);
  162. WritePrivateProfileString(_T("Setting"), _T("Pop3Server"), dlg.m_strPopServer, m_szSetFileName);
  163. if (dlg.m_bValidate)
  164. {
  165. WritePrivateProfileString(_T("Setting"), _T("Validate"), _T("TRUE"), m_szSetFileName);
  166. }
  167. else
  168. {
  169. WritePrivateProfileString(_T("Setting"), _T("Validate"), _T("FALSE"), m_szSetFileName);
  170. }
  171. m_pLeftPaneView->UpdateRootName(dlg.m_strSendMail);
  172. }
  173. }
  174. void CMainFrame::OnMailSend()
  175. {
  176. // TODO: Add your command handler code here
  177. CSendDlg dlg;
  178. if (IDOK == dlg.DoModal())
  179. {
  180. if (m_MailMgnr.SendMailMessage(dlg.m_strRcps, dlg.m_strCCRcps, 
  181. dlg.m_strBCCRcps, dlg.m_strTopic, 
  182. dlg.m_strContent, dlg.m_arrAttachFiles) != HRESULT_SUCCESS)
  183. {
  184. AfxMessageBox(_T("发送邮件失败"));
  185. }
  186. }
  187. }
  188. void CMainFrame::OnMailReceive()
  189. {
  190. //Create the dialog to show the progress
  191. m_pProgDlg = new CRecvProgressDlg;
  192. m_pProgDlg->Create(IDD_DLG_PROGRESS);
  193. CRect rect;
  194. GetClientRect(&rect);
  195. ClientToScreen(&rect);
  196. m_pProgDlg->SetWindowPos(&CWnd::wndTop, rect.TopLeft().x + 250, rect.TopLeft().y + 100, 450, 180, SWP_SHOWWINDOW);
  197. m_pProgDlg->UpdateProgress(START_RECEIVING);
  198. //clear the history information relevant to mails
  199. CMailSaveMngr* pSaveMngr = NULL;
  200. pSaveMngr = m_MailMgnr.GetSaveMngr();
  201. UINT i = 0;
  202. for (; i < (UINT)m_arrMsgPos.GetSize(); i++)
  203. {
  204. pSaveMngr->DelMail(m_arrMsgPos[i]);
  205. }
  206. m_arrMsgPos.RemoveAll();
  207. m_arrMsgSize.RemoveAll();
  208. m_arrTopMail.RemoveAll();
  209. //receive mails
  210. if (m_MailMgnr.RecMail(m_pProgDlg, m_arrMsgPos, m_arrMsgSize) != HRESULT_SUCCESS)
  211. {
  212. m_pProgDlg->UpdateProgress(RECEIVE_ERRORS);
  213. return;
  214. }
  215. //display
  216. ReadAndDisplayMails(RECEIVE_MAILS);
  217. m_pProgDlg->UpdateProgress(RECEIVED_SUCCESS);
  218. }
  219. void CMainFrame::OnClose()
  220. {
  221. // TODO: Add your message handler code here and/or call default
  222. CFile file("SimpleMail.cfg", CFile::modeCreate | CFile::modeWrite);
  223. CArchive ar(&file, CArchive::store);
  224. ar << (int)m_arrMsgPos.GetSize();
  225. UINT i = 0;
  226. for (; i < (UINT)m_arrMsgPos.GetSize(); i++)
  227. {
  228. ar << m_arrMsgPos[i].nBlockIndex;
  229. ar << m_arrMsgSize[i];
  230. }
  231. CFrameWnd::OnClose();
  232. }
  233. void CMainFrame::Serialize(CArchive& ar)
  234. {
  235. if (ar.IsStoring())
  236. {
  237. }
  238. else
  239. {
  240. }
  241. }
  242. void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
  243. {
  244. // TODO: Add your message handler code here and/or call default
  245. if (SC_MINIMIZE == nID)
  246. {
  247. ShowWindow(SW_HIDE);
  248. AddIconToTray();
  249. return;
  250. }
  251. CFrameWnd::OnSysCommand(nID, lParam);
  252. }
  253. LRESULT CMainFrame::OnTrayNotification(WPARAM wParam,LPARAM lParam)
  254. {
  255. if (wParam != IDI_ICON)
  256. {
  257. return 0L;
  258. }
  259. if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  260. {
  261. this->OnTrayOpen();
  262. }
  263. return 1;
  264. }
  265. LRESULT CMainFrame::OnMailListSelected(WPARAM wParam, LPARAM lParam)
  266. {
  267. CMailSaveMngr* pSaveMngr = NULL;
  268. pSaveMngr = m_MailMgnr.GetSaveMngr();
  269. UINT nCount = (UINT)m_arrMsgSize.GetSize();
  270. TCHAR * pszMail = NULL;
  271. pszMail = new TCHAR[m_arrMsgSize[nCount - wParam - 1]];
  272. int n = m_arrMsgSize[nCount - wParam - 1];
  273. pSaveMngr->LoadMail(m_arrMsgPos[nCount - wParam - 1], pszMail, m_arrMsgSize[nCount - wParam - 1]);
  274. CPop3Message MailMess;
  275. MailMess.SetMailContent(pszMail);
  276. CEditCtrlView* pEditView = NULL;
  277. pEditView = m_pLeftPaneView->m_pRightPaneFrame->m_pSplitterView->m_pEditCtrlView;
  278. pEditView->DisplayText(MailMess.GetMailContent());
  279. return 1;
  280. }
  281. ///<summary>
  282. ///   Add the icon to the system tray
  283. ///</summary>
  284. void CMainFrame::AddIconToTray()
  285. {
  286. NOTIFYICONDATA tnd;
  287. tnd.cbSize=sizeof(NOTIFYICONDATA);
  288. tnd.hWnd = this->m_hWnd;
  289. tnd.uID = IDI_ICON;
  290. tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  291. tnd.uCallbackMessage = WM_ICON_NOTIFY;
  292. tnd.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON));
  293. _tcscpy_s(tnd.szTip, 128, "SimpleMail");
  294. Shell_NotifyIcon(NIM_ADD, &tnd);
  295. }
  296. ///<summary>
  297. ///   Delete the icon from the system tray
  298. ///</summary>
  299. void CMainFrame::DelIconFromTray()
  300. {
  301. NOTIFYICONDATA tnid;
  302. tnid.cbSize = sizeof(NOTIFYICONDATA);
  303. tnid.hWnd = this->m_hWnd;
  304. tnid.uID = IDI_ICON;
  305. tnid.uFlags = 0;
  306. Shell_NotifyIcon(NIM_DELETE, &tnid);
  307. }
  308. ///<summary>
  309. ///   Open the program when the user click the icon in the tray
  310. ///</summary>
  311. void CMainFrame::OnTrayOpen()
  312. {
  313. AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
  314. this->SetForegroundWindow();
  315. DelIconFromTray();
  316. }
  317. ///<summary>
  318. ///   Read the setting from the disk,such as the user name, the smtp server
  319. ///</summary>
  320. void CMainFrame::ReadMailSetting()
  321. {
  322. GetModuleFileName(NULL, m_szSetFileName, _MAX_PATH);
  323. PathRemoveFileSpec(m_szSetFileName);
  324. _tcscat_s(m_szSetFileName, _MAX_PATH, SETTING_FILE_NAME);
  325. if (PathFileExists(m_szSetFileName))
  326. {
  327. TCHAR szTemp[SETTING_MAX_LEN] = {0};
  328. GetPrivateProfileString(_T("Setting"), _T("UserName"), _T("Test"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  329. m_MailMgnr.SetUserName(szTemp);
  330. GetPrivateProfileString(_T("Setting"), _T("Password"), _T("Test"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  331. m_MailMgnr.SetPassword(szTemp);
  332. GetPrivateProfileString(_T("Setting"), _T("SmtpServer"), _T("smtp.163.com"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  333. m_MailMgnr.SetSmtpServer(szTemp);
  334. GetPrivateProfileString(_T("Setting"), _T("SendMail"), _T("Test@163.com"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  335. m_MailMgnr.SetSendMail(szTemp);
  336. GetPrivateProfileString(_T("Setting"), _T("Pop3Server"), _T("pop3.163.com"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  337. m_MailMgnr.SetPopServer(szTemp);
  338. GetPrivateProfileString(_T("Setting"), _T("Validate"), _T("TRUE"), szTemp, SETTING_MAX_LEN, m_szSetFileName);
  339. if ('T' == szTemp[0])
  340. {
  341. m_MailMgnr.SetValidate(TRUE);
  342. }
  343. else
  344. {
  345. m_MailMgnr.SetValidate(FALSE);
  346. }
  347. }
  348. else
  349. {
  350. m_MailMgnr.SetUserName(_T("Test"));
  351. m_MailMgnr.SetPassword(_T("Test"));
  352. m_MailMgnr.SetSmtpServer(_T("smtp.163.com"));
  353. m_MailMgnr.SetSendMail(_T("Test@163.com"));
  354. m_MailMgnr.SetPopServer(_T("pop3.163.com"));
  355. }
  356. }
  357. ///<summary>
  358. ///   Read the former mails saved on the disk
  359. ///</summary>
  360. void CMainFrame::ReadFormerMails()
  361. {
  362. CMailSaveMngr* pSaveMngr = NULL;
  363. pSaveMngr = m_MailMgnr.GetSaveMngr();
  364. m_bHaveSavedMail = pSaveMngr->InitMailTmpFile();
  365. if (m_bHaveSavedMail)
  366. {// if there are any mails saved on the disk, load the info from the config file
  367. TCHAR szCfg[_MAX_PATH] = {0};
  368. GetModuleFileName(NULL, szCfg, _MAX_PATH);
  369. PathRemoveFileSpec(szCfg);
  370. _tcscat_s(szCfg, _MAX_PATH, MAIL_CONFIG_FILE);
  371. //make sure that the config file exist, in case we open it before it creates
  372. if (!PathFileExists(szCfg))
  373. {
  374. return;
  375. }
  376. CFile file(szCfg, CFile::modeRead);
  377. CArchive ar(&file, CArchive::load);
  378. UINT nSize = 0;
  379. ar >> nSize;
  380. m_nOldMailCount = nSize;
  381. UINT i = 0;
  382. for (; i < nSize; i++)
  383. {
  384. int nBlockIndex = 0;
  385. ar >> nBlockIndex;
  386. MAILPOS tmpPos;
  387. tmpPos.nBlockIndex = nBlockIndex;
  388. m_arrMsgPos.Add(tmpPos);
  389. int nSize = 0;
  390. ar >> nSize;
  391. m_arrMsgSize.Add(nSize);
  392. }
  393. //let the former mails display on the interface
  394. ReadAndDisplayMails(INITIAL_PROGRAM);
  395. }
  396. }
  397. ///<summary>
  398. ///   Read mails fromdatabase and display
  399. ///</summary>
  400. void CMainFrame::ReadAndDisplayMails(const UINT nState)
  401. {
  402. //Read from the database
  403. UINT nCount = 0;
  404. nCount = (UINT)m_arrMsgPos.GetCount();
  405. CMailSaveMngr* pSaveMngr = NULL;
  406. pSaveMngr = m_MailMgnr.GetSaveMngr();
  407. TCHAR* pMail = NULL;
  408. pMail = new TCHAR[MAIL_TOP_TO_READ];
  409. UINT i = 0;
  410. for (; i < nCount; i++)
  411. {
  412. pSaveMngr->LoadMail(m_arrMsgPos[i], pMail, MAIL_TOP_TO_READ);
  413. CPop3Message MailMessage;
  414. MailMessage.SetTopMailContent(pMail);
  415.     m_arrTopMail.Add(MailMessage);
  416. }
  417. delete[] pMail;
  418. //update the display in the list view
  419. CListCtrlView* pListView = NULL;
  420. pListView = m_pLeftPaneView->m_pRightPaneFrame->m_pSplitterView->m_pListCtrlView;
  421. pListView->m_listCtrl.DeleteAllItems();
  422. CString strFrom, strSubject, strDate, strSize;
  423. i = 0;
  424. for (; i < nCount; i++)
  425. {
  426. strFrom = m_arrTopMail[i].GetMailFrom();
  427. strSubject = m_arrTopMail[i].GetMailSubject();
  428. strDate = m_arrTopMail[i].GetMailDate();
  429. strSize.Empty();
  430. strSize.Format(_T("%6.2f K"), m_arrMsgSize[i] / 1024.0);
  431. pListView->InsertRowItem(strFrom, strSubject, strDate, strSize);
  432. }
  433.     //update the display in the tree view
  434. if (RECEIVE_MAILS == nState)
  435. {
  436. //There are definitely many policies to determine the amount of new mails. 
  437. //However, I just use this simple criteria  
  438. UINT nNewMailCount = 0;
  439. if (nCount > m_nOldMailCount)
  440. {
  441. nNewMailCount = nCount - m_nOldMailCount;
  442. }
  443. else if (nCount < m_nOldMailCount)
  444. {
  445. nNewMailCount = nCount;
  446. }
  447. if (0 != nNewMailCount)
  448. {
  449. CString strRootName;
  450. strRootName.Format("%s(%d)", m_MailMgnr.GetSendMail(), nNewMailCount);
  451. m_pLeftPaneView->UpdateRootName(strRootName);
  452. }
  453. }
  454. m_nOldMailCount = nCount;
  455. }
  456. void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
  457. {
  458. CFrameWnd::OnShowWindow(bShow, nStatus);
  459. if (m_bIntialize)
  460. {
  461. ReadFormerMails();
  462. CString strSendName;
  463. strSendName = m_MailMgnr.GetSendMail();
  464. if (!strSendName.IsEmpty())
  465. {
  466. m_pLeftPaneView->UpdateRootName(strSendName);
  467. }
  468. m_bIntialize = FALSE;
  469. }
  470. }