VC++高级编程课程设计报告_邮件客户端.doc_第1页
VC++高级编程课程设计报告_邮件客户端.doc_第2页
VC++高级编程课程设计报告_邮件客户端.doc_第3页
VC++高级编程课程设计报告_邮件客户端.doc_第4页
VC++高级编程课程设计报告_邮件客户端.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Visual C+高级编程课程设计报告目录1. 前言12. 系统功能和使用说明12.1 系统功能12.2 使用说明13. 系统设计13.1 邮件发送模块13.2 邮件接收模块14. 系统实现24.1 创建一个基于对话框的应用程序。24.2 发信模块设计24.3 收信模块设计75. 系统测试115.1 发信测试115.6 其他功能135.6.1 多线程135.6.2 动态链接库145.6.3 注册表操作156. 总结157. 参考文献15141. 前言电子邮件(简称E-mai1)又称电子信箱,它是种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送。通过Internet,实现各类信号的传送、接收、存储等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。电子邮件不是一种“终端到终端”的服务,是被称为“存储转发式”服务。这正是电子信箱系统的核心,利用存储转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时间和空间限制。电子邮件的传输是通过电子邮件简单传输协议(Simple Mail Transfer Protocol,简称SMTP)这一系统软件来完成的,它是Internet下的一种电子邮件通信协议。JMail组件功能强大,可以轻松的完成邮件发送,接收,加密,集群传输等工作。本软件采用JMail组件完成大部分功能。2. 系统功能和使用说明2.1 系统功能系统实现的主要功能:(1) 邮件的发送(2) 邮件的接收(3) 添加附件(4) 下载附件2.2 使用说明本软件使用C+语言,Microsoft Visual C+ 6.0集成开发环境,JMail 组件开发。在Windows 2000 及以上版本的Windows操作系统中运行。3. 系统设计3.1 邮件发送模块用户选择发送邮件时,需要填写相关账户信息和邮件服务器(SMTP服务器)信息。向服务器发出申请前对用户输入的数据进行简单的合法性检查。邮件发送模块的流程图如图3.13.2 邮件接收模块用户选择接收邮件时,填写相关账户信息和邮件服务器信息(POP服务器)信息。向服务器发出申请前对用户输入的数据进行简单的合法性检查。邮件接收模块的流程图如图3.2图3.1发送填写相关信息添加附件数据合法性验证发送邮件 接收填写相关信息数据合法性验证接收邮件 图3.24. 系统实现4.1 创建一个基于对话框的应用程序。在对话资源上能添加多个控件,同时利用类向导为编辑控件及列表控件添加变量、系统控件ID、标题及对应的变量名,如表4.1。软件主界面如图4.1。控 件ID作 用变 量 类 型变 量 名IDC_NAME接受发信人的昵称CStringm_nameIDC_SENDAD发信人的邮箱地址CStringm_sendadIDC_PASSWORD密码CStringm_passwordIDC_SMTPSMTP服务器CStringm_smtpIDC_POPPOP3服务器CStringm_pop3IDC_REVAD收信人地址CStringm_revadIDC_SUBJECT标题CStringm_subjectIDC_BODY正文CStringm_bodyIDC_LIST显示附件情况CListCtrlm_list 表 4.1 控件表创建了上面的控件并且为控件添加变量以后,就可以进行相应的模块设计,包括收信和写信两个功能。对于收信和写信,首先要单击“写信”按钮或者“收信”按钮,使得相应的控件可用,然后填写上相应的参数,单击“确定”按钮进行收信和发信。4.2 发信模块设计发信模块是系统最重要的功能之一,前面已经介绍了发信的主要实现过程,利用SMTP协议进行与服务器之间的对话,从而发送整个信件。本软件利用了JMail组件的功能来完成的。在本模块中单击“确定”按钮,实现发送过程。 图 4.1 主界面(1)在类向导生成的CTestDlg添加一个BOOL型变量flag,用来保存是发信还是收信。利用类向导添加单击“写信”按钮的消息映射代码。“写信”按钮的主要功能是控制各个控件的状态。void CEmailClientDlg:OnSend() GetDlgItem(IDOK)-EnableWindow(TRUE);GetDlgItem(IDC_NAME)-EnableWindow(TRUE);GetDlgItem(IDC_SENDAD)-EnableWindow(TRUE);GetDlgItem(IDC_PASSWORD)-EnableWindow(TRUE);GetDlgItem(IDC_SMTP)-EnableWindow(TRUE);GetDlgItem(IDC_POP)-EnableWindow(FALSE);GetDlgItem(IDC_REVAD)-EnableWindow(TRUE);GetDlgItem(IDC_SUBJECT)-EnableWindow(TRUE);GetDlgItem(IDC_BODY)-EnableWindow(TRUE);GetDlgItem(IDC_ADD)-EnableWindow(TRUE);GetDlgItem(IDC_LIST)-EnableWindow(FALSE);/清空所有控件内容m_list.DeleteAllItems();/清空附件列表m_body=;m_name=;m_password=;m_pop=;m_revad=;m_sendad=;m_smtp= ;m_subject=;UpdateData(false);flag=true;/记录是发信状态(2)利用类向导添加“添加附件”按钮的消息映射,此段代码的作用是可以使该邮件发送其他类型的文件(图片、音乐、小视频等等)。void CTestDlg:OnAdd() / TODO: Add your control notification handler code hereGetDlgItem(IDC_LIST)-EnableWindow(TRUE);CFileDialog dlg(true,NULL,NULL,OFN_ALLOWMULTISELECT);if(dlg.DoModal() = IDOK)POSITION pos = dlg.GetStartPosition();while(pos != NULL)long i=m_list.GetItemCount();m_list.InsertItem(m_list.GetItemCount()+1,dlg.GetNextPathName(pos);/AddString(dlg.GetNextPathName(pos);CString str;str=m_list.GetItemText(i,0);(3)当附件添加后,有可能因为自己不喜欢而需要删除此附件,因此在用户不想要是可以双击要选中的控件来实现删除。注意此时是发送信件的状态,如果是收信状态,双击实现附件下载的功能。利用类向导添加双击列表控件项的消息映射。void CTestDlg:OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereif(flag=TRUE)if(IDOK=MessageBox(确定删除此项吗?,删除提示,MB_OKCANCEL|MB_ICONQUESTION)int nItem=m_list.GetNextItem (-1,LVNI_SELECTED); m_list.DeleteItem(nItem);UpdateData(FALSE);*pResult = 0;(4) 当用户单击“确定”按钮后,进行发送信件操作代码。分析:该代码是利用JMail进行邮件发送的部分。首先确定参数的合法性,当然这只能是简单的检查,所有内容必须由用户进行正确的设置。在使用JMail控件之前,可以在网上下载安装程序。安装后,把jmail.dll文件复制到当前工程目录下,并在StdAfx.h文件中加入语句#import “jmail.dll” using namespace jmail;void CTestDlg:OnOK() / TODO: Add extra validation hereif(flag=TRUE)/参数的获取与判断UpdateData(true);m_sendad.TrimRight();/去掉后面多于空格m_password.TrimRight();m_smtp.TrimRight();m_revad.TrimRight();m_subject.TrimRight();m_body.TrimRight();m_name.TrimRight();/判断参数是否合法if(m_revad.GetLength()3)AfxMessageBox(请填写正确的收件人邮箱);return;if(m_sendad.GetLength()From = (LPCTSTR)m_sendad;/ 发件人邮箱pMessage-FromName =_bstr_t(m_name);/ 发件人姓名pMessage-AddRecipient(LPCTSTR)m_revad, , );/ 添加收件人pMessage-Priority = 3;/ 优先级设置,1-5逐次降低, 3为中级pMessage-Charset = GB2312;/ 编码方式设置, 默认是iso-8859-1pMessage-Subject = (LPCTSTR)m_subject;/ 主题pMessage-Body = (LPCTSTR)m_body;/ 正文pMessage-MailServerUserName=(LPCTSTR)m_sendad;/ 开始发送pMessage-MailServerPassWord=(LPCTSTR)m_password;if(m_list.GetItemCount()!=0)for(int i=0;iAddAttachment(_bstr_t(str),VARIANT_FALSE, application/octet-stream);char *p=_bstr_t(str);pMessage-Send(LPCTSTR)m_smtp, VARIANT_FALSE);pMessage.Release();AfxMessageBox(发送成功!);CoUninitialize();catch (_com_error e)CString strErr;strErr.Format(程序运行错误rn错误描述:%s,(LPCTSTR)e.Description();AfxMessageBox(strErr);else/进行收信工作/参数的获取与判断UpdateData(true);m_password.TrimRight();m_sendad.TrimRight();m_pop3.TrimRight();/判断参数是否合法if(m_sendad.GetLength()EnableWindow(TRUE);GetDlgItem(IDC_NAME)-EnableWindow(FALSE);GetDlgItem(IDC_SENDAD)-EnableWindow(TRUE);GetDlgItem(IDC_PASSWORD)-EnableWindow(TRUE);GetDlgItem(IDC_SMTP)-EnableWindow(FALSE);GetDlgItem(IDC_POP)-EnableWindow(TRUE);GetDlgItem(IDC_REVAD)-EnableWindow(FALSE);GetDlgItem(IDC_SUBJECT)-EnableWindow(FALSE);GetDlgItem(IDC_BODY)-EnableWindow(FALSE);GetDlgItem(IDC_ADD)-EnableWindow(FALSE);GetDlgItem(IDC_LIST)-EnableWindow(FALSE);/清空所有控件内容m_list.DeleteAllItems();/清空附件列表m_body =;m_name =;m_password =;m_pop3 =;m_revad =;m_sendad =;m_smtp = ;m_subject =;UpdateData(false);flag=false;/记录是收信状态(2)利用资源编辑工具添加一个新的对话框资源,对话框的ID设置为IDD_REC,标题为邮件“查看系统”。在上面添加一个编辑框控件,其ID为IDC_BODY 并且利用类向导添加变量CString(类型)、 m_body,用来显示邮件正文。再添加一个列表控件,其ID为IDC_LETTER,并添加变量CListCtrl(类型)、m_llist(名)用来显示邮件系统的一些常见内容,并且样式设置为“报告”样式。再添加一个列表控件,其ID为IDC_ATT,并且变量类型为CListCtrl变量名为m_list.用来显示附件的信息。(3)利用类向导为该对话框添加累CRecDlg,在类中添加变量。在该类中对控件进行初始化工作,重载OnInitDialog()函数。BOOL CRecDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_llist.InsertColumn(0, 发件人);m_llist.InsertColumn(1, 主题);m_llist.InsertColumn(2, 日期);/获取列表的宽度 RECT rect; m_llist.GetWindowRect(&rect); int wid=rect.right-rect.left; /为你的每列分宽度 m_llist.SetColumnWidth(0,wid/3); m_llist.SetColumnWidth(1,wid/3); m_llist.SetColumnWidth(2,wid/3); m_list.InsertColumn(0, 附件名);m_list.InsertColumn(1, 大小);/获取列表的宽度 m_list.GetWindowRect(&rect); wid=rect.right-rect.left; /为你的每列分宽度 m_list.SetColumnWidth(0,wid/2); m_list.SetColumnWidth(1,wid/2); return TRUE; (4)开始接收邮件void CRecDlg:OnStart() / TODO: Add your control notification handler code hereCEmailClientApp *pApp=(CEmailClientApp*)AfxGetApp();CEmailClientDlg *pDlg=(CEmailClientDlg*)pApp-m_pMainWnd;m_add=pDlg-m_sendad;m_password=pDlg-m_password;m_pop=pDlg-m_pop;tryCoInitialize(NULL);jmail:IPOP3Ptr pPOP3(JMail.POP3);/ 超时 60S/Connect=true;pPOP3-Timeout =60;/ 连接邮件服务器 POP3-Connect(LPCTSTR)m_add,(LPCTSTR)m_password,(LPCTSTR)m_pop,110);pMessages = pPOP3-Messages;long lCount = pMessages-Count - 1;if(lCount = 0)AfxMessageBox(信箱为空);elsefor(long i= 1; i Itemi;_bstr_t bstrFrom = pMessage-From;_bstr_t bstrSubject = pMessage-Subject;_bstr_t bstrBody = pMessage-Body;COleDateTime oleDate = pMessage-Date;int nListItem = m_llist.InsertItem(i, (const char*)bstrFrom);m_llist.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrSubject, 0, 0, 0, NULL);m_llist.SetItem(nListItem, 2, LVIF_TEXT, (const char*)oleDate.Format(%Y-%m-%d), 0, 0, 0, NULL);m_bodyArray.Add(const char*)bstrBody);pMessage.Release();catch(_com_error e)/捕捉异常CString strErr;strErr.Format(程序运行错误rn错误描述:%s,(LPCTSTR)e.Description();AfxMessageBox(strErr);(5)显示附件void CRecDlg:OnItemchangedLetter(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;/ TODO: Add your control notification handler code herePOSITION pos = m_llist.GetFirstSelectedItemPosition();if(pos)m_list.DeleteAllItems( );int nItem = m_llist.GetNextSelectedItem(pos);m_body = m_bodyArray.GetAt(nItem);jmail:IPOP3Ptr pPOP3(JMail.POP3);pMessage=pMessages-ItemnItem+1;for(int i=0;iAttachments-Count-1;i+)pAttachment=pMessage-Attachments-Itemi;_bstr_t bstrname=pAttachment-Name;_bstr_t bstrsize=pAttachment-Size;int nListItem = m_list.InsertItem(m_list.GetItemCount()+1,(const char*)bstrname);m_list.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrsize, 0, 0, 0, NULL);UpdateData(FALSE);pMessage.Release();*pResult = 0;(6)下载附件void CRecDlg:OnDblclkAtt(NMHDR* pNMHDR, LRESULT* pResult) / TODO: Add your control notification handler code hereint i=m_llist.GetNextItem (-1, LVNI_SELECTED);int nItem =m_list.GetNextItem (-1, LVNI_SELECTED); jmail:IPOP3Ptr pPOP3(JMail.POP3);CString str;str=m_list.GetItemText(nItem,0);CFileDialog dlg(false,NULL,str,OFN_ALLOWMULTISELECT);if(dlg.DoModal()=IDOK)POSITION pos=dlg.GetStartPosition();while(pos!=NULL)pMessage=pMessages-Itemi+1;pAttachment=pMessage-Attachments-ItemnItem;pAttachment-SaveToFile(_bstr_t(dlg.GetNextPathName(pos);MessageBox(下载完成!,NULL,MB_OK);pMessage.Release();*pResult = 0;5. 系统测试5.1 发信测试(1) 界面测试。运行程序,单击“收信”按钮,各个控件状态。如图5.1。 图5.1(2)进行附件添加和删除的测试。单击“写信”按钮后,可以添加控件如下,并填写正确的参数。(3)发信测试。在上面填写正确的参数以后,单击“确定”按钮,进行发信,此项测试在提示发生成功后,必须到对方邮箱进行查看。经测试,发信成功。如图5.2。图5.25.5.2 收信测试(1) 界面测试。运行程序,单击“收信”按钮,各个控件状态。如图5.3。图 5.3(2) 填入参数,单击“确定”按钮,弹出邮件查看系统对话框。如图5.4。图 5.4(3) 单击“开始接收邮件”按钮后,在列表框中可以看到邮件箱内信件的基本情况。选中一项可以查看正文可附件。如图5.5。图5.5(4) 双击附件的列表控件可以下载控件,经测试下载内容正确。5.6 其他功能5.6.1 多线程CSemaphore semaphoreWrite(3,3);UINT WriteA(LPVOID pParam)CEdit *pEdit=(CEdit*)pParam;pEdit-SetWindowText();WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);CString str;for(int i=0;iSetWindowText(str);Sleep(1000);ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);return 0;UINT WriteB(LPVOID pParam)CEdit *pEdit=(CEdit*)pParam;pEdit-SetWindowText();WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);CString str;for(int i=0;iSetWindowText(str);Sleep(1000);ReleaseSemaphore(semaphoreWrite.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论