了解POP3
POP3简介
POP3是Post Office Protocol - Version 3的简称,这个协议是目前绝大多数电子邮件程序使用的收邮件程序,通过该协议,电子邮件客户端程序可以登录到电子邮件服务器上接受电子邮件。POP3协议是一种脱机模型的协议,当客户端查询并下载电子邮件后,客户端就与服务器端断开连接,用户在客户端可以随意的删除、修改邮件的内容。
POP3的通信方式
初始时,邮件服务器通过侦听TCP端口110开始POP3服务。当客户程序需要使用服务时,它将与邮件服务器建立TCP连接。当连接建立后,客户端就可以与服务器端进行通信,POP3的客户端与服务器端的通信采用ASCII形式的命令行方式来实现,客户端向用户发送一个POP3命令(POP3命令是大小写不敏感的),POP3命令由一个命令和一些参数组成。所有命令以一个CRLF对结束。命令和参数由可打印的ASCII字符组成,它们之间由空格间隔。命令一般是三到四个字母,每个参数却可达40个字符长。邮件服务器端接收响应,也会向客户端发送一个ASCII格式的响应消息。
POP3响应由一个状态码和一个可能跟有附加信息的命令组成。所有响应也是由CRLF对结束。现在有两种状态码,"确定" ("+OK")和"失败" ("-ERR")(服务器返回的"+OK"或者"-ERR"必须是大写的)。
邮件服务器返回的相应可以是单行的或者多行的文本,对于多行文本,没一行都是以一个回车换行(CRLF)符作为结尾,如果返回的响应中包含了符号"CRLF.CRLF"(其中"."的ASCII码为46),那么说明服务器返回的响应已经结束。
在生命周期中,POP3会话有几个不同的状态。一旦TCP连接被打开,而且邮件服务器发送了确认信息,此过程就进入了“认证”(AUTHORIZATION)状态。在此状态中,客户必须向邮件服务器确认自己是其客户。一旦认证成功,邮件服务器就获取与客户邮件相关的资源,此时这一过程进入了“处理”(TRANSACTION)状态。在此状态中,客户提出服务请求,当客户发出QUIT命令时,此过程进入了“更新”(UPDATE)状态。在此状态中,邮件服务器释放在"操作"状态中取得的资源,并发送消息,终止连接。
作为一个脱机模型的协议,邮件服务器必须有一个自动断开连接的计时器,这个计时器最少不能少于10分钟。超过这个时限后,邮件服务器不会进入“更新”状态而是直接断开TCP连接,同时不会对服务器上的消息做修改,也不会向客户端发送任何响应消息。
POP3得简单范例
下面通过一个简单的范例来演示如何使用Winsock控件通过POP3协议来实现登录到邮件服务器然后退出。
创建一个新工程,在其中添加一个TextBox,将它的Name设置为txtMSG,将MultiLine属性设置为True,将这个文本框的尺寸摄制的尽可能大。然后添加四个CommandButton控件,将他们的Name分别设置为cmdConnect、cmdLoggin、cmdList、cmdQuit,它们的作用分别是连接、登录、邮件列表和退出邮件服务器。然后添加一个Winsock控件,将Protocol属性设置为0 - sckTCPProtocol,将RemoteHost属性设置位POP3服务器的地址,例如POP.163.com,将RemotePort设置为服务器的POP3服务端口,一般是110,将LocalPort设置为一个未使用的端口,例如410。
然后实现的代码如下:
Private Sub cmdConnect_Click()
'连接到邮件服务器
Winsock1.Connect
End Sub
Private Sub cmdList_Click()
'列出邮件服务器上的邮件
Winsock1.SendData "LIST" & vbCrLf
End Sub
Private Sub cmdLoggin_Click()
'登录到邮件服务器
Winsock1.SendData "USER xxxxx" & vbCrLf
Winsock1.SendData "PASS aaaaa" & vbCrLf
End Sub
Private Sub cmdQuit_Click()
'发送退出消息
Winsock1.SendData "QUIT" & vbCrLf
End Sub
Private Sub Winsock1_Close()
'关闭与服务器的连接
Winsock1.Close
End Sub
Private Sub Winsock1_Connect()
Debug.Print "connection "
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim s As String
'获取服务器的响应信息
s = Space(bytesTotal)
Winsock1.GetData s
txtMSG.Text = txtMSG.Text & "message: " & s
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal
HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'输出错误信息
Debug.Print Description
Debug.Print Number
End Sub
要运行上面的代码,需要将上面的代码的:
Winsock1.SendData "USER xxxxx" & vbCrLf
Winsock1.SendData "PASS aaaaa" & vbCrLf
中的xxxxx设置为登录POP3服务器的用户名,将aaaaa设置为登录POP3服务器的密码。
运行程序,点击cmdConnect连接到POP3服务器,点击cmdLoggin登录到邮件服务器,点击cmdList将服务器上面的邮件列出来,点击cmdQuit退出登录。如果POP3地址设置正确,用户名和密码正确,在txtMSG中应该列出如下的内容:
现在再看看上面的代码,在上面的代码中,点击cmdLoggin登录到邮件服务器,登录成功后邮件服务器会返回类似:+OK POP3 Welcome to quarkmail server version 1.2.1 这样的响应。这时的状态是“认证”状态,在这个状态下,客户端需要发送登录命令登录到邮件服务器,这里我们发送的是“USER”和“PASS”命令登录,登录成功后邮件服务器会返回 +OK 的成功响应,否则会返回 -ERR 的错误消息。
登录成功后,这时的状态是“处理”状态,这时就可以通过发送例如“LIST”等命令来对邮件服务器上的邮件进行处理。
在处理完邮件后,单击cmdQuit发送“QUIT”命令退出登录,在退出成功后,状态变为“更新”状态,同时邮件服务器会断开TCP连接,客户端得Winsock会接收到关闭连接的消息,所以需要在Winsock的Close事件中关闭客户端得TCP连接。
在POP3协议中,对于客户端发送的命令,无论是有效的还是无效的命令,邮件服务器都必须对其作出响应,在我们的程序中,我们只需要在Winsock的DataArrival事件中获得服务器的响应消息并且根据POP3协议的规定对消息进行处理就可以了解邮件服务器在跟我们“说什么”。至于发送到邮件服务器的命令的详细解释以及邮件服务器响应的消息的含义,教程将在以后逐步的向大家介绍。