|
楼主 |
发表于 2011-3-6 17:39
|
显示全部楼层
二、
获取邮件
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
[ 本帖最后由 HHAAMM 于 2011-3-6 21:29 编辑 ] |
|