下面是Winsock的DataArrival事件中的代碼。該代碼的絕大部分是注釋以向你解釋程序所做的每一步。如果你覺得悶的話就跳過不看就是了。
PrivateSubWinsock1_DataArrival(ByValbytesTotalAsLong)
DimstrDataAsString
StaticintMessagesAsInteger'要下載的消息數(也就是郵件數)
StaticintCurrentMessageAsInteger'已下載的消息數
StaticstrBufferAsString'正在下載的消息的緩沖
將收到的數據存放在strData變量中
Winsock1.GetDatastrData
IfLeft$(strData,1)=" "Orm_State=POP3_RETRThen
'如果來自服務器的回應的第一個字符為加號
'表明服務器已收到你發出的命令並等待下一個命令
'如果服務器返回的字符串的第一個字符為減號,那我們在這裡就什麼也做不了。
'操作被轉到ELSE後面部分的代碼。
'當處於數據接收狀態時,來自服務器的字符串的第一個字符就可能不是加號或減號,所以要用到第二個條件
'm_State=POP3_RETR(正在接收消息的狀態)
SelectCasem_State
CasePOP3_Connect
'
'重置消息數
intMessages=0
'
'改變進程狀態
m_State=POP3_USER
'
'向服務器發出帶參數的USER命令
'參數是信箱名
'別忘了在命令的最後加上vbCrLf
Winsock1.SendData"USER"&txtUserName&vbCrLf
'這是本次事件的結束,下次開始跳過上一部分,而從下面開始執行
'CasePOP3_USER部分
CasePOP3_USER
'如果用戶名檢查通過就進行下一部分
'現在向服務器發送你的密碼
'改變進程的狀態
m_State=POP3_PASS
'
'向服務器發送PASS命令,以你的密碼為參數
Winsock1.SendData"PASS"&txtPassword&vbCrLf
CasePOP3_PASS
'
'如果服務器通過了你的身份驗證,我們就可以向服務器發送STAT命令了
'作為對STAT的回應,服務器會傳回你郵箱中的消息數及大小
'
'改變當前進程的狀態
m_State=POP3_STAT
'
'現在發送STAT命令
Winsock1.SendData"STAT"&vbCrLf
CasePOP3_STAT
'
'服務器對STAT的回應看上去象這樣
'" OK00"(郵箱中沒有郵件)或" OK37564"
'(郵箱中有郵件).顯然,我們必須找到來自服務器返回的字符串中的第一個數字
intMessages=CInt(Mid$(strData,5,InStr(5,strData,"")-5))
IfintMessages>0Then
'
'如果郵箱中有郵件
'改變進程的狀態
m_State=POP3_RETR
'
intCurrentMessage=intCurrentMessage 1
'
'現在准備向服務器發送RETR命令
'以便接收第一條消息
Winsock1.SendData"RETR1"&vbCrLf
Else
'如果郵箱中沒有郵件就斷開同服務器的連接結束進程
m_State=POP3_QUIT
Winsock1.SendData"QUIT"&vbCrLf
MsgBox"Youhavenotmail.",vbInformation
EndIf
CasePOP3_RETR
'在接收郵件時執行下面執行下面的代碼
'郵件可能會很大,並觸發多次DataArrival事件
'接收到的數據被存放在strBuffer變量中
strBuffer=strBuffer&strData
'
'用下面的語句判斷消息的結束
'郵件是以小數點結尾的
IfInStr(1,strBuffer,vbLf&"."&vbCrLf)Then
'
'郵件下載完畢
'
'刪除由服務器返回的第一行字符串
strBuffer=Mid$(strBuffer,InStr(1,strBuffer,vbCrLf) 2)
'
'刪除最後一個只有小數點的字符
strBuffer=Left$(strBuffer,Len(strBuffer)-3)
'
'把消息存放在m_colMessages集合中
Setm_oMessage=NewCMessage
m_oMessage.CreateFromTextstrBuffer
m_colMessages.Addm_oMessage,m_oMessage.MessageID
Setm_oMessage=Nothing
'
'清空緩沖,准備接收下一條郵件
strBuffer=""
'
'將已收的郵件數同服務器目前的郵件數作比較
IfintCurrentMessage=intMessagesThen
'如果相等,表示已接收完所有的郵件
'所以發送一個QUIT命令給服務器
m_State=POP3_QUIT
Winsock1.SendData"QUIT"&vbCrLf
Else
'如果二者不等,表明還有郵件沒有接收
intCurrentMessage=intCurrentMessage 1
'
'改變當前進程的狀態
m_State=POP3_RETR
'
'向服務器發出RETR命令接收下一個郵件
Winsock1.SendData"RETR"&CStr(intCurrentMessage)&vbCrLf
EndIf
EndIf
CasePOP3_QUIT
'不管我們收到什麼樣的郵件,記得關閉同服務器的連接
Winsock1.Close
'現在調用ListMessages子程序,以便在ListView中顯示收到的郵件
CallListMessages
EndSelect
Else
'下面的錯誤處理的代碼
'只須關閉socket並將來自服務器的回應顯示出來就行了。
'即使是那些高級的郵件接收程序所做也不外如此
Winsock1.Close
MsgBox"POP3Error:"&strData,_
vbExclamation,"POP3Error"
EndIf
EndSub
一切看上去都一目了然,除了下面的語句:
Setm_oMessage=NewCMessage
m_oMessage.CreateFromTextstrBuffer
m_colMessages.Addm_oMessage,m_oMessage.MessageID
Setm_oMessage=Nothing->