电子邮件发送和接收程序设计.docx
- 文档编号:4396806
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:49
- 大小:191.43KB
电子邮件发送和接收程序设计.docx
《电子邮件发送和接收程序设计.docx》由会员分享,可在线阅读,更多相关《电子邮件发送和接收程序设计.docx(49页珍藏版)》请在冰点文库上搜索。
电子邮件发送和接收程序设计
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.概述
电子邮件(简称E-mai1)又称电子信箱、电子邮政是—种用电子手段提供信息交换的通信方式。
它是全球多种网络上使用最普遍的一项服务。
这种非交互式的通信,加速了信息的交流及数据传送,它是—个简易、快速的方法。
通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。
到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。
电子邮件的处理有两大部分组成:
电子邮件发送程序和电子邮件接收程序。
电子邮件发送程序的发送方式有两种:
第一种是本地计算机与用户所指定的发送邮件服务器连接,然后通过发送邮件服务器将邮件传送到接收邮件的服务器,邮件中包含有信件主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服务器相连接,并将邮件送入收信者的邮箱中,电子邮件接收程序则只需要处理本地计算机与存在电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮件,邮件中包含有信件主题、内容和发送时间等。
系统使用VisualC++6.0作为开发工具,开发一个功能全面,应用广泛电子邮件应用程序。
系统实现的功能主要有创建与更改帐号,发送与接收电子邮件及其附件,管理电子邮件等。
本例发送程序采取了既可与发送邮件服务器连接又可以直接与接收邮件服务器连接的方式来实现电子邮件的发送。
用户在“收件人邮箱”所对应的对话框中输入收件人的Email地址,并在“发件人邮箱”所对的对话框中输入发信人的Email地址,编辑信件的正文(本例还可以发送附件,只要填写真确的路径,就可以发送附件),然后单击“发送”按钮,便可完成电子邮件的发送。
电子邮件发送成功,程序将弹出一个“发送成功”的消息对话框;若电子邮件发送失败,程序将给出失败的相关信息。
另外这里还有个“关于”按钮,单击一下可以查看相关帮助信息,有利于你使用此软件。
本例电子邮件接收程序也采取了VisualC++语言与JMail组件相结合的方法,实现从电子邮件服务器上接收邮件。
用户在“邮件服务器’POP3’”所对应的编辑框中输入收件人的
E-mail所在的POP3服务器,在“帐号”所对应的编辑中输入邮箱的帐号,在“口令”所对应的编辑框中输入打开邮箱的密码,单击“收取”按钮,便可完成电子邮件的收取。
若用户的信箱中存在着邮件,程序将把所有邮件罗列出来,单击任何一封邮件的标题,均可查看邮件的正文;若连接邮件失败,程序将给出失败的相关信息。
同样有一个“关于”按钮,单击一下可以查看相关帮助信息。
2.电子邮件系统的总体设计
2.1系统模块结构
电子子邮件客户端主要由以下两个模块构成:
发送邮件模块、收取邮件模块、。
其功能模块如图2.1所示:
图2.1电子有功能模块图
1)发送邮件模块:
发送邮件,发送附件,查看相关帮助信息
2)接收邮件模块:
接收邮件,查看相关帮助信息
2.2系统用例图
用例是一个简单的声明,体现为文字或图表形式,描述系统的一个特定的目的或结果,以及是谁希望得到结果.用例图可以说成是对于一个软件在规划阶段产生的技术性需求和功能性需求,利用某种建模工具来实现出来的一个图形化的介绍。
通过对发送与接收电子邮件功能模块的分析,建立发送与接收电子邮件用例图如图2.2所示:
.
图2.2发送与收取电子邮件
3.协议的研究与分析
3.1SMTP协议简介及通讯模型
3.1.1SMTP协议简介
SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。
SMTP协议的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
SMTP协议通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:
首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。
发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。
可大致用下面的图3.1来表示:
图3.1SMTP通信模型
3.2POP3协议简介及工作原理
3.2.1POP3协议简介
邮局协议3(POP3)是检索电子邮件的标准协议。
POP3协议控制POP3电子邮件客户端和存储电子邮件的服务器之间的连接。
POP3服务使用POP3协议将电子邮件从邮件服务器检索到POP3电子邮件客户端。
POP3协议针对电子邮件服务器与电子邮件客户端之间的连接时具有三种处理状态:
身分验证状态、事务处理状态和更新状态。
在身份验证状态下,连接到服务器的POP3电子邮件客户端必须先接受身份验证,然后用户才能检索电子邮件。
如果电子邮件客户端提供的用户名和密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态。
如果不匹配,用户会收到错误消息,不允许连接和检索电子邮件。
为防止对邮件存储区的破坏,客户端通过身份验证后,POP3服务会锁定用户的邮箱。
用户通过身份验证后,由于邮箱已被锁定,除非该连接被终止,否则不能下载提交到邮箱的新电子邮件。
同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。
在事务处理状态下,客户端发送POP3命令,同时服务器会根据POP3协议接收命令并做出响应。
如果服务器接收的任一客户端请求不符合POP3协议,就会被忽略,并返回错误消息。
更新状态关闭客户端与服务器端之间的连接。
这是客户端发送的最后命令。
连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变化情况。
例如,除非用户的电子邮件客户端配置成执行其他操作,否则在用户成功检索电子邮件后,已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。
3.2.2POP工作原理
POP3(PostOfficeProtocol3)是适用于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.2POP3工作流程图
4.本系统使用组件的介绍
一般情况下,在VisualC++中,电子邮件程序的编写是利用Windows自带的MAPI以及相关的通信协议SMTP/POP3等来实现的。
但是要利用MAPI和通信协议实现一个功能强大的电子邮件管理程序,需要有很强的相关专业知识。
随着现代软件业的发展,软件厂商提供了方便、简易、与服务器无关且稳固的电子邮件处理组件,使我们可以在程序开发语言中调用这些组件,利用很简单的语言实现功能强大的程序。
JMail组件便是一个很好的电子邮件程序开发第三方组件。
JMail组件中包含有许多实现电子邮件处理的属性和方法。
只需要在VisualC++代码中创建一个JMail组件对象,调用其中的某些功能,就能很快完成程序的开发。
JMail常用的基本属性和方法如表4.1所示。
JMail常用发送与接收信件的基本属性和方法
方法和属性
功能
Body
邮件内容
Charset
字符集,默认为“US-ASCII”
Sendname
发送人姓名
Sender
发送人邮箱地址
Serveraddress
SMTP服务器地址,可指定多个,用分号分开,并可指定端口;为空白时,JMail会尝试解决远程邮件服务器,然后直接发送过去即可
Subject
标题
Priority
优先级(1:
高优先级3:
普通有限级别5:
低优先级)
AddAttachment(“filename”,[ContentType])
添加文件附件
AddCustomAttachment(“filemane”,data)
添加自定义附件
AddURLAttachment
(“bstrURL”,”bstrAttachAS”,[bstrAuth])
下载并添加一个来自bstrURL的附件,BstrAttachAS指定收到信件的文件名
AddRecipient(“Email-Address”)
增加一个收件人
AddRecipientEX(“Email-Address”,“name”)
增加一个带名字的收件人
AppendBodyFromFile(“Filename”)
将一个追加到正文后
AppendText(Text”)
追加信的正文内容
Execute()方法
执行发送
Close()发送
强制JMail关闭缓冲与邮件服务器的连接
Date
信件发送日期
MailServer
邮箱所在的服务器
Subject
标题
Timeout
连接服务器的超时限制
Connect()方法
连接服务器,需要参数:
帐号、口令、服务器地址、端口
5.本系统的实现
5.1对话框工程的创建
本次设计中,主要用到对话框资源。
对话框(Dialog)是实现应用程序人机交互的重要组成部分。
对话框实际上也是一个窗口,它不但可以实现数据流的输入和输出,而且也可以移动和关闭对话框,甚至还可以进行图形的绘制和操作。
要在应用程序中操作对话框资源,首先需要创建它。
在VisualC++6.0集成开发环境中,对话框资源的创建和使用流程如图5.1所示。
a.创建工程MailServer.
首先,依据建立MFC应用程序的方法,利用MFCAppWizard(exe)建立一个名为MailServer的工程。
设置应用程序类型为DialogBased模式。
b.创建对话框资源
单击ResourceView面板,选择Dialog选项,添加一个新的对话框,命名为IDD_MAILSERVER_DIALOG,该对话框隶属于类CMailServerDlg.修改对话框的Caption属性为MailServer.向新对话框中添加新的控件,各控件属性如表5.1所示。
表5.1对话框IDD_MAILSERVER_DIALOG的控件
资源标识
类型
相关属性及功能说明
IDC_EDIT_MAILSERVER
默认
邮件服务器
IDC_EDIT_RECIPIENTS
默认
收件人邮箱
IDC_EDIT_SENDER
默认
发件人邮箱
IDC_EDIT_SUBJECT
默认
主题
IDC_EDIT_BODY
Multiline
正文
IDCANCEL
默认
退出发送邮件程序
IDOK
默认
发送邮件
c.创建工程MailRecieve
首先,依据建立MFC应用程序的方法,利用MFCAppWizard(exe)建立一个名为MailRecieve的工程。
设置应用程序类型为DialogBased模式。
d.创建对话框资源
单击ResourceView面板,选择Dialog选项,添加一个新的对话框,命名为IDD_MAILRECIEVE_DIALOG,该对话框隶属于类CMailRecieveDlg.修改对话框的Caption属性为MailRecieve.向新对话框中添加新的控件,各控件属性如表5.2所示。
表5.2对话框IDD_MAILRECIEVE_DIALOG的控件
资源标识
类型
相关属性及功能说明
IDC_EDIT_MAILSERVER
默认
邮件POP3服务器
IDC_EDIT_MUSERID
默认
邮箱帐号
IDC_EDIT_PPASSWORD
单击Password复选框
邮箱口令
IDC_EDIT_MESSAGES
Report
邮件列表
IDC_EDIT_BODY
Multiline
正文
IDCANCEL
默认
退出收取邮件程序
IDOK
默认
收取邮件
图5.1对话框资源的创建与使用流程
5.2各模块的具体设计
5.2.1发送邮件模块详细设计与实现
(1)往头文件StdAfx.h中添加JMail对象的声明,这样才能在整个程序中引用JMail对象。
代码如下:
(注意:
使用JMail4.3版本)
#import“…\jmail.dll”//显示指定JMail动态链接库
usingnamespacejmail;//定义程序中JMail对象的名称
(2)头文件MailServer.h,利用ClassWizard类向导添加退出应用程序的函数ExitInstance()。
源代码如下:
//Overrides
//{{AFX_VIRTUAL(MailServerApp)
Public:
//应用程序的初始化
virtualBOOLInitInstance();
//退出应用程序
virtualintExitInstance();
//}}AFX_VIRTUAL
(3)源文件MailServer.cpp,类CMailServerApp的实现文件
1)由于程序中引用了JMail组件,因此必须在InitInstance()函数中添加如下代码,进行应用程序的初始化。
//添加初始化函数
BOOLCMailServerApp:
:
InitInstance()
{
AfxEnableControlContainer();
:
:
CoInitialize(NULL);
#ifdef_AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
……
}
2)应用程序时,在ExitInstance()函数中添加释放各变量的代码。
//应用程序退出
intCMailServerApp:
:
ExitInstance()
{
returnCWinApp:
:
ExitInstance();
:
:
CoUninitialize();
}
(4)MailServerDlg.h头文件,CMailServerDlg类的接口。
1)在头文件MaiServer.Dlg中,添加对话框IDD_MAILSERVER_DIALOG内各控件所对应的控件变量。
右击工作区中任一源文件,在弹出的菜单中选择ClassWizard选项,选择ClassWizard对话框内的MemberVariables页面,为CMailServerDlg类添加控件变量。
各控件及其对应的变量如表5.3所示。
表5.3对话框IDD_MAILSERVER_DIALOG的控件及控件变量
控件
控件变量
IDC_EDIT_MAILSERVER
m_strmailserver
IDC_EDIT_RECIPIENTS
m_strrecipients
IDC_EDIT_SENDER
m_strsender
IDC_EDIT_SUBJECT
m_strsubject
IDC_EDIT_BODY
m_strbody
2)利用CLassWizard添加IDOK控件的ON_BN_CLICKED事件函数,代码如下:
Protected:
//{{AFX_MSG(CMailServerDlg)
……
Afx_msgvoidOnsend();
//}}AFX_MSG
……
};
3)源文件MailServerDlg.cpp,类CMailServerDlg的实现文件。
打开MailServerDlg.cpp文件,添加发送邮件函数OnSend()代码如下:
//发送邮件程序
voidCMailServerDlg:
:
OnSend()
{
UpdateData();
//获取Edit控件中的字符串
……
//判断Edit控件中的字符串是否有效
…
//发送邮件过程
try
{
//创建一个JMail对象,这样便可以利用其内容封装的基本属性和方法
jmail:
:
IMessagePtrpMessage("JMail.Message");
//发件人邮箱
pMessage->From=(LPCTSTR)m_strsender;
//发件人姓名
pMessage->FromName="我的名字";
//添加收件人
pMessage->AddRecipient((LPCTSTR)m_strrecipients,"","");
//优先级设置,1~5逐次降低,3为中级
pMessage->Priority=3;
//编码方式设置,默认是iso-8859-1
pMessage->Charset="GB2312";
//主题
pMessage->Subject=(LPCTSTR)m_strsubject;
//正文
pMessage->Body=(LPCTSTR)m_strbody;
//附件
……
}
4)附件发送的实现;
1.首先在CMailServerDld类中定义几个对象。
public:
CStringstr;
CStringtr;
BOOLstrbool;
_bstr_tbstr;
2.加载文件:
voidCMailServerDlg:
:
OnBtAddfile()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
CFileDialogcg(TRUE);
if(cg.DoModal()==IDOK)strbool=true;
elsestrbool=false;
cg.DoModal();
str=cg.GetPathName();
MessageBox(str);
}
3.发送附件:
bstr=str.AllocSysString();//CString类型转换成_bstr_t类型
if(strbool==true)//判断有没有打开附件
{
_bstr_tbstrCID=pMessage->AddAttachment(bstr,VARIANT_TRUE,"");
//开始发送(带附件)
pMessage->Send((LPCTSTR)m_strmailserver,VARIANT_FALSE);
pMessage.Release();
AfxMessageBox("发送成功(带附件)!
");
}
else
{
//开始发送(不带附件)
pMessage->Send((LPCTSTR)m_strmailserver,VARIANT_FALSE);
pMessage.Release();
AfxMessageBox("发送成功(不带附件)!
");
}
5.2.1接收邮件模块详细设计与实现:
(1)向头文件StdAfx.h中添加JMail对象的声明,这样才能在整个程序中引用JMail对象,代码如下:
#import“..\jmail.dll”//显示指定JMail动态链接库
usingnamespacejmail;
(2)头文件MailServer.h,利用ClassWizad类向导添加退出应用程序的函数ExitInstance(),源代码如下:
//Overrides
//{{AFX_VTRTUAL(CMailRecieveApp)
public:
//应用程序的初始化
virtualBOOLInitInstance();
//退出应用程序
virtualintExitInstance();
//}}AFX_VIRTUAL
(3)源文件MailRecieve.cpp,类CMailRecieve.App的实现文件。
1)由于程序中引用了JMail组件,因此必须在InitInstance()函数中添加如下代码,进行应用程序的初始化。
//添加初始化函数
BOOLCMailRecieveApp:
:
InitInstance()
{
AfxEnableControlContainer();
:
:
CoInitialize(NULL);
#ifdef_AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
……
}
2)应用程序时,在ExitInstance()函数中添加释放各变量的代码:
//应用程序退出
intCMailReciev
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子邮件 发送 接收 程序设计