擷取郵件
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
在下面的教程中,將介紹如何?其它的協議。