|
|
Winsock POP3教程(二) |
|
|
作者:未知 来源:月光软件站 加入时间:2005-6-5 月光软件站 |
获取邮件
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
在下面的教程中,将介绍如何实现其它的协议。

|
|
相关文章:相关软件: |
|