电子邮件发送和接收程序设计

盐城工学院本科生实习设计说明书(2007)

1.概述…………………………………………………………………………………2 2.电子邮件系统的总体设计…………………………………………………………3 2.1.系统模块结构……………………………………………………………………3 2.2.系统用例图………………………………………………………………………3 3.协议的研究与分析…………………………………………………………………4 3.1.SMTP协议简介及通讯模型………………………………………………………4 3.2.POP协议简介及工作原理……………………………………………………… 4 4.本系统使用组件的介绍……………………………………………………………5 5.本系统的实现………………………………………………………………………7 5.1.对话框工程的创建………………………………………………………………7 5.2.各模块的具体设计………………………………………………………………8 6.程序测试……………………………………………………………………………16 7.结束语及心得………………………………………………………………………19 附录 ………………………………………………………………………………… 21 附录1………………………………………………………………………………… 21 附录2………………………………………………………………………………… 30

1

基于电子邮件发送和接收的程序设计

电子邮件发送和接收程序设计

1. 概 述

电子邮件(简称 E-mai1)又称电子信箱、 电子邮政是—种用电子手段提供信息交 换的通信方式。 它是全球多种网络上使用最普遍的一项服务。 这种非交互式的通信, 加速了信息的交流及数据传送,它是—个简易、快速的方法。通过连接全世界的 Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。 到目前为止,可以说电子邮件是 Internet 资源使用最多的一种服务, E-mai1 不只局 限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。 电子邮件的处理有两大部分组成:电子邮件发送程序和电子邮件接收程序。电 子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件 服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包 含有信件主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服 务器相连接,并将邮件送入收信者的邮箱中,电子邮件接收程序则只需要处理本地 计算机与存在

电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮 件,邮件中包含有信件主题、内容和发送时间等。 系统使用 VisualC++ 6.0 作为开发工具,开发一个功能全面,应用广泛电子邮 件应用程序。系统实现的功能主要有创建与更改帐号,发送与接收电子邮件及其附 件,管理电子邮件等。 本例发送程序采取了既可与发送邮件服务器连接又可以直接与接收邮件服务 器连接的方式来实现电子邮件的发送。用户在“收件人邮箱”所对应的对话框中输 入收件人的 Email 地址,并在“发件人邮箱”所对的对话框中输入发信人的 Email 地址,编辑信件的正文(本例还可以发送附件,只要填写真确的路径,就可以发送 附件) ,然后单击“发送”按钮,便可完成电子邮件的发送。电子邮件发送成功, 程序将弹出一个“发送成功”的消息对话框;若电子邮件发送失败,程序将给出失 败的相关信息。另外这里还有个“关于”按钮,单击一下可以查看相关帮助信息, 有利于你使用此软件。 本例电子邮件接收程序也采取了 Visual C++语言与 JMail 组件相结合的方法, 实现从电子邮件服务器上接收邮件。用户在“邮件服务器’POP3’”所对应的编辑 框中输入收件人的 E-mail 所在的 POP3 服务器,在“帐号”所对应的编辑中输入邮箱的帐号,在 “口令”所对应的编辑框中输入打开邮箱的密码,单击“收取”按钮,便可完成电 子邮件的收取。若用户的信箱中存在着邮件,程序将把所有邮件罗列出来,单击任 何一封邮件的标题,均可查看邮件的正文;若连接邮件失败,程序将给出失败的相 关信息。同样有一个“关于”按钮,单击一下可以查看相关帮助信息。

2

盐城工学院本科生实习设计说明书(2007)

2.电子邮件系统的总体设计

2.1 系统模块结构 电子子邮件客户端主要由以下两个模块构成:发送邮件模块、收取邮件模块、 。 其功能模块如图 2.1 所示:

电子邮件客户应用系统

发 送 邮 件

接 收 邮 件

图 2.1 电子有功能模块图

1)发送邮件模块:发送邮件,发送附件,查看相关帮助信息 2)接收邮件模块:接收邮件,查看相关帮助信息 2.2 系统用例图 用例是一个简单的声明,体现为文字或图表形式,描述系统的一个特定的目的或 结果,以及是谁希望得到结果. 用例图可以说成是对于一个软件在规划阶段产生的 技术性需求和功能性需求,利用某种建模工具来实现出来的一个图形化的介绍。 通过对发送与接收电子邮件功能模块的分析,建立发送与接收电子邮件用例图 如图 2.2 所示:.

图 2. 2

发送与收取电子邮件

3

基于电子邮件发送和接收的程序设计

3.协议的研究与

分析

3.1 SMTP 协议简介及通讯模型 3.1.1 SMTP 协议简介 SMTP 协议是 TCP/IP 协议族中的一员,主要对如何将电子邮件从发送方地址传 送到接收方地址,也即是对传输的规则做了规定。SMTP 协议的目标是可靠高效地传 送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。 SMTP 协议通信模型并不复杂,主要工作集中在发送 SMTP 和接收 SMTP 上:首先针对 用户发出的邮件请求,由发送 SMTP 建立一条连接到接收 SMTP 的双工通讯链路,这 里的接收 SMTP 是相对于发送 SMTP 而言的,实际上它既可以是最终的接收者也可以 是中间传送者。发送 SMTP 负责向接收 SMTP 发送 SMTP 命令,而接收 SMTP 则负责接 收并反馈应答。可大致用下面的图 3.1 来表示:

图 3.1

SMTP 通信模型

3.2 POP3 协议简介及工作原理 3.2.1 POP3 协议简介 邮局协议 3 (POP3) 是检索电子邮件的标准协议。POP3 协议控制 POP3 电子 邮件客户端和存储电子邮件的服务器之间的连接。POP3 服务使用 POP3 协议将电 子邮件从邮件服务器检索到 POP3 电子邮件客户端。POP3 协议针对电子邮件服务 器与电子邮件客户端之间的连接时具有三种处理状态:身分验证状态、事务处理状 态和更新状态。在身份验证状态下,连接到服务器的 POP3 电子邮件客户端必须先 接受身份验证,然后用户才能检索电子邮件。如果电子邮件客户端提供的用户名和 密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态。如果不匹 配,用户会收到错误消息,不允许连接和检索电子邮件。为防止对邮件存储区的破 坏,客户端通过身份验证后,POP3 服务会锁定用户的邮箱。用户通过身份验证后, 由于邮箱已被锁定,除非该连接被终止,否则不能下载提交到邮箱的新电子邮件。

4

盐城工学院本科生实习设计说明书(2007)

同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。 在 事务处理状态下,客户端发送 POP3 命令,同时服务器会根据 POP3 协议接收命令 并做出响应。如果服务器接收的任一客户端请求不符合 POP3 协议,就会被忽略, 并返回错误消息。更新状态关闭客户端与服务器端之间的连接。这是客户端发送的 最后命令。连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变 化情况。例如,除非用户的电子邮件客户端配置成执行其他操作,否则在用户成功 检索电子邮件后,已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。 3.2.2 POP 工作原理 POP3(Post Office Protocol 3) 是适用于 C/S 结构的脱机模型的电子邮件协 议, 目前已发展到第三版。POP3 规定了怎样将个人计

算机连接到 Internet 的邮件 服务器并下载电子邮件的规则。 POP3 是因特网电子邮件的第一个离线协议标准, 允 许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在 邮件服务器上的邮件,而 POP3 服务器则是遵循 POP3 协议的接收邮件服务器, 用 来接收电子邮件。 POP 适用于 C/S 结构的脱机模型。脱机模型即不能在线操作,不 像 IMAP4(netscape 支持 IMAP4)当客户机与服务器连接并查询新电子邮件时,被 该客户机指定的所有 将被下载的邮件都将被程序下载到客户机,下载后,电子邮 件客户机就可以删除或 修改任意邮件, 而无需与电子邮件服务器进一步交互。 POP3 客户向 POP3 服务器发送命令并等待响应,POP3 命令采用命令行形式,用 ASCII 码 表示。 服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行 以 ASCII 文本+OK 或-ERR 指出相应的操作状态是成功还是失败在 POP3 协议中有三 种状态,认可状态,处理状态,和更新状态。 当客户机与服务器建立联系时,一 旦客户机提供了自己身份并成功确认,即由认可 状态转入处理状态,在完成相应 的操作后客户机发出 quit 命令,则进入更新状态,更新之后最后重返认可状态。 如下图 3.2 所示:

等待连接 身份确认 quit 命令

—— |认可|————— |处理|——————|更新| |__________________________________| 重返认可状态 图 3.2 POP3 工作流程图

4.本系统使用组件的介绍

一般情况下,在 Visual C++中,电子邮件程序的编写是利用 Windows 自带的 MAPI 以及相关的通信协议 SMTP/POP3 等来实现的。但是要利用 MAPI 和通信协议实 现一个功能强大的电子邮件管理程序,需要有很强的相关专业知识。随着现代软件

5

基于电子邮件发送和接收的程序设计

业的发展,软件厂商提供了方便、简易、与服务器无关且稳固的电子邮件处理组件, 使我们可以在程序开发语言中调用这些组件,利用很简单的语言实现功能强大的程 序。JMail 组件便是一个很好的电子邮件程序开发第三方组件。 JMail 组件中包含有许多实现电子邮件处理的属性和方法。只需要在 Visual C++代码中创建一个 JMail 组件对象,调用其中的某些功能,就能很快完成程序的 开发。JMail 常用的基本属性和方法如表 4.1 所示。

JMail 常用发送与接收信件的基本属性和方法 方法和属性 Body Charset Sendname Sender Serveraddress Subject Priority AddAttachment(“filename”,[ContentTy pe]) AddCustomAttachment(“filemane”,data ) AddURLAttachment (“bstrURL”,”bstrAttachAS”,[bstrAu th]) AddRecipient(“Email-Address”) AddRecipientEX(“Email-Address”, name” “ ) AppendBodyFromFile(“Filename”) AppendText(Text

”) Execute()方法 Close()发送 Date MailServer Subject Timeout Connect()方法 增加一个收件人 增加一个带名字的收件人 将一个追加到正文后 追加信的正文内容 执行发送 强制 JMail 关闭缓冲与邮件服务器的连接 信件发送日期 邮箱所在的服务器 标题 连接服务器的超时限制 连接服务器,需要参数:帐号、口令、服 务器地址、端口

6

功能 邮件内容 字符集,默认为“US-ASCII” 发送人姓名 发送人邮箱地址 SMTP 服务器地址, 可指定多个, 用分号分 开,并可指定端口;为空白时,JMail 会尝试 解决远程邮件服务器,然后直接发送过去即可 标题 优先级 (1: 高优先级 3: 普通有限级别 5: 低优先级 ) 添加文件附件 添加自定义附件 下载并添加一个来自 bstrURL 的附件, BstrAttachAS 指定收到信件的文件名

盐城工学院本科生实习设计说明书(2007)

5.本系统的实现

5.1 对话框工程的创建 本次设计中,主要用到对话框资源。对话框(Dialog)是实现应用程序人机交互 的重要组成部分。对话框实际上也是一个窗口,它不但可以实现数据流的输入和输 出,而且也可以移动和关闭对话框,甚至还可以进行图形的绘制和操作。 要在应用程序中操作对话框资源,首先需要创建它。在 Visual C++ 6.0 集成 开发环境中,对话框资源的创建和使用流程如图 5.1 所示。 a.创建工程 MailServer. 首先,依据建立 MFC 应用程序的方法,利用 MFC AppWizard(exe)建立一个名为 MailServer 的工程。设置应用程序类型为 Dialog Based 模式。 b.创建对话框资源 单击 Resource View 面板,选择 Dialog 选项,添加一个新的对话框,命名为 IDD_MAILSERVER_DIALOG, 该 对 话 框 隶 属 于 类 CMailServerDlg. 修 改 对 话 框 的 Caption 属性为 MailServer.向新对话框中添加新的控件,各控件属性如表 5.1 所 示。

表 5.1 资源标识 IDC_EDIT_MAILSERVER IDC_EDIT_RECIPIENTS IDC_EDIT_SENDER IDC_EDIT_SUBJECT IDC_EDIT_BODY IDCANCEL IDOK 对话框 IDD_MAILSERVER_DIALOG 的控件 类型 默认 默认 默认 默认 Multiline 默认 默认 相关属性及功能说明 邮件服务器 收件人邮箱 发件人邮箱 主题 正文 退出发送邮件程序 发送邮件

c. 创建工程 MailRecieve 首先,依据建立 MFC 应用程序的方法,利用 MFC AppWizard(exe)建立一个名为 MailRecieve 的工程。设置应用程序类型为 Dialog Based 模式。 d.创建对话框资源 单击 Resource View 面板,选择 Dialog 选项,添加一个新的对话框,命名为 IDD_MAILRECIEVE_DIALOG, 该 对 话 框 隶 属 于 类 CMailRecieveDlg. 修 改 对 话 框 的 Caption 属性为 MailRecieve.向新对话框中添加新的控件,各控件属性如表 5.2 所 示。

7

基于电子邮件发送和接收的程序设计

表 5.2 对话框 IDD_MAILRECIEVE_DIALOG 的控件 资源标识 IDC_EDIT

_MAILSERVER IDC_EDIT_MUSERID IDC_EDIT_PPASSWORD IDC_EDIT_MESSAGES IDC_EDIT_BODY IDCANCEL IDOK 类型 默认 默认 单击 Password 复选框 Report Multiline 默认 默认 相关属性及功能说明 邮件 POP3 服务器 邮箱帐号 邮箱口令 邮件列表 正文 退出收取邮件程序 收取邮件

创建对话框资源

创建与对话框资源相关联的对话框类的派生类

创建对话框中的控件的消息响应

创建与对话框中控件相关联的变量

创建对话框类派生类的对象

调用 DoModal()显示对话框

图 5.1 对话框资源的创建与使用流程

5.2 各模块的具体设计

5.2.1 发送邮件模块详细设计与实现

8

盐城工学院本科生实习设计说明书(2007)

(1)往头文件 StdAfx.h 中添加 JMail 对象的声明, 这样才能在整个程序中引用 JMail 对象。代码如下: (注意:使用 JMail4.3 版本) # import “…\jmail.dll” using namespace jmail; //显示指定 JMail 动态链接库 //定义程序中 JMail 对象的名称

(2)头文件 MailServer.h ,利用 ClassWizard 类向导添加退出应用程序的函数 ExitInstance()。 源代码如下: //Overrides //{{AFX_VIRTUAL(MailServerApp) Public: //应用程序的初始化 virtual BOOL InitInstance(); //退出应用程序 virtual int ExitInstance(); //}}AFX_VIRTUAL (3)源文件 MailServer.cpp,类 CMailServerApp 的实现文件 1)由于程序中引用了 JMail 组件,因此必须在 InitInstance()函数中添加如下代 码,进行应用程序的初始化。 //添加初始化函数 BOOL CMailServerApp::InitInstance() { AfxEnableControlContainer(); ::CoInitialize(NULL); # ifdef _AFXDLL Enable3dControls(); # else Enable3dControlsStatic(); …… } 2)应用程序时,在 ExitInstance()函数中添加释放各变量的代码。 //应用程序退出 int CMailServerApp::ExitInstance()

9

基于电子邮件发送和接收的程序设计

{ return CWinApp::ExitInstance(); ::CoUninitialize (); }

(4)MailServerDlg.h 头文件,CMailServerDlg 类的接口。 1)在头文件 MaiServer.Dlg 中,添加对话框 IDD_MAILSERVER_DIALOG 内各控件所 对应的控件变量。右击工作区中任一源文件,在弹出的菜单中选择 ClassWizard 选 项, 选择 ClassWizard 对话框内的 Member Variables 页面, CMailServerDlg 类 为 添加控件变量。各控件及其对应的变量如表 5.3 所示。

表 5.3 对话框 IDD_MAILSERVER_DIALOG 的控件及控件变量 控件 IDC_EDIT_MAILSERVER IDC_EDIT_RECIPIENTS IDC_EDIT_SENDER IDC_EDIT_SUBJECT IDC_EDIT_BODY 控件变量 m_strmailserver m_strrecipients m_strsender m_strsubject m_strbody

2)利用 CLassWizard 添加 IDOK 控件的 ON_BN_CLICKED 事件函数,代码如下: Protected: //{{ AFX_MSG(CMailServerDlg) …… Afx_msg …… }; 3) 源 文 件 MailServerDlg.cpp, 类 CMailServerDlg 的 实 现 文 件 。 打 开 MailServerDlg.cpp 文件,添加发送邮件函数 OnSend()代码如下: //发送邮件程序 void CMailServerDlg::

OnSend() { UpdateData();

10

void Onsend();

//}}AFX_MSG

盐城工学院本科生实习设计说明书(2007)

//获取 Edit 控件中的字符串 …… //判断 Edit 控件中的字符串是否有效 … //发送邮件过程 try { //创建一个 JMail 对象,这样便可以利用其内容封装的基本属性和方法 jmail::IMessagePtr pMessage(ilRecieveApp::InitInstance ()

13

基于电子邮件发送和接收的程序设计

(4)MailRecieveDlg.h 头文件,CMailRecieve 类的接口。 1) 在头文件 MailRecieveDlg.h 中,添加对话框 IDD_MAILRECIEVE_DIALOG 内各控 件所对应的控件变量。 右击工作区中任一源文件, 在弹出的菜单中选择 ClassWizard 选项, 选择 ClassWizard 对话框内的 Member Variables 页面, CMailRecieveDlg 为 类添加控件变量。各控件及其对应的变量如表 5.4 所示。

表 5.4 对话框 IDD_MAILRECIEVE_DIALOG 的控件及控件变量 控件 IDC_EDIT_MAILSERVER IDC_EDIT_PASSWORD IDC_EDIT_USERID IDC_EDIT_MESSAGES IDC_EDIT_BODY 控件变量 m_strmailserver m_strPassword m_struserid m_strsubject m_ctlMessageList

2)利用 ClassWizard 添加 IDOK 控件的 ON_BN_CLICKED 事件函数, 利用 ClassWizard 添加 List 控件的 LVN_ITEMCHANGE 事件函数。代码如下: protected: //{{AFX_MSG(CMailServerDlg) …… //接收邮件的函数 Afx_msg afx_msg …… 3)添加存放信件正文内容的动态数组 m_strBodyArray: protected: CStringArray m_strBodyArray; void OnRecieve(); //显示邮件正文的函数 void OnShowBody(NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG

4) 源 文 件 MailRecieveDlg.cpp, 类 CMailRecieveDlg 的 实 现 文 件 。 向 MailServerDlg.cpp 文件中添加初始化对话框函数 OnInitDialog()的代码。 BOOL CMailRecieveDlg::OnInitDialog()

14

盐城工学院本科生实习设计说明书(2007)

{ …… // TODO: Add extra initialization here //升级列表控件 ::SendMessage(m_ctlMessagesList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); //显示控件列表 m_ctlMessagesList.InsertColumn(0,Add your control notification handler code here //获取选定信件的指针 POSITION pos =m_ctlMessagesList.GetFirstSelectedItemPosition(); …… }

6.程序测试

6.1 发送电子邮件程序主界面(不带附件) ,如图 6.1 所示:

16

盐城工学院本科生实习设计说明书(2007)

图 6.1 发送电子邮件程序主界面(不带附件)

6.2

发送电子邮件程序主界面(加载附件) ,如图 6.2 所示:

图 6.2 发送电子邮件程序主界面(加载附件)

17

基于电子邮件发送和接收的程序设计

6.3

发送电子邮件程序主界面(带附件) ,如图 6.3 所示:

图 6.3 发送电子邮件程序主界面(带附件)

6.4

版权及相关帮助信息(发送收邮件) ,如图 6.4 所示:

图 6.4 版权及相关帮助信息(发送收邮件)

18

盐城工学院本科生实习设计说明书(2007)

6.5 接收电子邮件程序主界面(成功) ,如图 6.5 所示:

图 6.5 接收电子邮件程序主界面(成功)

6.6 版权及相关帮助信息(接收邮件) ,如图 6.6 所示:

图 6.6 版权及相关帮助信息(接收邮件)

7.结束语及心得: 经过两个星期的不懈努力,终于设计出一个电子邮件发送和接收系统并调试通

19

基于电子邮件发送和接收的程序设计

过,最后整理出设计报告。通过编写电子邮件的发送和接收程序,发现利用外部组 件 JMail4.3 和 Visual C++联合能很轻松得开发出功能强大却十分简洁的软件,且 不需要太多的专业知识。 目前系统还不够完整,还存在着很多的不足和不完善的地方。归纳起来体现在 以下几个方面: 1.系统功能趋于简单,真正的邮件客户端系统包括很多方面的信息,而不仅 仅局限于发送邮件和收取邮件。 真正的邮件客户端系统还包括邮件导入、 邮件导出、 文本编辑(查找与撤消) 、通讯簿、通讯规则等等功能。 2.系统图形操作功能缺乏,目前系统中对邮件附件的添加,删除功能都没有 图形快捷操作,而且整个系统的界面显得过于单调,缺乏动态显示效果。如果能结 合其它界面美化工具,使得界面更人性化,那就更好了。 3.对与编写的 发送邮件的类 MailServer 与接收邮件类 MailRecieve。实现的 功能还不够完善。在接收邮件时,不能接收附件。

20

盐城工学院本科生实习设计说明书(2007)

附录

附录 1:发送邮件的部分程序 // MailServerDlg.cpp : implementation file #include D_ABOUTBOX }; CString m_strEditHelp; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL // DDX/DDV support

21

基于电子邮件发送和接收的程序设计

// Implementation protected: //{{AFX_MSG(CAboutDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) m_strEditHelp = _T(that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMailServerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMailServerDlg) DDX_Text(pDX, IDC_EDIT_BODY, m_strbody); DDX_Text(pDX, IDC_EDIT_MAILSERVER, m_strmailserver); DDX_Text(pDX, IDC_EDIT_RECIPIENTS, m_strrecipients); DDX_Text(pDX, IDC_EDIT_SENDER, m_strsender); DDX_Text(pDX, IDC_EDIT_SUBJECT, m_strsubject); //}}AFX_DATA_MAP }

24

盐城工学院本科生实习设计说明书(2007)

BEGIN_MESSAGE_MAP(CMailServerDlg, CDialog) //{{AFX_MSG_MAP(CMailServerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, OnSend) ON_BN_CLICKED(IDC_ABOUT, OnAbout) ON_BN_CLICKED(IDC_BT_ADDFILE, OnBtAddfile) //}}AFX_MSG_MAP END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////// ////// // CMailServerDlg message handlers BOOL CMailServerDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add ailserver.TrimLeft(); m_strmailserver.TrimRight(); m_strrecipients.TrimLeft(); m_strrecipients.TrimRight(); m_strsender.TrimLeft(); m_strsender.TrimRight(); the minimized window. HCURSOR CMailServerDlg::OnQueryDragIcon()

27

基于电子邮件发送和接收的程序设计

//判断 Edit 控件中的字符串是否有效 if(m_strrecipients.GetLength()

31

基于电子邮件发送和接收的程序设计

DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) m_strEditHelp = _T(CFMT_LEFT,350); m_ctlMessagesList.InsertColumn(2,str_t bstrSubject = pMessage->Subject; _bstr_t bstrBody = pMessage->Body; COleDateTime oleDate = pMessage->Date; //向 List 空间中添加信件信息 int nListItem = m_ctlMessagesList.InsertItem(i, (const char*)bstrFrom); m_ctlMessagesList.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrSubject, 0, 0, 0, NULL); m_ctlMessagesList.SetItem(nListItem, 2, LVIF_TEXT, (const char*)oleDate.Format(jmail; …… } //注意这两行必须添加

41

盐城工学院本科生实习设计说明书(2007)

1.概述…………………………………………………………………………………2 2.电子邮件系统的总体设计…………………………………………………………3 2.1.系统模块结构……………………………………………………………………3 2.2.系统用例图………………………………………………………………………3 3.协议的研究与分析…………………………………………………………………4 3.1.SMTP协议简介及通讯模型………………………………………………………4 3.2.POP协议简介及工作原理……………………………………………………… 4 4.本系统使用组件的介绍……………………………………………………………5 5.本系统的实现………………………………………………………………………7 5.1.对话框工程的创建………………………………………………………………7 5.2.各模块的具体设计………………………………………………………………8 6.程序测试……………………………………………………………………………16 7.结束语及心得………………………………………………………………………19 附录 ………………………………………………………………………………… 21 附录1………………………………………………………………………………… 21 附录2………………………………………………………………………………… 30

1

基于电子邮件发送和接收的程序设计

电子邮件发送和接收程序设计

1. 概 述

电子邮件(简称 E-mai1)又称电子信箱、 电子邮政是—种用电子手段提供信息交 换的通信方式。 它是全球多种网络上使用最普遍的一项服务。 这种非交互式的通信, 加速了信息的交流及数据传送,它是—个简易、快速的方法。通过连接全世界的 Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。 到目前为止,可以说电子邮件是 Internet 资源使用最多的一种服务, E-mai1 不只局 限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。 电子邮件的处理有两大部分组成:电子邮件发送程序和电子邮件接收程序。电 子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件 服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包 含有信件主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服 务器相连接,并将邮件送入收信者的邮箱中,电子邮件接收程序则只需要处理本地 计算机与存在

电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮 件,邮件中包含有信件主题、内容和发送时间等。 系统使用 VisualC++ 6.0 作为开发工具,开发一个功能全面,应用广泛电子邮 件应用程序。系统实现的功能主要有创建与更改帐号,发送与接收电子邮件及其附 件,管理电子邮件等。 本例发送程序采取了既可与发送邮件服务器连接又可以直接与接收邮件服务 器连接的方式来实现电子邮件的发送。用户在“收件人邮箱”所对应的对话框中输 入收件人的 Email 地址,并在“发件人邮箱”所对的对话框中输入发信人的 Email 地址,编辑信件的正文(本例还可以发送附件,只要填写真确的路径,就可以发送 附件) ,然后单击“发送”按钮,便可完成电子邮件的发送。电子邮件发送成功, 程序将弹出一个“发送成功”的消息对话框;若电子邮件发送失败,程序将给出失 败的相关信息。另外这里还有个“关于”按钮,单击一下可以查看相关帮助信息, 有利于你使用此软件。 本例电子邮件接收程序也采取了 Visual C++语言与 JMail 组件相结合的方法, 实现从电子邮件服务器上接收邮件。用户在“邮件服务器’POP3’”所对应的编辑 框中输入收件人的 E-mail 所在的 POP3 服务器,在“帐号”所对应的编辑中输入邮箱的帐号,在 “口令”所对应的编辑框中输入打开邮箱的密码,单击“收取”按钮,便可完成电 子邮件的收取。若用户的信箱中存在着邮件,程序将把所有邮件罗列出来,单击任 何一封邮件的标题,均可查看邮件的正文;若连接邮件失败,程序将给出失败的相 关信息。同样有一个“关于”按钮,单击一下可以查看相关帮助信息。

2

盐城工学院本科生实习设计说明书(2007)

2.电子邮件系统的总体设计

2.1 系统模块结构 电子子邮件客户端主要由以下两个模块构成:发送邮件模块、收取邮件模块、 。 其功能模块如图 2.1 所示:

电子邮件客户应用系统

发 送 邮 件

接 收 邮 件

图 2.1 电子有功能模块图

1)发送邮件模块:发送邮件,发送附件,查看相关帮助信息 2)接收邮件模块:接收邮件,查看相关帮助信息 2.2 系统用例图 用例是一个简单的声明,体现为文字或图表形式,描述系统的一个特定的目的或 结果,以及是谁希望得到结果. 用例图可以说成是对于一个软件在规划阶段产生的 技术性需求和功能性需求,利用某种建模工具来实现出来的一个图形化的介绍。 通过对发送与接收电子邮件功能模块的分析,建立发送与接收电子邮件用例图 如图 2.2 所示:.

图 2. 2

发送与收取电子邮件

3

基于电子邮件发送和接收的程序设计

3.协议的研究与

分析

3.1 SMTP 协议简介及通讯模型 3.1.1 SMTP 协议简介 SMTP 协议是 TCP/IP 协议族中的一员,主要对如何将电子邮件从发送方地址传 送到接收方地址,也即是对传输的规则做了规定。SMTP 协议的目标是可靠高效地传 送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。 SMTP 协议通信模型并不复杂,主要工作集中在发送 SMTP 和接收 SMTP 上:首先针对 用户发出的邮件请求,由发送 SMTP 建立一条连接到接收 SMTP 的双工通讯链路,这 里的接收 SMTP 是相对于发送 SMTP 而言的,实际上它既可以是最终的接收者也可以 是中间传送者。发送 SMTP 负责向接收 SMTP 发送 SMTP 命令,而接收 SMTP 则负责接 收并反馈应答。可大致用下面的图 3.1 来表示:

图 3.1

SMTP 通信模型

3.2 POP3 协议简介及工作原理 3.2.1 POP3 协议简介 邮局协议 3 (POP3) 是检索电子邮件的标准协议。POP3 协议控制 POP3 电子 邮件客户端和存储电子邮件的服务器之间的连接。POP3 服务使用 POP3 协议将电 子邮件从邮件服务器检索到 POP3 电子邮件客户端。POP3 协议针对电子邮件服务 器与电子邮件客户端之间的连接时具有三种处理状态:身分验证状态、事务处理状 态和更新状态。在身份验证状态下,连接到服务器的 POP3 电子邮件客户端必须先 接受身份验证,然后用户才能检索电子邮件。如果电子邮件客户端提供的用户名和 密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态。如果不匹 配,用户会收到错误消息,不允许连接和检索电子邮件。为防止对邮件存储区的破 坏,客户端通过身份验证后,POP3 服务会锁定用户的邮箱。用户通过身份验证后, 由于邮箱已被锁定,除非该连接被终止,否则不能下载提交到邮箱的新电子邮件。

4

盐城工学院本科生实习设计说明书(2007)

同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。 在 事务处理状态下,客户端发送 POP3 命令,同时服务器会根据 POP3 协议接收命令 并做出响应。如果服务器接收的任一客户端请求不符合 POP3 协议,就会被忽略, 并返回错误消息。更新状态关闭客户端与服务器端之间的连接。这是客户端发送的 最后命令。连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变 化情况。例如,除非用户的电子邮件客户端配置成执行其他操作,否则在用户成功 检索电子邮件后,已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。 3.2.2 POP 工作原理 POP3(Post Office Protocol 3) 是适用于 C/S 结构的脱机模型的电子邮件协 议, 目前已发展到第三版。POP3 规定了怎样将个人计

算机连接到 Internet 的邮件 服务器并下载电子邮件的规则。 POP3 是因特网电子邮件的第一个离线协议标准, 允 许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在 邮件服务器上的邮件,而 POP3 服务器则是遵循 POP3 协议的接收邮件服务器, 用 来接收电子邮件。 POP 适用于 C/S 结构的脱机模型。脱机模型即不能在线操作,不 像 IMAP4(netscape 支持 IMAP4)当客户机与服务器连接并查询新电子邮件时,被 该客户机指定的所有 将被下载的邮件都将被程序下载到客户机,下载后,电子邮 件客户机就可以删除或 修改任意邮件, 而无需与电子邮件服务器进一步交互。 POP3 客户向 POP3 服务器发送命令并等待响应,POP3 命令采用命令行形式,用 ASCII 码 表示。 服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行 以 ASCII 文本+OK 或-ERR 指出相应的操作状态是成功还是失败在 POP3 协议中有三 种状态,认可状态,处理状态,和更新状态。 当客户机与服务器建立联系时,一 旦客户机提供了自己身份并成功确认,即由认可 状态转入处理状态,在完成相应 的操作后客户机发出 quit 命令,则进入更新状态,更新之后最后重返认可状态。 如下图 3.2 所示:

等待连接 身份确认 quit 命令

—— |认可|————— |处理|——————|更新| |__________________________________| 重返认可状态 图 3.2 POP3 工作流程图

4.本系统使用组件的介绍

一般情况下,在 Visual C++中,电子邮件程序的编写是利用 Windows 自带的 MAPI 以及相关的通信协议 SMTP/POP3 等来实现的。但是要利用 MAPI 和通信协议实 现一个功能强大的电子邮件管理程序,需要有很强的相关专业知识。随着现代软件

5

基于电子邮件发送和接收的程序设计

业的发展,软件厂商提供了方便、简易、与服务器无关且稳固的电子邮件处理组件, 使我们可以在程序开发语言中调用这些组件,利用很简单的语言实现功能强大的程 序。JMail 组件便是一个很好的电子邮件程序开发第三方组件。 JMail 组件中包含有许多实现电子邮件处理的属性和方法。只需要在 Visual C++代码中创建一个 JMail 组件对象,调用其中的某些功能,就能很快完成程序的 开发。JMail 常用的基本属性和方法如表 4.1 所示。

JMail 常用发送与接收信件的基本属性和方法 方法和属性 Body Charset Sendname Sender Serveraddress Subject Priority AddAttachment(“filename”,[ContentTy pe]) AddCustomAttachment(“filemane”,data ) AddURLAttachment (“bstrURL”,”bstrAttachAS”,[bstrAu th]) AddRecipient(“Email-Address”) AddRecipientEX(“Email-Address”, name” “ ) AppendBodyFromFile(“Filename”) AppendText(Text

”) Execute()方法 Close()发送 Date MailServer Subject Timeout Connect()方法 增加一个收件人 增加一个带名字的收件人 将一个追加到正文后 追加信的正文内容 执行发送 强制 JMail 关闭缓冲与邮件服务器的连接 信件发送日期 邮箱所在的服务器 标题 连接服务器的超时限制 连接服务器,需要参数:帐号、口令、服 务器地址、端口

6

功能 邮件内容 字符集,默认为“US-ASCII” 发送人姓名 发送人邮箱地址 SMTP 服务器地址, 可指定多个, 用分号分 开,并可指定端口;为空白时,JMail 会尝试 解决远程邮件服务器,然后直接发送过去即可 标题 优先级 (1: 高优先级 3: 普通有限级别 5: 低优先级 ) 添加文件附件 添加自定义附件 下载并添加一个来自 bstrURL 的附件, BstrAttachAS 指定收到信件的文件名

盐城工学院本科生实习设计说明书(2007)

5.本系统的实现

5.1 对话框工程的创建 本次设计中,主要用到对话框资源。对话框(Dialog)是实现应用程序人机交互 的重要组成部分。对话框实际上也是一个窗口,它不但可以实现数据流的输入和输 出,而且也可以移动和关闭对话框,甚至还可以进行图形的绘制和操作。 要在应用程序中操作对话框资源,首先需要创建它。在 Visual C++ 6.0 集成 开发环境中,对话框资源的创建和使用流程如图 5.1 所示。 a.创建工程 MailServer. 首先,依据建立 MFC 应用程序的方法,利用 MFC AppWizard(exe)建立一个名为 MailServer 的工程。设置应用程序类型为 Dialog Based 模式。 b.创建对话框资源 单击 Resource View 面板,选择 Dialog 选项,添加一个新的对话框,命名为 IDD_MAILSERVER_DIALOG, 该 对 话 框 隶 属 于 类 CMailServerDlg. 修 改 对 话 框 的 Caption 属性为 MailServer.向新对话框中添加新的控件,各控件属性如表 5.1 所 示。

表 5.1 资源标识 IDC_EDIT_MAILSERVER IDC_EDIT_RECIPIENTS IDC_EDIT_SENDER IDC_EDIT_SUBJECT IDC_EDIT_BODY IDCANCEL IDOK 对话框 IDD_MAILSERVER_DIALOG 的控件 类型 默认 默认 默认 默认 Multiline 默认 默认 相关属性及功能说明 邮件服务器 收件人邮箱 发件人邮箱 主题 正文 退出发送邮件程序 发送邮件

c. 创建工程 MailRecieve 首先,依据建立 MFC 应用程序的方法,利用 MFC AppWizard(exe)建立一个名为 MailRecieve 的工程。设置应用程序类型为 Dialog Based 模式。 d.创建对话框资源 单击 Resource View 面板,选择 Dialog 选项,添加一个新的对话框,命名为 IDD_MAILRECIEVE_DIALOG, 该 对 话 框 隶 属 于 类 CMailRecieveDlg. 修 改 对 话 框 的 Caption 属性为 MailRecieve.向新对话框中添加新的控件,各控件属性如表 5.2 所 示。

7

基于电子邮件发送和接收的程序设计

表 5.2 对话框 IDD_MAILRECIEVE_DIALOG 的控件 资源标识 IDC_EDIT

_MAILSERVER IDC_EDIT_MUSERID IDC_EDIT_PPASSWORD IDC_EDIT_MESSAGES IDC_EDIT_BODY IDCANCEL IDOK 类型 默认 默认 单击 Password 复选框 Report Multiline 默认 默认 相关属性及功能说明 邮件 POP3 服务器 邮箱帐号 邮箱口令 邮件列表 正文 退出收取邮件程序 收取邮件

创建对话框资源

创建与对话框资源相关联的对话框类的派生类

创建对话框中的控件的消息响应

创建与对话框中控件相关联的变量

创建对话框类派生类的对象

调用 DoModal()显示对话框

图 5.1 对话框资源的创建与使用流程

5.2 各模块的具体设计

5.2.1 发送邮件模块详细设计与实现

8

盐城工学院本科生实习设计说明书(2007)

(1)往头文件 StdAfx.h 中添加 JMail 对象的声明, 这样才能在整个程序中引用 JMail 对象。代码如下: (注意:使用 JMail4.3 版本) # import “…\jmail.dll” using namespace jmail; //显示指定 JMail 动态链接库 //定义程序中 JMail 对象的名称

(2)头文件 MailServer.h ,利用 ClassWizard 类向导添加退出应用程序的函数 ExitInstance()。 源代码如下: //Overrides //{{AFX_VIRTUAL(MailServerApp) Public: //应用程序的初始化 virtual BOOL InitInstance(); //退出应用程序 virtual int ExitInstance(); //}}AFX_VIRTUAL (3)源文件 MailServer.cpp,类 CMailServerApp 的实现文件 1)由于程序中引用了 JMail 组件,因此必须在 InitInstance()函数中添加如下代 码,进行应用程序的初始化。 //添加初始化函数 BOOL CMailServerApp::InitInstance() { AfxEnableControlContainer(); ::CoInitialize(NULL); # ifdef _AFXDLL Enable3dControls(); # else Enable3dControlsStatic(); …… } 2)应用程序时,在 ExitInstance()函数中添加释放各变量的代码。 //应用程序退出 int CMailServerApp::ExitInstance()

9

基于电子邮件发送和接收的程序设计

{ return CWinApp::ExitInstance(); ::CoUninitialize (); }

(4)MailServerDlg.h 头文件,CMailServerDlg 类的接口。 1)在头文件 MaiServer.Dlg 中,添加对话框 IDD_MAILSERVER_DIALOG 内各控件所 对应的控件变量。右击工作区中任一源文件,在弹出的菜单中选择 ClassWizard 选 项, 选择 ClassWizard 对话框内的 Member Variables 页面, CMailServerDlg 类 为 添加控件变量。各控件及其对应的变量如表 5.3 所示。

表 5.3 对话框 IDD_MAILSERVER_DIALOG 的控件及控件变量 控件 IDC_EDIT_MAILSERVER IDC_EDIT_RECIPIENTS IDC_EDIT_SENDER IDC_EDIT_SUBJECT IDC_EDIT_BODY 控件变量 m_strmailserver m_strrecipients m_strsender m_strsubject m_strbody

2)利用 CLassWizard 添加 IDOK 控件的 ON_BN_CLICKED 事件函数,代码如下: Protected: //{{ AFX_MSG(CMailServerDlg) …… Afx_msg …… }; 3) 源 文 件 MailServerDlg.cpp, 类 CMailServerDlg 的 实 现 文 件 。 打 开 MailServerDlg.cpp 文件,添加发送邮件函数 OnSend()代码如下: //发送邮件程序 void CMailServerDlg::

OnSend() { UpdateData();

10

void Onsend();

//}}AFX_MSG

盐城工学院本科生实习设计说明书(2007)

//获取 Edit 控件中的字符串 …… //判断 Edit 控件中的字符串是否有效 … //发送邮件过程 try { //创建一个 JMail 对象,这样便可以利用其内容封装的基本属性和方法 jmail::IMessagePtr pMessage(ilRecieveApp::InitInstance ()

13

基于电子邮件发送和接收的程序设计

(4)MailRecieveDlg.h 头文件,CMailRecieve 类的接口。 1) 在头文件 MailRecieveDlg.h 中,添加对话框 IDD_MAILRECIEVE_DIALOG 内各控 件所对应的控件变量。 右击工作区中任一源文件, 在弹出的菜单中选择 ClassWizard 选项, 选择 ClassWizard 对话框内的 Member Variables 页面, CMailRecieveDlg 为 类添加控件变量。各控件及其对应的变量如表 5.4 所示。

表 5.4 对话框 IDD_MAILRECIEVE_DIALOG 的控件及控件变量 控件 IDC_EDIT_MAILSERVER IDC_EDIT_PASSWORD IDC_EDIT_USERID IDC_EDIT_MESSAGES IDC_EDIT_BODY 控件变量 m_strmailserver m_strPassword m_struserid m_strsubject m_ctlMessageList

2)利用 ClassWizard 添加 IDOK 控件的 ON_BN_CLICKED 事件函数, 利用 ClassWizard 添加 List 控件的 LVN_ITEMCHANGE 事件函数。代码如下: protected: //{{AFX_MSG(CMailServerDlg) …… //接收邮件的函数 Afx_msg afx_msg …… 3)添加存放信件正文内容的动态数组 m_strBodyArray: protected: CStringArray m_strBodyArray; void OnRecieve(); //显示邮件正文的函数 void OnShowBody(NMHDR* pNMHDR, LRESULT* pResult); //}}AFX_MSG

4) 源 文 件 MailRecieveDlg.cpp, 类 CMailRecieveDlg 的 实 现 文 件 。 向 MailServerDlg.cpp 文件中添加初始化对话框函数 OnInitDialog()的代码。 BOOL CMailRecieveDlg::OnInitDialog()

14

盐城工学院本科生实习设计说明书(2007)

{ …… // TODO: Add extra initialization here //升级列表控件 ::SendMessage(m_ctlMessagesList.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); //显示控件列表 m_ctlMessagesList.InsertColumn(0,Add your control notification handler code here //获取选定信件的指针 POSITION pos =m_ctlMessagesList.GetFirstSelectedItemPosition(); …… }

6.程序测试

6.1 发送电子邮件程序主界面(不带附件) ,如图 6.1 所示:

16

盐城工学院本科生实习设计说明书(2007)

图 6.1 发送电子邮件程序主界面(不带附件)

6.2

发送电子邮件程序主界面(加载附件) ,如图 6.2 所示:

图 6.2 发送电子邮件程序主界面(加载附件)

17

基于电子邮件发送和接收的程序设计

6.3

发送电子邮件程序主界面(带附件) ,如图 6.3 所示:

图 6.3 发送电子邮件程序主界面(带附件)

6.4

版权及相关帮助信息(发送收邮件) ,如图 6.4 所示:

图 6.4 版权及相关帮助信息(发送收邮件)

18

盐城工学院本科生实习设计说明书(2007)

6.5 接收电子邮件程序主界面(成功) ,如图 6.5 所示:

图 6.5 接收电子邮件程序主界面(成功)

6.6 版权及相关帮助信息(接收邮件) ,如图 6.6 所示:

图 6.6 版权及相关帮助信息(接收邮件)

7.结束语及心得: 经过两个星期的不懈努力,终于设计出一个电子邮件发送和接收系统并调试通

19

基于电子邮件发送和接收的程序设计

过,最后整理出设计报告。通过编写电子邮件的发送和接收程序,发现利用外部组 件 JMail4.3 和 Visual C++联合能很轻松得开发出功能强大却十分简洁的软件,且 不需要太多的专业知识。 目前系统还不够完整,还存在着很多的不足和不完善的地方。归纳起来体现在 以下几个方面: 1.系统功能趋于简单,真正的邮件客户端系统包括很多方面的信息,而不仅 仅局限于发送邮件和收取邮件。 真正的邮件客户端系统还包括邮件导入、 邮件导出、 文本编辑(查找与撤消) 、通讯簿、通讯规则等等功能。 2.系统图形操作功能缺乏,目前系统中对邮件附件的添加,删除功能都没有 图形快捷操作,而且整个系统的界面显得过于单调,缺乏动态显示效果。如果能结 合其它界面美化工具,使得界面更人性化,那就更好了。 3.对与编写的 发送邮件的类 MailServer 与接收邮件类 MailRecieve。实现的 功能还不够完善。在接收邮件时,不能接收附件。

20

盐城工学院本科生实习设计说明书(2007)

附录

附录 1:发送邮件的部分程序 // MailServerDlg.cpp : implementation file #include D_ABOUTBOX }; CString m_strEditHelp; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL // DDX/DDV support

21

基于电子邮件发送和接收的程序设计

// Implementation protected: //{{AFX_MSG(CAboutDlg) virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) m_strEditHelp = _T(that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CMailServerDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMailServerDlg) DDX_Text(pDX, IDC_EDIT_BODY, m_strbody); DDX_Text(pDX, IDC_EDIT_MAILSERVER, m_strmailserver); DDX_Text(pDX, IDC_EDIT_RECIPIENTS, m_strrecipients); DDX_Text(pDX, IDC_EDIT_SENDER, m_strsender); DDX_Text(pDX, IDC_EDIT_SUBJECT, m_strsubject); //}}AFX_DATA_MAP }

24

盐城工学院本科生实习设计说明书(2007)

BEGIN_MESSAGE_MAP(CMailServerDlg, CDialog) //{{AFX_MSG_MAP(CMailServerDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDOK, OnSend) ON_BN_CLICKED(IDC_ABOUT, OnAbout) ON_BN_CLICKED(IDC_BT_ADDFILE, OnBtAddfile) //}}AFX_MSG_MAP END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////// ////// // CMailServerDlg message handlers BOOL CMailServerDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add ailserver.TrimLeft(); m_strmailserver.TrimRight(); m_strrecipients.TrimLeft(); m_strrecipients.TrimRight(); m_strsender.TrimLeft(); m_strsender.TrimRight(); the minimized window. HCURSOR CMailServerDlg::OnQueryDragIcon()

27

基于电子邮件发送和接收的程序设计

//判断 Edit 控件中的字符串是否有效 if(m_strrecipients.GetLength()

31

基于电子邮件发送和接收的程序设计

DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) m_strEditHelp = _T(CFMT_LEFT,350); m_ctlMessagesList.InsertColumn(2,str_t bstrSubject = pMessage->Subject; _bstr_t bstrBody = pMessage->Body; COleDateTime oleDate = pMessage->Date; //向 List 空间中添加信件信息 int nListItem = m_ctlMessagesList.InsertItem(i, (const char*)bstrFrom); m_ctlMessagesList.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrSubject, 0, 0, 0, NULL); m_ctlMessagesList.SetItem(nListItem, 2, LVIF_TEXT, (const char*)oleDate.Format(jmail; …… } //注意这两行必须添加

41


相关文章

  • 计算机应用技术毕业论文
  • 邮件服务器 李玉平 摘要:电子邮件是因特网上最为流行的应用之一.如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同.与传统邮件不同的是,电子邮件既迅速,又易于分发,而且成本低廉 ...查看


  • 因特网基本服务
  • 第三章 因特网基本服务 前两章学习了计算机网络基础和因特网应用基础知识,本章主要学习因特网的四种基本服务,包括万维网.电子邮件.远程登录和文件传输以及网络的各种应用模式的基本工作原理及其应用方式. 图3-1 因特网基本服务内容框架图 二. ...查看


  • 超声波测距仪
  • 获取更多权威电子资料 请登陆 www.eepw.com.cn 基于超声波传感器的测距系统设计 安全避障是移动机器人研究的一个基本问题.与机器人之间距离的获得是研究安全避障的前提,超声波传感器以其信息处理简单.价格低廉.硬件容易实现等优点,被 ...查看


  • [每日一步]电子邮件技术基础之一:邮件的工作原理
  • 每天,通过互联网发送的电子邮件有数十亿封之多.如果您经常上网,或许一天随随便便就要发十几封信.显然,电子邮件已经成为日常生活中广泛使用的沟通工具.电子邮件能绕过半个地球从您的电脑到达您朋友的收件箱,您是否想过这是什么原理呢?什么是POP3服 ...查看


  • 单片机与pc机串口通信
  • 综合电子课程设计报告 题目:单片机与PC机串口双向数据通信 设计时间:2011年 8 月 22 日至 9 月 9 日 学 院: 电气与信息工程学院 专业名称: 电子信息科学与技术 学 号: [1**********]5 姓 名: 夏攀 指导 ...查看


  • 探探APP匿名暗恋表白引争议 未经同意发短信或涉侵权
  • 探探网站上的页面截屏. 使用者通过"匿名暗恋表白"功能发送信息,应当是限于两个使用者之间,而未注册者不是该应用程序的用户,并未同意或要求发送此类信息,这种短信的发送应被视为骚扰短信. 探探发出的短信表面上看是" ...查看


  • 计算机网络重点知识总结_谢希仁版
  • 一.现在最主要的三种网络 电信网络(电话网) 有线电视网络 计算机网络 (发展最快,信息时代的核心技术) 二.internet 和 Internet internet 是普通名词 泛指一般的互连网(互联网) Internet 是专有名词, ...查看


  • 大额支付结算办法
  • 大额支付系统业务处理办法(试行) 第一章 总 则 第一条 为规范大额支付系统的业务处理,确保大额支付系统快速.高效.安全.稳定运行,加速资金周转,防范支付风险,依据<中华人民共和国中国人民银行法>及有关法规制度的规定,制定本办法 ...查看


  • 电子公文传输系统的关键技术
  • 电子公文传输系统是机关单位之间实现电子政务信息化交流的一个典型应用,为了保证这种交流的顺利进行,系统对安全性.方便性等有着特殊的要求,涉及多项关键技术. [计世网独家](作者 陈剑波)我国机关和企事业单位的传统行文媒介是以带有公章的红头文件 ...查看


热门内容