Winsock POP3教程(二)

获取邮件

LIST命令和RETR命令
LIST命令和RETR命令只能在“处理”状态下执行,就是说只有在用户登录以后才可以执行这两个命令。
LIST命令获得邮件服务器中的邮件列表。该命令的格式如下:

LIST [msg]

其中参数msg是可选的参数,该参数指定要列举的邮件的编号,该参数不能指定为一个已经标记为删除的邮件的编号。
如果没有指定参数而且命令调用成功,邮件服务器首先会返回服务器中的所有邮件列表,这个列表以一个+OK开头的字符串作为起始。对于

邮件服务器中的每一个邮件,邮件服务器都会返回一行字符串,为了便于分析,这行字符串应该由邮件编号 + 一个空格 + 邮件的尺寸 组成。

在邮件列表的结尾,邮件服务器会返回一个vbCRLF + "." + vbCRLF的字符串作为列表的结尾。例如在教程一中点击“邮件列表”按钮在文本框

中输出的字符串所示。

注意:不同的邮件服务器返回的内容可能有所不同,有些邮件服务器返回的信息会更多一些(例如在+OK后面返回总邮件数和邮件总尺寸等)。

但是标准的POP3协议所描述的返回内容只有上面这些,所以在开发过程中需要注意,不要把一些邮件服务器所返回的附加内容作为标准在你的

代码里面实现,这样的话可能在其他邮件服务器上面就通不过。

RETR命令获得邮件服务器中的邮件内容,该命令的格式如下:

RETR msg

其中参数msg是必选的参数,该参数指定要获得的邮件的编号,该参数不能指定为一个已经标记为删除的邮件的编号。
如果命令调用成功,邮件服务器会返回指定的邮件的内容,返回的内容头一行是+OK,然后是邮件内容,最后是一个vbCRLF + "." +

vbCRLF的字符的串作为结尾。

在Winsock编程中,对于LIST命令和RETR命令,服务器返回的内容是分多次返回的,所以会多次触发DataArrival事件,所以需要在程序中

设置命令状态,在发出LIST或者RETR命令后将程序的状态置于LIST或者RETR状态下,在这个状态下所有收到的内容都是服务器返回的响应的组

成部分,直到收到结束字符串vbCRLF + "." + vbCRLF。

下面是如何通过Winsock发送LIST命令和RETR命令获得邮件列表以及获取邮件内容,在教程一的窗体中再增加一个CommandButton按钮,

Name属性为:cmdRETR。

Enum enumPOPCommand
popUSER = 1
popPASS = 2
popQUIT = 3
popLIST = 4
popDELETE = 5
popRETR = 6
popNONE = 999
End Enum

Private m_Command As enumPOPCommand
Private m_MailLists As New Collection
Private m_Messages As String
Private m_MailMessage As String
Private m_MessageCout As Integer

Sub strListsToCollection(strLists As String, coll As Collection)
Dim s() As String
Dim i As Integer
Dim count As Integer

s = Split(strLists, vbCrLf)

'获得邮件列表和邮件数
For i = LBound(s) To UBound(s)
If (Trim(s(i)) <> "") And (Trim(s(i)) <> ".") Then
coll.Add Trim(s(i))
count = count + 1
End If
Next i

MsgBox "共" & count & "个邮件!"
End Sub

Private Sub cmdConnect_Click()
'连接到邮件服务器
Winsock1.Connect
End Sub

Private Sub cmdList_Click()
'列出邮件服务器上的邮件
Winsock1.SendData "LIST" & vbCrLf
'切换当前状态
m_Command = popLIST
End Sub

Private Sub cmdLoggin_Click()
'登录到邮件服务器
Winsock1.SendData "USER [email protected]" & vbCrLf
Winsock1.SendData "PASS eddi1" & vbCrLf
End Sub

Private Sub cmdQuit_Click()
'发送退出消息
m_Command = popQUIT
Winsock1.SendData "QUIT" & vbCrLf
End Sub

Private Sub cmdRETR_Click()
Dim i

'获得服务器上面的第二封邮件
m_Command = popRETR
m_MailMessage = ""
Winsock1.SendData "RETR 2" & vbCrLf
End Sub

Private Sub Winsock1_Close()
'关闭与服务器的连接
Winsock1.Close
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim s As String
Dim i As Integer

'获取服务器的响应信息
s = Space(bytesTotal)
Winsock1.GetData s
txtMSG.Text = txtMSG.Text & "message: " & s

Select Case m_Command
'邮件列表LIST状态
Case enumPOPCommand.popLIST
If Left$(s, 4) = "+OK " Then
m_Messages = ""
ElseIf Left$(s, 4) = "+ERR" Then
m_Command = popNONE
Else
m_Messages = m_Messages + s
If InStr(1, s, vbCrLf & "." & vbCrLf) > 0 Then
strListsToCollection m_Messages, m_MailLists
m_Command = popNONE
End If
End If

'获取邮件RETR状态
Case enumPOPCommand.popRETR
If Left$(s, 4) = "+OK " Then
m_MailMessage = ""
ElseIf Left$(s, 4) = "+ERR" Then
m_Command = popNONE
Else
m_MailMessage = m_MailMessage + s
If InStr(1, s, vbCrLf & "." & vbCrLf) > 0 Then
m_Command = popNONE
txtMSG = m_MailMessage
End If
End If
End Select
End Sub

在下面的教程中,将介绍如何实现其它的协议。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus