Winsock POP3教程(二)

类别:.NET开发 点击:0 评论:0 推荐:
获取邮件


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



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

本文地址:http://com.8s8s.com/it/it40988.htm