"); //-->
图 1 SMTP 通讯模型示意图
1.2 POP3协议
POP3(Post Office Protocol Version 3)是整个电子邮件系统的基本协议之一。POP3适用于C/S结构的脱机模型的电子邮件协议。 初始时,服务器通过侦听TCP端口110开始POP3服务,当客户主机需要使用服务时,它将与服务器主机建立TCP连接。当连接建立后,POP3发送确认消息,客户和POP3服务器相互(分别)交换命令和响应。这一过程一直要持续到连接终止。
2 系统设计
该邮件系统由两个客户端程序组成,SMTP MAILER实现邮件和附件的发送,POP3 MAIL CHECKER用于登陆邮件服务器接受原始的邮件信息。
2.1 邮件发送端设计与实现
2.1.1发送端工作流程
下图是邮件发送流程图
2.1.2具体实现
发送邮件的功能主要由eMbedded Visual Basic下的WINSOCK控件实现WINSOCK即Windows Socket,是微软公司对Socket编程接口的集成。WINSOCK使用IP协议,同时支持TCP与UDP协议,在收发邮件这类基本网络数据通信的前提下,WINSOCK控件是最好的选择。
以A―H表示邮件发送的各部分设计:
A 在这个邮件程序中,首先要连接SMTP的邮件服务因此在cmdSend_Click()事件中最先实施的是Wsock.RemoteHost = ServerIp连接设定的服务器主机
Wsock.RemotePort = ServerPort 设定默认的端口。
B 然后开始构造邮件格式,定义字符串m_Date为发送日期,字符串mData为邮件头。语句m_Date = FormatDateTime(Date, [vbShortDate]) & ", " & FormatDateTime(Date, [vbLongDate]) & " " & FormatDateTime(Time, [vbLongTime]) & "" & " -0600" 定义了邮件的发送日期。
构造邮件标题 mData = "From:" & Chr(32) & strSendName & vbCrLf & _
"Date:" & Chr(32) & m_Date & vbCrLf & _
"X-Mailer: Harold Smtp Mailer V1.0" & vbCrLf & _
"To:" & Chr(32) & strReceiveName & vbCrLf & _
"Subject:" & Chr(32) & strSubject & vbCrLf
这个典型的邮件标题包含了:发件人,发件日期,收件人,主题以及发送邮件的程序名称。
C 当邮件程序连上服务器后,进如下一步打开邮件对话,利用WINSOCK控件发送对话信息:Wsock.SendData "HELO" & " " & Wsock.LocalHostName & vbCrLf
如果SMTP服务器没有返回“250” 应答码,则提示“Unable to establish transaction”.
D 由于现在的邮件服务器多采用ESMTP协议,因此需要客户端程序发送用户名与密码等认证信息,故在打开对话过后便进入“Authentication“过程,:
Wsock.SendData "AUTH LOGIN" & vbCrLf
If Not WaitForResponse("334", 10) Then
txtMsg.Text = "Unable to Connect with ESMTP server......"
Wsock.SendData Encode(User) & vbCrLf
Wsock.SendData Encode(Pass) & vbCrLf
在这里调用了自编的Encode函数并发送了经过BASE64编码的用户名与密码信息。
E 接着是发送发送方与接受方的地址:
Wsock.SendData "MAIL FROM:" & " " & strFromMail & vbCrLf ‘发送方
Wsock.SendData "RCPT TO:" & " " & strToMail & vbCrLf ‘接受方
F 下一步是发送消息体(针对不含附件的RFC822邮件):
Wsock.SendData "DATA" & vbCrLf ‘发送消息体
Wsock.SendData mData & vbCrLf ‘发送邮件标题
Wsock.SendData strContent & vbCrLf ‘发送正文
Wsock.SendData "." & vbCrLf ‘发送结束符
G 在发送邮件时做了附件的判断:
If Combo1.List > 0 Then 如果附件列表非空则转入MIME邮件的构造。MIME邮件的标题部分与RFC822相同,但要扩充一些内容
Wsock.SendData "MIME-Version:1.0" & vbCrLf
Wsock.SendData "Content-Type:multipart/mixed;" & vbCrLf
Wsock.SendData " boundary = Unique-Boundary" & vbCrLf & vbCrLf
Wsock.SendData "[ Random garbage here ]" & vbCrLf & vbCrLf
Wsock.SendData vbCrLf & "--Unique-Boundary" & vbCrLf
Wsock.SendData "Content-type: text/plain;charset=US-ASCII" & vbCrLf & vbCrLf
Wsock.SendData strContent & vbCrLf & vbCrLf
Wsock.SendData "--Unique=Boundary" & vbCrLf
Wsock.SendData "Content-Type: multipart/parallel;boundary = Unique-Boundary-2" & vbCrLf & vbCrLf
Wsock.SendData "--Unique=Boundary -2" & vbCrLf
Wsock.SendData "Content-Type: application/octest-stream;" & vbCrLf
Wsock.SendData "name =" & strAttachname & vbCrLf
Wsock.SendData "Content-Transfer-Encoding:base64" & vbCrLf
Wsock.SendData "Content-Disposition:inline;" & vbCrLf
这里附件也通过编码加入了邮件中。
H 最后结束邮件对话,返回信息:
Wsock.SendData "QUIT" & vbCrLf
txtMsg.Text = txtMsg.Text & "Mail send success!"
2.2 邮件接受端的设计与实现
2.2.1 接收端工作流程
图3 接收端工作流程
2.2.2 功能实现
POP3的通信与SMTP一样,也可以通过Winsock来实现。该POP3邮件程序的过程如同POP3对话一样。POP3服务器的应答要比SMTP简单许多,其操作的应答状态码只有两个“+OK”表示成功,“+ERR”表示失败。具体细节不再赘述。
3 软件模块功能测试
为了评估电子邮件系统的两个客户端程序的实际可用性,必须对其系统的各个模块进行测试。本测试所采用的是微软开发的POCKET PC2002 for Windows SDK程序包。
3.1 邮件发送客户端的测试
为了测试邮件发送系统的功效,可在已配置网络的模拟器上载入邮件发送程序,使其工作在虚拟机的操作系统中。
配置好SMTP服务器资料与ESMTP所需的认证信息后,发送一封简单的RFC822电子邮件到对方信箱中,成功发送。同样的方式,测试发送MIME邮件,得到如下测试结果:
图4 发送端测试结果
3.2 邮件接收客户端的测试
同邮件发送客户端一样,采用同样的网络设置,载入程序,登入网络。先选择POP3的邮件服务器地址,设定用户信息与密码,确认后获得基础的认证,并传回邮箱中信件的数量与大小统计。经测试收到了预期的效果。
以上两个程序的测试都是在网络环境下进行的,如果网络连接不正常或其他原因导致邮件的收发不成功,在程序设计的出错处理中已经有所考虑。
4 结语
与网络结合已成为所有信息产品的发展趋势,随着PDA等嵌入式系统的日益普及以及无线互联技术(802.11B)的发展,利用PDA实现掌上电脑与台式机间相互传递电子邮件,已经成为一种结合时尚和便利于一身的通信手段。作者设计实现的基于Windows CE的嵌入式电子邮件系统,为实现移动设备之间邮件传输作了良好的尝试。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。