第28卷 第8期信 息 技 术VOL.28 NO.8
2004年8月INFORMATIONTECHNOLOGYAug.2004
电子邮件SMTP/POP3收发协议的研究与实现
付祝财1,杨莘元2,王 阳3
(1.黑龙江省通信传输局,哈尔滨150006;2.哈尔滨工程大学信息与通信工程学院,哈尔滨150001;
3.中国航空无线电电子研究所,)
摘 要:分析了SMTP协议的通信模型,POP3协议的基本原理、VC++6.0的编程实现了接收关键词:邮件协议3;VC;电子邮件中图分类号:TN915104 文献标识码:A 文章编号:1009-2552(2004)08-0057-03
TheimplementationofsendingandreceivingE-mail
protocolbasedonE-post
FUZhu2cai1,YANGShen2yuan2,WANGYang3
(1.DataTransferBureauofHeilongjiangProvince,Harbin150006,China;2.HarbinEngineeringUniversity.CollegeofCommunication,Harbin150001,China;
3.RadioElectronicInstituteofChinaAviation,Shanghai200233,China)
Abstract:ThisarticleanalyzesthecommunicationmodelofSMTPanddescribesitscommandsandresponses.Thisarticlealsodiscussesthetheory,runningprocedureandstandardcommandsofPOP3protocol.Basedonthis,writ2ersaccomplishsendingandreceivingE-mailcombiningwithVC++6.0andprospectthefuturebriefly.Keywords:SMTP;POP3;VC;E-mail
0 引言
邮件是因特网上使用的最多的和最受欢迎的一
种应用。收发邮件时将邮件发送到ISP的邮件服务器,并放在其中的收件人邮箱中,收信人可随时上网到ISP的邮件服务器进行读取。电子邮件不仅使用方便,而且还具有传递迅速和费用低廉的特点。
VC++是一个优秀的网络开发工具,它提供了强大的网络编程功能,封装了诸如SMTP协议、POP3协议等,从而可以使VC程序员容易地用VC++的集成开发环境开发出关于网络的应用程序。
1 SMTP协议
111 概述
1982年制定出了ARPANET上的电子邮件标准:简单邮件传送协议SMTP(SimpleMailTransferProtocol)。SMTP被用来在因特网上传递电子邮件,
文件RFC821规定了该协议的所有细节。SMTP是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP在两种情况下工作:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是个请求/响应协议,它监听25号端口,用于接收用
收稿日期:2004-02-19
作者简介:付祝财(1959-),男,黑龙江省通信传输局,从事技术管理
工作。
—57
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
—
户的Mail请求,并与远端Mail服务器建立SMTP连接。112 SMTP协议通讯模型
SMTP协议主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。RFC821中阐述的SMTP协议的通信模型并不复杂,首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。RFC821中描述的通信模型如图1所示
。
表1 SMTP命令
SMTP命令HELLO
MAILFROM:
命 令 说 明
识别发送方到接收SMTP的一个HELLO命令
为发送者地址。此命令告诉
接收方一个新邮件发送的开始,并对所有的状
RCPTTO:DATARESTNOOP态和缓冲区进行初始化。此命令开始一个邮
件传输处理,最终完成将邮件数据传送到一个或多个邮箱中
标识各个邮件接收者的地址接收SMTP将把其后的行为看作邮件数据去处理,以.标识数据的结尾退出/OK应答。(用于测试)OK应答并关闭传输,由于安全因素,服验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用
图1 RFC821中描述的通信模型
113 SMTP协议的命令和应答
SMTP通常有两种工作模式:发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接到用户的
邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向DNS查询远端邮件服务器纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;
如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。SMTP协议共包含10个SMTP命令,如表1所示。
212 工作方式
POP3支持离线工作方式和在线工作方式。在离线工作方式下,用户收发邮件时,首先通过POP3客户程序登录到支持POP3协议的邮件服务器,然后发送邮件及附件;接着,邮件服务器将为该用户收存的邮件传送给POP3客户程序,并将这些邮件从服务器上删除;最后,邮件服务器将用户提交的发送邮件,转发到运行SMTP协议的计算机中,通过它实现邮件的最终发送。在为用户从邮件服务器收取邮件时,POP3
2 POP3协议
211 概述
POP(PostOfficeProtocol)即邮局协议,用于电子
邮件的接收,它使用TCP的110端口,现在常用的是第三版,所以简称为POP3。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3与SMTP协议相结合,是目前最常用的电子邮件服务协议。—58
—
是以该用户当前存储在服务器上全部邮件为对象进行操作的,并一次性将它们下载到用户端计算机中。一旦客户的邮件下载完毕,邮件服务器对这些邮件的暂存托管即告完成。使用POP3,用户不能对他们贮存在邮件服务器上的邮件进行部分传输。离线工作方式适合那些从固定计算机上收发邮件的用户使用。
当使用POP3在线工作方式收发邮件时,用户在所用的计算机与邮件服务器保持连接的状态下读取邮件。用户的邮件保留在邮件服务器上。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。213 POP3标准命令
由于POP3的通信模型比较简单,即接受方从邮件的服务器读接收下来即可,下面重点列表说明POP3的标准命令,POP3就是通过这这些命令来完成接收邮件的。如表2所示。
3 VC中实现收发电子邮件
VC中提供了三个免费的类:CSmtp,Cpop3和CmailMessage。分别封装了SMTP协议、POP3协议来发送和接收邮件。发送邮件时先填充CmailMessage结构,然后调用CSmtp类的Connect函数连接服务
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
器,接着调用CSmtp类的SendMessage函数发送,最后调用CSmtp类的DisConnect函数关闭连接。
表2 POP3命令
POP3命令USER
PASSAPOPQUITNOOPSTATLISTRETRTOPDELERSETif(!pop3.Connect())//连接POP3服务器{AfxMessageBox(pop3.GetLastError());return;}CMailMessagemsg;//收取信件if(!pop3.GetMessage(1,&msg))
{AfxMessageBox(pop3.GetLastError());return;}//显示信件,其中mbody,msubject,mfrom,mto
描 述
标识用户进行验证
发送密码进行验证转换验证机制中指会话空操作
提供邮箱大小信息提供邮件大小信息从服务器取出邮件取出信头和邮件的前N行
标记邮件被删除复位POP会话为VC对话框中对应控件变量
mbody=msg.msBody;msubject=msg.msSubject;m=msg.msFrom;mto=“”;
for(inta=0;a
mTo.TrimRight();
if(!pop3.Disconnect())//断开连接
{AfxMessageBox(pop3.GetLastError());return;}AfxMessageBox(}
T());“Successfullydisconnected”
UpdateData(FALSE);
接受邮件时调用CPop3类的Connect服务器,接着调用CPop3类的G,最后调用CPop3311 :
CSMTPsmtp(msmtp;//建立CSMTP对象,msmtp为SMTP服务器地址
CMailMessagemsg;//新建CMailMessage对象,并初始化msg.msFrom=mfrom;//m为发信人地址msg.AddMultipleRecipients(mto);//mto为收信人地址msg.msSubject=msubject;//msubject为标题msg.msBody=mBody;//mbody为信件内容if(!smtp.Connect())//连接SMTP服务器{AfxMessageBox(smtp.GetLastError());return;}if(!smtp.SendMessage(&msg))//发信{AfxMessageBox(smtp.GetLastError());return;}if(!smtp.Disconnect())//断开连接
{AfxMessageBox(smtp.GetLastError());return;}AfxMessageBox(}
T(
));“MessageSentSuccessfully”
4 结束语
利用VC这一开发工具,按照流程就可以比较
简单的开发出一些网络应用程序。实际上VC已经封装了大部分的细节问题,只要按照步骤完成一些参数的设置工作即可,当然上面的程序代码相当的简单,只是实现了基本的功能,还可以在多个方面对它进行完善。在使用VC开发网络应用程序中,只要结合实际情况,不用太复杂的编码就可以完成一些非常实用的功能。相信随着网络技术和计算机编程技术的发展,VC和电子邮件的应用必将越来越广泛,从而为用户提供更便捷的服务。参考文献:
[1] 谢希人1计算机网络[M].大连理工大学出版社,20021[2] 肖宏伟1VisualC++开答疑[M].人民邮电出版社,20031[3] 候俊杰.深入浅出MFC[M].华中科技大学出版社,2002.
责任编辑:张 棣
312 接收电子邮件的代码
CPOP3pop3(mpop3);//新建CPOP3对象,mpop3为POP3服务器地址
pop3.SetUserProperties(mUser,mPassword);//用户名
和口令
(上接第36页)发展
,人们对信息资源的收集、共享和检
参考文献:
[1] 谢希仁.计算机网络[M].北京:电子工业出版社,1999.
[2] 童纯清.Windows2000Server配置及管理[M].国防科技大学出
版社,2000.[3] 徐英.Windows2000Server中文版高级使用指南[M].北京机械
工业出版社,2000.[4] 集群的负载均衡技术[J/OL].http://www.chinaitlab.com/www/
news/articleshow.asp?id=2452[5] 网络负载均衡技术概况[J/OL].http://www.nethao.com/softx2
ue/8/[1**********]643.html[6] WIN2K集群服务解决方案[J/OL].http://www.langchao.com/
foreground/server/solution-1.htm[7] 集群技术及其教育科研应用[J/OL].http://www.ecnu.edu.cn/
depart/jiaoxin/article/page9.htm责任编辑:姚彦茹
索提出了更高要求。电脑、通信和视频网络的信息
整合趋势、网上商务的方兴未艾以及各机构的办公管理自动化,都给网络带宽、服务器管理、服务质量提出了更高的要求。网络负载均衡是一种策略,引入负载均衡和冗余机制,是让网络上多台服务器或多条链路共同承担一些繁重的计算或I/O任务,从而以较低成本,消除网络瓶颈,提高网络的灵活性和可靠性。
—59
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
—
第28卷 第8期信 息 技 术VOL.28 NO.8
2004年8月INFORMATIONTECHNOLOGYAug.2004
电子邮件SMTP/POP3收发协议的研究与实现
付祝财1,杨莘元2,王 阳3
(1.黑龙江省通信传输局,哈尔滨150006;2.哈尔滨工程大学信息与通信工程学院,哈尔滨150001;
3.中国航空无线电电子研究所,)
摘 要:分析了SMTP协议的通信模型,POP3协议的基本原理、VC++6.0的编程实现了接收关键词:邮件协议3;VC;电子邮件中图分类号:TN915104 文献标识码:A 文章编号:1009-2552(2004)08-0057-03
TheimplementationofsendingandreceivingE-mail
protocolbasedonE-post
FUZhu2cai1,YANGShen2yuan2,WANGYang3
(1.DataTransferBureauofHeilongjiangProvince,Harbin150006,China;2.HarbinEngineeringUniversity.CollegeofCommunication,Harbin150001,China;
3.RadioElectronicInstituteofChinaAviation,Shanghai200233,China)
Abstract:ThisarticleanalyzesthecommunicationmodelofSMTPanddescribesitscommandsandresponses.Thisarticlealsodiscussesthetheory,runningprocedureandstandardcommandsofPOP3protocol.Basedonthis,writ2ersaccomplishsendingandreceivingE-mailcombiningwithVC++6.0andprospectthefuturebriefly.Keywords:SMTP;POP3;VC;E-mail
0 引言
邮件是因特网上使用的最多的和最受欢迎的一
种应用。收发邮件时将邮件发送到ISP的邮件服务器,并放在其中的收件人邮箱中,收信人可随时上网到ISP的邮件服务器进行读取。电子邮件不仅使用方便,而且还具有传递迅速和费用低廉的特点。
VC++是一个优秀的网络开发工具,它提供了强大的网络编程功能,封装了诸如SMTP协议、POP3协议等,从而可以使VC程序员容易地用VC++的集成开发环境开发出关于网络的应用程序。
1 SMTP协议
111 概述
1982年制定出了ARPANET上的电子邮件标准:简单邮件传送协议SMTP(SimpleMailTransferProtocol)。SMTP被用来在因特网上传递电子邮件,
文件RFC821规定了该协议的所有细节。SMTP是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。SMTP在两种情况下工作:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是个请求/响应协议,它监听25号端口,用于接收用
收稿日期:2004-02-19
作者简介:付祝财(1959-),男,黑龙江省通信传输局,从事技术管理
工作。
—57
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
—
户的Mail请求,并与远端Mail服务器建立SMTP连接。112 SMTP协议通讯模型
SMTP协议主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。RFC821中阐述的SMTP协议的通信模型并不复杂,首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。RFC821中描述的通信模型如图1所示
。
表1 SMTP命令
SMTP命令HELLO
MAILFROM:
命 令 说 明
识别发送方到接收SMTP的一个HELLO命令
为发送者地址。此命令告诉
接收方一个新邮件发送的开始,并对所有的状
RCPTTO:DATARESTNOOP态和缓冲区进行初始化。此命令开始一个邮
件传输处理,最终完成将邮件数据传送到一个或多个邮箱中
标识各个邮件接收者的地址接收SMTP将把其后的行为看作邮件数据去处理,以.标识数据的结尾退出/OK应答。(用于测试)OK应答并关闭传输,由于安全因素,服验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用
图1 RFC821中描述的通信模型
113 SMTP协议的命令和应答
SMTP通常有两种工作模式:发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接到用户的
邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向DNS查询远端邮件服务器纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;
如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。SMTP协议共包含10个SMTP命令,如表1所示。
212 工作方式
POP3支持离线工作方式和在线工作方式。在离线工作方式下,用户收发邮件时,首先通过POP3客户程序登录到支持POP3协议的邮件服务器,然后发送邮件及附件;接着,邮件服务器将为该用户收存的邮件传送给POP3客户程序,并将这些邮件从服务器上删除;最后,邮件服务器将用户提交的发送邮件,转发到运行SMTP协议的计算机中,通过它实现邮件的最终发送。在为用户从邮件服务器收取邮件时,POP3
2 POP3协议
211 概述
POP(PostOfficeProtocol)即邮局协议,用于电子
邮件的接收,它使用TCP的110端口,现在常用的是第三版,所以简称为POP3。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3与SMTP协议相结合,是目前最常用的电子邮件服务协议。—58
—
是以该用户当前存储在服务器上全部邮件为对象进行操作的,并一次性将它们下载到用户端计算机中。一旦客户的邮件下载完毕,邮件服务器对这些邮件的暂存托管即告完成。使用POP3,用户不能对他们贮存在邮件服务器上的邮件进行部分传输。离线工作方式适合那些从固定计算机上收发邮件的用户使用。
当使用POP3在线工作方式收发邮件时,用户在所用的计算机与邮件服务器保持连接的状态下读取邮件。用户的邮件保留在邮件服务器上。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。213 POP3标准命令
由于POP3的通信模型比较简单,即接受方从邮件的服务器读接收下来即可,下面重点列表说明POP3的标准命令,POP3就是通过这这些命令来完成接收邮件的。如表2所示。
3 VC中实现收发电子邮件
VC中提供了三个免费的类:CSmtp,Cpop3和CmailMessage。分别封装了SMTP协议、POP3协议来发送和接收邮件。发送邮件时先填充CmailMessage结构,然后调用CSmtp类的Connect函数连接服务
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
器,接着调用CSmtp类的SendMessage函数发送,最后调用CSmtp类的DisConnect函数关闭连接。
表2 POP3命令
POP3命令USER
PASSAPOPQUITNOOPSTATLISTRETRTOPDELERSETif(!pop3.Connect())//连接POP3服务器{AfxMessageBox(pop3.GetLastError());return;}CMailMessagemsg;//收取信件if(!pop3.GetMessage(1,&msg))
{AfxMessageBox(pop3.GetLastError());return;}//显示信件,其中mbody,msubject,mfrom,mto
描 述
标识用户进行验证
发送密码进行验证转换验证机制中指会话空操作
提供邮箱大小信息提供邮件大小信息从服务器取出邮件取出信头和邮件的前N行
标记邮件被删除复位POP会话为VC对话框中对应控件变量
mbody=msg.msBody;msubject=msg.msSubject;m=msg.msFrom;mto=“”;
for(inta=0;a
mTo.TrimRight();
if(!pop3.Disconnect())//断开连接
{AfxMessageBox(pop3.GetLastError());return;}AfxMessageBox(}
T());“Successfullydisconnected”
UpdateData(FALSE);
接受邮件时调用CPop3类的Connect服务器,接着调用CPop3类的G,最后调用CPop3311 :
CSMTPsmtp(msmtp;//建立CSMTP对象,msmtp为SMTP服务器地址
CMailMessagemsg;//新建CMailMessage对象,并初始化msg.msFrom=mfrom;//m为发信人地址msg.AddMultipleRecipients(mto);//mto为收信人地址msg.msSubject=msubject;//msubject为标题msg.msBody=mBody;//mbody为信件内容if(!smtp.Connect())//连接SMTP服务器{AfxMessageBox(smtp.GetLastError());return;}if(!smtp.SendMessage(&msg))//发信{AfxMessageBox(smtp.GetLastError());return;}if(!smtp.Disconnect())//断开连接
{AfxMessageBox(smtp.GetLastError());return;}AfxMessageBox(}
T(
));“MessageSentSuccessfully”
4 结束语
利用VC这一开发工具,按照流程就可以比较
简单的开发出一些网络应用程序。实际上VC已经封装了大部分的细节问题,只要按照步骤完成一些参数的设置工作即可,当然上面的程序代码相当的简单,只是实现了基本的功能,还可以在多个方面对它进行完善。在使用VC开发网络应用程序中,只要结合实际情况,不用太复杂的编码就可以完成一些非常实用的功能。相信随着网络技术和计算机编程技术的发展,VC和电子邮件的应用必将越来越广泛,从而为用户提供更便捷的服务。参考文献:
[1] 谢希人1计算机网络[M].大连理工大学出版社,20021[2] 肖宏伟1VisualC++开答疑[M].人民邮电出版社,20031[3] 候俊杰.深入浅出MFC[M].华中科技大学出版社,2002.
责任编辑:张 棣
312 接收电子邮件的代码
CPOP3pop3(mpop3);//新建CPOP3对象,mpop3为POP3服务器地址
pop3.SetUserProperties(mUser,mPassword);//用户名
和口令
(上接第36页)发展
,人们对信息资源的收集、共享和检
参考文献:
[1] 谢希仁.计算机网络[M].北京:电子工业出版社,1999.
[2] 童纯清.Windows2000Server配置及管理[M].国防科技大学出
版社,2000.[3] 徐英.Windows2000Server中文版高级使用指南[M].北京机械
工业出版社,2000.[4] 集群的负载均衡技术[J/OL].http://www.chinaitlab.com/www/
news/articleshow.asp?id=2452[5] 网络负载均衡技术概况[J/OL].http://www.nethao.com/softx2
ue/8/[1**********]643.html[6] WIN2K集群服务解决方案[J/OL].http://www.langchao.com/
foreground/server/solution-1.htm[7] 集群技术及其教育科研应用[J/OL].http://www.ecnu.edu.cn/
depart/jiaoxin/article/page9.htm责任编辑:姚彦茹
索提出了更高要求。电脑、通信和视频网络的信息
整合趋势、网上商务的方兴未艾以及各机构的办公管理自动化,都给网络带宽、服务器管理、服务质量提出了更高的要求。网络负载均衡是一种策略,引入负载均衡和冗余机制,是让网络上多台服务器或多条链路共同承担一些繁重的计算或I/O任务,从而以较低成本,消除网络瓶颈,提高网络的灵活性和可靠性。
—59
1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
—