Winsock POP3教程(二)

來源:互聯網
上載者:User

擷取郵件

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 chenrui@applevb.com" & vbCrLf
    Winsock1.SendData "PASS xxxxxx" & 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

    在下面的教程中,將介紹如何?其它的協議。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.