程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> VB郵件檢查程序(二)

VB郵件檢查程序(二)

編輯:VB綜合教程
下面是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->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved