收藏 分享(赏)

电子邮件发送和接收程序的开发.doc

上传人:dzzj200808 文档编号:2352723 上传时间:2018-09-12 格式:DOC 页数:19 大小:265.50KB
下载 相关 举报
电子邮件发送和接收程序的开发.doc_第1页
第1页 / 共19页
电子邮件发送和接收程序的开发.doc_第2页
第2页 / 共19页
电子邮件发送和接收程序的开发.doc_第3页
第3页 / 共19页
电子邮件发送和接收程序的开发.doc_第4页
第4页 / 共19页
电子邮件发送和接收程序的开发.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、程序设计报告电子邮件发送和接收程序的开发班 级: 电子 姓 名: 学 号: 指导老师: 日 期: 2007 年 7 月 VC+课程设计 第 1页目 录第一章 需求 分析 .21.1 开发 背景 21.2 功能 要求 2第二章 系统总体分析 .22.1 电子邮件介绍 22.2 总体设计方 案及思路 32.2.1 电子邮件的发送程序 32.2.2 电子邮 件的接收程序 42.3 模块分析 42.3.1 电 子邮 件发送程序的主要模块 52.3.2 电子邮件 接收程序的主要模块 5第三章 程序的测试(运行截图) .53.1 添加“关于”标签的测试 53.2 发 送邮件的测试 63.3 收取邮件 的测

2、试 8第四章 设 计总结 .84.1 课程小结 84.2 个人小结 9附录 (源代码) .91 “关于”标签的程序代码 92 电子邮件发 送程 序的代码 .103 附件的代码 .133 电子邮件 接受程 序的代码 .14VC+课程设计 第 2页第一章、需求分析1.1、开发背景随着互联网的不断发展,越来越多的企业单位通过电子邮件来协同工作,打破时间与地域的限制,大大提高了工作效率。电子邮件已地经成为人们生活中不可缺少的一部分。但是,当前流行的各大邮件客户端软件除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很少,很多功能尤其对于那些计算机知识相对缺乏的人来说,更加显得太过于华

3、丽而不实用。所以这次的课程设计,我选择了制作一个操作简单,又可以实现最基本的电子邮件的收发功能的工具。1.2、功能要求基本发送和接受邮件的功能。实现通信功能。具有简单、实用、易操作的图形界面。在以上基础上尽量实现发送附件的功能。程序还应可以判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。第二章、系统总体分析2.1、电子邮件介绍电子邮件又称 E-mai1,是种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是个简易、快速的方法。通过连接全世界的 Internet,实现各类信号的传送、接收、存贮等处理,将邮件

4、送到世界的各个角落。到目前为止,可以说电子邮件是 Internet 资源使用最多的一种服务,E-mai1 不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。电子邮件的处理由两大部分组成:电子邮件发送程序和电子邮件接收程序。电子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件服务器连接,然后通过发送邮件服务器将邮件传递到接收邮件服务器,邮件中包含有信件的主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服务器相连,并将邮件送入收件者的邮箱中。电子邮件接收程序则只需要处理本地计算机与存放电子邮件的服务器相连接,并通过帐号和口令从服务器中获取

5、电子邮件,邮件中包含有信件的主题、内容和发送时间等。VC+课程设计 第 3页2.2、总体设计方案及思路(1)电子 邮件的 发送程序发送邮件的程序必须能够做 3 件事情:与接收电子邮件的服务器相连接;将相关的信息送入收件人的信箱;程序还应可以判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。一般情况下,在中,电子邮件程序的编写是利用自带的以及相关的通信协议 SMPT/POP3 等来实现的。但是要利用 MAPI 和通信协议实现一个功能强大的电子邮件管理程序,需要很强的相关专业知识。随着现代软件业的发展,软件厂商提供了方便、简易,与服务器无关且稳定的电子邮件处理组件,使我们可以在程序开发

6、语言中调用这些组件,利用很简单的语言实现功能强大的程序。JMail 组件就是一个很好用的电子邮件程序开发第三方组件。所以这次的课程设计我选择了组件。JMail 组件中包含许多实现电子邮件处理的属性和方法。只需要在 VC+代码中创建一个 JMail 组件的对象,调用其中的某些功能,就能很快完成程序的开发。JMail 常用的发送邮件的基本属性和方法如表 1 所示。表 1 JMail 常用发送邮件的基本属性和方法方法和属性 功能Body 邮件内容Charset 字符集,默认为“US-ASCII”Sendname 发送人姓名Sender 发送人邮箱地址ServeraddressSMPT 服务器地址,可

7、制定多个,用分号分开,并可指定端口;为空白时,JMail会尝试解决远程邮件服务器,然后直接发送。Subject 标题Priority 优先级(1:高优先级;3:普通优先级;5:低优先级)AddAttachment(“filename”,ContentType) 添加文件附件AddCustomAttachment(“filename”,data) 添加自定义附件AddURLAttachment(“bstrURL”,“bstrAttachAS”,bstrAuth)下载并添加一个来自 bstrURL 的附件,BstrAttachAS 指定受到信件的文件名。AddRecipient(“Email-Ad

8、dress”) 增加一个收件人AddRecipientEX(“Email-Address”,“name”)增加一个带名字的收件人AppendBodyFromFile(“filename”) 将一个文件追加到正文后AppendText(“Text”) 追加信的正文内容Execute()方法 执行发送Close()方法 强制 JMail 关闭缓冲与邮件服务器的连接VC+课程设计 第 4页由于 JMail 是第三方组件,因此 VC+程序要想调用 JMail 对象,就必须先下载 JMail动态链接库,并在本机中进行注册。具体操作方法如下:打开运行对话框,输入 cmd,打开命令提示符编辑器,输入如下指令

9、即可注册成功:(JMail 组件的安装路径)regsvr32 jmail.dll(2)电子 邮件的接收程序接收邮件的程序必须能够做三件事:与存放电子邮件的服务器相连接;读取相关的信件信息,并存放与本地计算机中;程序还将判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。与电子邮件发送程序的编写相同,我还是采取 VC+语言和 JMail 组件相结合的方法来实现邮件的收取。JMail 常用的接收邮件的基本属性和方法如表 2 所示。表 2 JMail 常用接收信件的基本属性和方法方法和属性 功能Body 邮件内容Charset 字符集,默认为(US-ASCII)Date 信件发送日期Mai

10、lServer 邮箱所在的服务器Subject 标题Timeout 连接服务器的超时限制Connect() 连接服务器,需要参数:帐号、口令、服务器地址、端口2.3、模块分析电子子邮件接受方式程序主要由以下两个大的模块构成:发送邮件模块和收取邮件模块。其功能模块如图 1 所示:电子邮件客户应用系统发送邮件接收邮件VC+课程设计 第 5页图 1 电子邮件功能模块图(1)电子 邮件 发送程序的主要模块电子邮件发送程序主要由以下几个模块组成:邮件服务器:用于填写收件人的邮箱服务器(可以不填) ;收件人信箱:用于填写收件人的邮箱名;发件人信箱:用于填写发件人的邮箱名;主题:用于填写信件主题;正文:用于

11、写入信件正文;退出:用于退出发件程序;发送:用于发送邮件;关于:用于显示软件开发的相关信息。附件:可以手动添加附件并完成发送(该功能正在进一步完善中) 。(为本小组另行添加的功能)(2)电子 邮件接收程序的主要模块电子邮件接收程序主要由以下几个模块组成:邮件服务器:用于填写需要收取信件信箱的服务器;帐号:用于填写需要收取信件的邮箱帐号;口令:用于填写需要收取信件的邮箱密码;邮件列表:显示邮箱中所有邮件的列表;正文:当选中邮件列表中任一邮件时,显示该封信件的具体内容;退出:用于退出接收邮件程序;收取:用于收取信件。第三章、程序测试(运行截图)3.1、添加“关于”标签的测试在原设计的基础上我添加了

12、一个“关于”的标签,点击该按钮会弹出一个小的对话框,其中的内容包括本小组的成员、程序开发时间以及一些关于邮件方面的相关帮助信息。程序的运行结果如图 1 所示。VC+课程设计 第 6页图 2 “关于”程序主界面3.2、发送邮件的测试图 3 邮件发送主界面(不带附件)VC+课程设计 第 7页图 4 发送邮件程序主界面(加载附件)图 5 发送邮件程序主界面(带附件)VC+课程设计 第 8页3.3、收取邮件的测试图 6 收取电子邮件程序主界面第四章、设计总结4.1、课程小结在邮件发送程序中,用户可以利用 SMPT 服务器向朋友发送电子邮件,也可以直接尝试链接朋友的 E-mail 信箱所在的服务器。这次

13、课程设计我所利用的 JMail 组件封装了很强的电子邮件处理功能,如附件传递、用户的跟踪服务、发布产品信息,以及电子报刊处理等功能。在邮件接受程序中,用户可以向 POP3 服务器收取电子邮件。用户打开邮箱后,将利用JMail 组件创建的对象指针遍历邮箱中的所有邮件,并将邮件信息下载存放于本地计算机中,利用 List 控件的扩展属性显示邮件的正文内容。目前我所做的这个程序还不够完整,还存在着很多的不足和不完善的地方。归纳起来体现在以下几个方面:VC+课程设计 第 9页软件的功能趋于简单,真正的邮件收发工具软件包括很多方面的信息,而不仅仅局限于发送邮件和收取邮件。真正的邮件服务软件还包括邮件导入、

14、邮件导出、文本编辑(查找与撤消) 、通讯簿、通讯规则等等功能。软件的图形操作功能缺乏,目前系统中对邮件附件的添加、删除功能都没有图形快捷操作,只能通过改变源程序中的代码达到添加附件的目的。而且由于时间和知识的欠缺,整个系统的界面显得过于单调,缺乏动态显示效果。如果能结合其它界面美化工具,使得界面更人性化,那就更好了。4.2、个人小结经过不懈的努力,终于完成了这次的课程设计。其实在做这次 VC+程序设计实验之前,我基本上没有真正意义上的接触过 VC+程序案例的设计和开发,只是通过课堂了解了一些关于 VC+的最基本的知识,所以这次实验是在边学习边实践的基础上完成的。由于知识的不足,做的结果自己不是

15、很满意,与自己原来的设想也有些差距。但是我也从这两个星期的设计和制作过程中学到了很多知识,对自己以后的专业学习甚至将来的工作都有很大的帮助。附录(源代码):1、“关于”标签的程序代码(1)往头文件 StdAfx.h 中添加下列代码:#define CRLF “x0dx0a“ /注意这两行必须添加#define CRLF2 CRLF CRLF(2)主要代码如下:BOOL CAboutDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_strEditHelp= “相关帮助信息:“ CRLF

16、CRLF“ 一、 发送邮件服务器和发信人信箱有密切关系,假如你的信箱为 ,则发送邮件服务器一般为:,当然这也不是绝对的,你可以到你的邮件相关网站查询。不知道服务器名的话也可以不填!“CRLFCRLF“ 二、 发信信箱格式比较灵活,如下两种格式均为合法的: 1 在你的 E-Mail 首尾加小于大于符号: 2 直接填写你的 E-Mail: “VC+课程设计 第 10页CRLFCRLF“ 三、 接受信箱可以为多个,中间用分号;隔开,例如:Pookie;snuggles; 某些信箱前面的部分字符串是收信人名称,例如上面的 Pookie 可以省略不写,例如下面一行和上面一行是等价的,它们都是可以接受的信

17、箱输入格式。;“ CRLFCRLF“ 四、 邮件主题,当然就是邮件的标题了,你可以随意输入自己喜爱的标题。“CRLFCRLF“ 五、 邮件正文就是你要发给对方的信息。“CRLFCRLF“ 六、 最后不得不提一下,由于当今好多发送邮件服务器都要求身份验证,也就是需要提供的你的信箱密码,鉴于技术问题,这类信箱本程序暂时不支持。“CRLFCRLF“ 周清 周庆 蒯志刚 于雯“CRLF“ 2007 年 7 月“CRLF;UpdateData(FALSE); / Update the Dialogreturn TRUE; / return TRUE unless you set the focus to

18、 a control/ EXCEPTION: OCX Property Pages should return FALSE2、发送邮件程序代码:(1)往头文件 StdAfx.h 中添加 JMail 对象的声明,这样才能在整个程序中应用 JMail 对象.代码如下:#import “C:jmailjmail.dll“ /显示指定 JMail 动态链接库using namespace jmail; /定义程序中 JMail 对象的名称(2)头文件 MailServer.h,利用 ClassWizard 类项导添加退出应用程序的函数ExitInstnace().源代码如下:/ Overrides/

19、ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMailServerApp)public:virtual BOOL InitInstance();virtual int ExitInstance();/AFX_VIRTUALVC+课程设计 第 11页(3)源文件 MailServer.cpp,类 CMailServerApp 的实现文件.1)由于程序中应用了 JMail 组件,因此必须在 InitInstance()函数中添加如下代码,进行应用程序的初始化.BOOL CMailServerApp:InitInstanc

20、e()AfxEnableControlContainer();:CoInitialize(NULL);#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL2)应用程序时,在 ExitInstance()函数中添加释放各变量的代码./应用程序退出时int CMailServerApp:ExitInstance() / TODO: Add your specialized code here and/or call the base classreturn CWinApp:ExitInstance(

21、);:CoUninitialize();(4)MailServerDlg.h 中,CMailServerDlg 类的接口.1)在头文件 MailServerDlg.h 中,添加各控件的控件变量,如下表所示.控件 控件变量IDC_EDIT_MAILSERVER m_strmailserverIDC_EDIT_RECIPIENTS m_strrecipientsIDC_EDIT_SENDER m_strsenderIDC_EDIT_SUBJECT m_strsubjectIDC_EDIT_BODY m_strbody2)利用 ClassWizard 添加 IDOK 控件的 ON_BN_CLICKE

22、D 事件函数,代码如下:Protected:/AFX_MSG(CMailServerDlg)Afx_msg void OnSend();/AFX_MSG3)源文件 MailServerDlg.cpp,类 CMailServerDlg 的实现文件.打开MailServerDlg.cpp 文件,添加发送邮件函数 OnSend()的代码如下:/发送邮件程序void CMailServerDlg:OnSend() / TODO: Add your control notification handler code hereUpdateData();/获取 Edit 控件中的字符串m_strmailse

23、rver.TrimLeft();VC+课程设计 第 12页m_strmailserver.TrimRight();m_strrecipients.TrimLeft();m_strrecipients.TrimRight();m_strsender.TrimLeft();m_strsender.TrimRight();/判断 Edit 控件中的字符串是否有效if(m_strrecipients.GetLength()From=(LPCTSTR) m_strsender;/发件人姓名pMessage-FromName=“我的名字“;/添加收件人pMessage-AddRecipient(LPCTS

24、TR)m_strrecipients,“,“);/优先级设置,15 逐次降低,3 为中级pMessage-Priority=3;/编码方式设置,默认是 iso-8859-1pMessage-Charset = “GB2312“;/主题pMessage-Subject = (LPCTSTR) m_strsubject;/正文pMessage-Body = (LPCTSTR) m_strbody;/开始发送pMessage-Send(LPCTSTR) m_strmailserver,VARIANT_FALSE);pMessage.Release();AfxMessageBox(“发送成功!“);/

25、捕捉异常catch (_com_error e)CString strErr;VC+课程设计 第 13页strErr.Format(“错误信息: %srn 错误描述: %s “, (LPCTSTR)e.ErrorMessage() , (LPCTSTR)e.Description();AfxMessageBox(strErr);3、附件实现的代码:附件发送的实现;(1)首先在 CMailServerDld 类中定义几个对象。public:CString str;CString tr;BOOL strbool;_bstr_t bstr;(2)加载文件:void CMailServerDlg:On

26、BtAddfile() / TODO: Add your control notification handler code hereCFileDialog cg(TRUE);if(cg.DoModal()=IDOK) strbool=true;else strbool=false;cg.DoModal();str=cg.GetPathName();MessageBox(str);(3)发送附件:bstr=str.AllocSysString(); /CString 类型转换成_bstr_t 类型 if(strbool=true) /判断有没有打开附件 _bstr_t bstrCID = pM

27、essage-AddAttachment( bstr, VARIANT_TRUE, “); /开始发送(带附件)pMessage-Send(LPCTSTR) m_strmailserver,VARIANT_FALSE);pMessage.Release();AfxMessageBox(“发送成功(带附件)!“); else VC+课程设计 第 14页/开始发送(不带附件)pMessage-Send(LPCTSTR) m_strmailserver,VARIANT_FALSE);pMessage.Release();AfxMessageBox(“发送成功(不带附件)!“);/捕捉异常catch

28、(_com_error e)CString strErr;strErr.Format(“错误信息: %srn 错误描述: %s “, (LPCTSTR)e.ErrorMessage() , (LPCTSTR)e.Description();AfxMessageBox(strErr);4、接受邮件程序代码:(1)往头文件 StdAfx.h 中添加 JMail 对象的声明,这样才能在整个程序中应用 JMail对象.代码如下:/显示指定 JMail 动态链接库#import “C:jmailjmail.dll“ /定义程序中 JMail 对象的名称using namespace jmail;(2)头

29、文件 MailServer.h,利用 ClassWizard 类项导添加退出应用程序的函数ExitInstnace().源代码如下:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMailServerApp)public:virtual BOOL InitInstance();virtual int ExitInstance();/AFX_VIRTUAL(3)源文件 MailRecieve.cpp,类 CMailRecieveApp 的实现文件.1)由于程序中应用了 JMail 组件,因此必须

30、在 InitInstance()函数中添加如下代码,进行应用程序的初始化.BOOL CMailRevieveApp:InitInstance()AfxEnableControlContainer();:CoInitialize(NULL);#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLLVC+课程设计 第 15页2)应用程序时,在 ExitInstance()函数中添加释放各变量的代码./应用程序退出时int CMailRecieveApp:ExitInstance() / TODO: Ad

31、d your specialized code here and/or call the base classreturn CWinApp:ExitInstance();:CoUninitialize();(4)MailRecieveDlg.h 中,CMailRecieveDlg 类的接口.1)在头文件 MailRecieveDlg.h 中,添加各控件的控件变量,如下表所示.控件 控件变量IDC_EDIT_MAILSERVER m_strmailserverIDC_EDIT_MESSAGES m_strcltmessageslistIDC_EDIT_PASSWORD m_strpassword

32、IDC_EDIT_USERID m_struseridIDC_EDIT_BODY m_strbody2)利用 ClassWizard 添加 IDOK 控件的 ON_BN_CLICKED 事件函数,添加 List 控件的LVN_ITEMCHANGE 事件函数.代码如下:Protected:/AFX_MSG(CMailServerDlg)Afx_msg void OnRecieve();afx_msg void OnShowBody(NMHDR* Pnmhdr,lresult* pResult);/AFX_MSG3)源文件 MailRecieverDlg.cpp,类 CMailRecieveDlg

33、 的实现文件.向MailServerDlg.cpp 文件中添加初始化对话框函数 OnInitDialog()的代码、OnRecieve()的代码和显示邮件正文函数 OnShowBody()的代码:BOOL CMailRecieveDlg:OnInitDialog()/ TODO: Add extra initialization here/初始化对话框的函数/升级列表控件:SendMessage(m_ctlmessagelist.m_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);/显示控

34、件列表m_ctlmessagelist.InsertColumn(0,“发件人“,LVCFMT_LEFT,120);m_ctlmessagelist.InsertColumn(1,“主题“,LVCFMT_LEFT,350);m_ctlmessagelist.InsertColumn(2,“日期“,LVCFMT_LEFT,100);return TRUE; / return TRUE unless you set the focus to a control:/接收邮件函数VC+课程设计 第 16页void CMailRecieveDlg:OnRecieve() / TODO: Add your

35、 control notification handler code here/接受邮件的函数UpdateData();/格式化 Edit 控件中的字符串m_strmailserver.TrimLeft();m_strmailserver.TrimRight();m_struserid.TrimLeft();m_struserid.TrimRight();m_strpassword.TrimLeft();m_strpassword.TrimRight();/判断帐号口令是否存在if(m_strmailserver.GetLength()Timeout =30;/链接邮件服务器,110 为 PO

36、P3 默认端口号pPOP3-Connect( (LPCTSTR)m_struserid , (LPCTSTR)m_strpassword , (LPCTSTR)m_strmailserver,110);/获取信件pMessages=pPOP3-Messages;/已下载的邮件的实际个数(因为第 0 个 ITEM 是未用的,所以减一)long lCount =(pPOP3-Messages)-Count-1;if(lCount = 0)VC+课程设计 第 17页AfxMessageBox(“信箱为空“);elsejmail:IMessagePtr pMessage;/遍历每for(long i

37、= 1 ; iMessages)-Itemi;/信件的具体信息_bstr_t bstrFrom = pMessage-From;_bstr_t bstrSubject = pMessage-Subject;_bstr_t bstrBody = pMessage-Body;COleDateTime oleDate = pMessage-Date;/向 List 空间中添加信件信息int nListItem = m_ctlmessagelist.InsertItem(i,(const char *)bstrFrom);m_ctlmessagelist.SetItem(nListItem,1,LVI

38、F_TEXT,(const char *)bstrSubject,0,0,0,NULL);m_ctlmessagelist.SetItem(nListItem,2,LVIF_TEXT,(const char *)oleDate.Format(“%Y-%m-%d“),0,0,0,NULL);/显示信件的主题文本m_strBodyArray.Add(const char*)bstrBody);pMessage.Release();/断开连接pPOP3-Disconnect();/提示错误信息catch(_com_error e)CString strErr;strErr.Format(“错误信息:

39、%srn 错误描述: %s“ , (LPCTSTR)e.ErrorMessage(),(LPCTSTR)e.Description();AfxMessageBox(strErr);void CMailRecieveDlg:OnShowBody(NMHDR* pNMHDR, LRESULT* pResult) NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;/ TODO: Add your control notification handler code here/显示邮件正文内容VC+课程设计 第 18页/获取选定信件的指针POSITION pos = m_ctlmessagelist.GetFirstSelectedItemPosition();if(pos)int nItem = m_ctlmessagelist.GetNextSelectedItem(pos);/显示内容m_strbody = m_strBodyArray.GetAt(nItem);UpdateData(FALSE);*pResult = 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 往来文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报