網(wǎng)際網(wǎng)路程式設(shè)計課件_第1頁
網(wǎng)際網(wǎng)路程式設(shè)計課件_第2頁
網(wǎng)際網(wǎng)路程式設(shè)計課件_第3頁
網(wǎng)際網(wǎng)路程式設(shè)計課件_第4頁
網(wǎng)際網(wǎng)路程式設(shè)計課件_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

VisualBasic2005

網(wǎng)際網(wǎng)路程式設(shè)計Chpater9VisualBasic2005

網(wǎng)際網(wǎng)路程式設(shè)計Chpa1網(wǎng)際網(wǎng)路程式設(shè)計課件29-1 POP3介紹SMTP用以傳送郵件的通訊協(xié)定,其外寄郵件伺服器(OutgoingMailServer)的預(yù)設(shè)通訊埠為25,而POP3(PostOfficeProtocolversion3)則是用以接收郵件的通訊協(xié)定,其內(nèi)送郵件伺服器(IncomingMailServer)的預(yù)設(shè)通訊埠為110。在流程的處理上,與SMTP通訊協(xié)定最大的不同在於,SMTP嚴(yán)格來說,只有郵件交易(Transaction)過程,並沒有使用者認(rèn)證(Authorization)的過程,也就是說使用SMTP傳送郵件時,並不需要使用者帳號及密碼,便可透過具有SMTP服務(wù)的郵件伺服器,傳送郵件。但POP3則不同,若接收郵件時,不需要使用者帳號及密碼的確認(rèn),那麼不是任何人都可以讀取別人的郵件了嗎?因此,Client端透過POP3通訊協(xié)定至郵件伺服器讀取郵件時,必須經(jīng)過使用者認(rèn)證(Authorization)過程,方可取得郵件。9-1 POP3介紹SMTP用以傳送郵件的通訊協(xié)定,其外寄郵3POP3的流程共分為以下三個階段:AUTHORIZATION:使用者認(rèn)證。TRANSACTION:處理郵件交易。UPDATE:依據(jù)TRANSACTION流程之定義,更新郵件信箱。POP3的流程共分為以下三個階段:4以下為收件端連結(jié)至郵件伺服器收取郵件過程的內(nèi)容,為區(qū)別起見,在每一行的起頭加上“S:”與“C:”,以代表Server端與Client端之訊息。(Connection)C:Tryingtoconnecttohost.tw,port:110C:Connectingto.tw,port:110S:+OKhellofrompopgate(AUTHORIZATION)C:USERleohkkimoS:+OKpasswordrequired.C:PASSpasswordS:+OKmaildropready,9messages(148129octets)(109557210485760)(TRANSACTION)C:STATS:+OK9148129C:RETR1S:+OK548octetsS:Date:Thu,03May200116:34:27CSTS:From:"LeoHuang"<leohk@.tw>S:Reply-To:"LeoHuang"<leohk@.tw>以下為收件端連結(jié)至郵件伺服器收取郵件過程的內(nèi)容,為區(qū)別起見,5S:Subject:POP3MailviaSocketS:To:leohkkimo@.twS:MIME-Version:1.0S:Content-Transfer-Encoding:8bitS:Content-Type:text/plain;charset="Big5"S:Message-ID:<1010503163429.12764@>S:S:ThisisanexampletoreceivethemailS:basedonPOP3protocol.S:LeoS:S:.C:RETR2S:+OK4906octetsS:...(AUTHORIZATION/UPDATE)C:QUITS:+OKdeweyPOP3serversigningoffS:Subject:POP3MailviaSock6不論是那一個階段,RFC均定義了Client所傳送指令的格式以及Server端回應(yīng)之內(nèi)容,與SMTP相比較,POP3的指令內(nèi)容則較為簡單,分別為:Client端所傳送的指令,必須CRLF為結(jié)尾。Server端所回應(yīng)的訊息不似SMTP之複雜(不含三碼數(shù)字),只有兩種情況:+OK:代表指令執(zhí)行正確。-ERR:代表指令執(zhí)行錯誤。除此之外,在POP3每一階段中,均有相對的指令應(yīng)用。不論是那一個階段,RFC均定義了Client所傳送指令的格式79-1-1AUTHORIZATION在AUTHORIZATION(使用者認(rèn)證)階段中,共有以下幾種Client端指令:指令語法USERUSER<loginname>PASSPASS<password>QUITQUIT9-1-1AUTHORIZATION在AUTHORIZAT8此階段的流程分別為:首先Client需與POP3郵件伺服器建立通訊連結(jié),待連結(jié)建立後,伺服端會回傳以下之訊息,接著便需處理使用者認(rèn)證程序:+OKhellofrompopgate在認(rèn)證程序中,首先Client端以USER指令傳送使用者在POP3郵件伺服器上所註冊的登錄帳號,以確認(rèn)使用者身份,若帳號存在,Server端會回傳+OK之訊息,否則回傳-ERR訊息,以下是USER指令的處理範(fàn)例:USERleohuang+OKpasswordrequired.USERabcd-ERRinvaliduser.此階段的流程分別為:9待登錄帳號確認(rèn)後,Client端需以PASS指令傳送此登錄帳號之密碼,同樣地,若密碼正確,Server端會回傳+OK之訊息,否則回傳-ERR訊息,以下是PASS指令的處理範(fàn)例。待密碼確認(rèn)後,便可開始處理郵件接收的交易(Transaction):PASSpassword+OKmaildropready,9messages(148129octets)(109557210485760)PASSabcd-ERRinvalidpassword待登錄帳號確認(rèn)後,Client端需以PASS指令傳送此登錄帳10AUTHORIZATION階段的最後一個指令則是QUIT(註),當(dāng)郵件交易處理完畢時,Client端便發(fā)送QUIT指令至郵件伺服器中斷連結(jié),以下是QUIT指令的處理範(fàn)例:QUIT+OKdeweyPOP3serversigningoffAUTHORIZATION階段的最後一個指令則是QUIT(註11下圖為AUTHORIZATION階段的流程整理:下圖為AUTHORIZATION階段的流程整理:129-1-2TRANSACTION在TRANSACTION(郵件交易)階段中,共有以下幾種Client端指令:

指令語法STATSTATLISTLIST[mail#]RETRRETR<mail#>DELEDELENOOPNOOPRSETRSET9-1-2TRANSACTION在TRANSACTION(13STAT:說明郵件交易的開始,Client端會傳送STAT指令至郵件伺服器,以便瞭解使用者信箱(INBOX)中郵件數(shù)目及大小,其中第一碼數(shù)字代表郵件數(shù)目,第二碼代表所有郵件的大小,其單位為octet(八位元組),例如:STAT+OK9148129STAT:14LIST:LIST指令有兩種功能,若沒有參數(shù),代表依序列出每一封郵件的大?。▎挝粸閛ctet)。若希望瞭解某一封郵件的大小,則以郵件序號為LIST指令的參數(shù),需注意的是,郵件序號是由1開始,例如:LIST+OK2messages(320octets)11202200.LIST2+OK2200LIST3-ERRnosuchmessage,only2messagesinmaildropLIST:15RETR:為Retrieve(取得)的縮寫,用以取得郵件內(nèi)文,包括郵件標(biāo)題(Header)及郵件內(nèi)容(Content)。若指令執(zhí)行成功,Server端會先回傳+OK訊息,告知Client端此郵件大?。▎挝粸閛ctet),接著則依序傳送郵件標(biāo)題及內(nèi)容。如何判斷標(biāo)題、內(nèi)容及郵件結(jié)尾呢?POP3通訊協(xié)定在傳送郵件內(nèi)文時,是依下圖的順序傳送標(biāo)題與內(nèi)容,其中標(biāo)題與內(nèi)容之間會以空行隔開,並以.CRLF(.\r\n)為郵件結(jié)尾。RETR:16致於標(biāo)題中各行的順序,則會依郵件伺服器的不同而有所差異,以下為RETR指令的範(fàn)例:RETR1+OK548octetsDate:Thu,03May200116:34:27CSTFrom:"LeoHuang"<leohk@.tw>Reply-To:"LeoHuang"<leohk@.tw>Subject:POP3MailviaSocketTo:leohkkimo@.twMIME-Version:1.0Content-Transfer-Encoding:8bitContent-Type:text/plain;charset="Big5"Message-ID:<1010503163429.12764@>ThisisanexampletoreceivethemailbasedonPOP3protocol.Leo致於標(biāo)題中各行的順序,則會依郵件伺服器的不同而有所差異,以下17DELE:為Delete(刪除)的縮寫,用以刪除郵件。執(zhí)行本指令,只是註記(Mark)郵件已被刪除,但實(shí)際上,並未真正自郵件信箱中永久移除,必須等到執(zhí)行QUIT指令,Client端與Server端結(jié)束連結(jié)時,才會真正地永久移除,因此郵件軟體通常會在執(zhí)行結(jié)束時,詢問使用者確認(rèn)刪除的動作。以下為DELE指令的範(fàn)例:DELE1+OKmessage1deletedDELE1-ERRmessage1alreadydeletedDELE:18NOOP:為NoOperation的縮寫,執(zhí)行此指令,Server端僅會回傳+OK的訊息。RSET:用以取消被註記刪除的郵件,例如:DELE1+OKmessage1deletedRSET+OKmaildrophas2messages(320octets)NOOP:19除了上述指令之外,有些POP3伺服器也支援TOP指令。TOP:用以回傳郵件標(biāo)題及指定行數(shù)的內(nèi)容,其語法為:TOP<mail#>[line#]其中:mail#:代表郵件序號,此郵件序號不能被註記為刪除。line#:回傳郵件內(nèi)容(Content)的行數(shù)。例如:TOP10+OK548octetsDate:Thu,03May200116:34:27CSTFrom:"LeoHuang"<leohk@.tw>Reply-To:"LeoHuang"<leohk@.tw>Subject:POP3MailviaSocketTo:leohkkimo@.twMIME-Version:1.0Content-Transfer-Encoding:8bitContent-Type:text/plain;charset="Big5"Message-ID:<1010503163429.12764@>除了上述指令之外,有些POP3伺服器也支援TOP指令。20下圖為TRANSACTION階段的流程整理:

下圖為TRANSACTION階段的流程整理:219-1-3UPDATE

當(dāng)Client端執(zhí)行QUIT指令與Server端結(jié)束通訊連結(jié)時,則進(jìn)入POP3的最後階段-UPDATE,最主要是將在TRANSACTION階段中,被DELE指令刪除的郵件,自郵件信箱中永久移除。此階段沒有任何指令,例如:QUIT+OKdeweyPOP3serversigningoff9-1-3UPDATE當(dāng)Client端執(zhí)行QUIT指令與229-2 POP3Client-Scoket欲以VB.NET所提供的System.Net.Sockets.Socket類別透過POP3通訊協(xié)定接收郵件,需依照上一節(jié)所說明的POP3流程及階段,建立與郵件伺服器的通訊連結(jié),並依序傳送相關(guān)指令至伺服器。參考範(fàn)例9-1POP3.sln

9-2 POP3Client-Scoket欲以VB.N23首先Client端以System.Net.Sockets.Socket類別與POP3郵件伺服器建立Socket通訊連結(jié):範(fàn)例9-1POP3.sln程式說明

IpHost=System.Net.Dns.Resolve(strHost)IPAdd=IpHost.AddressList(0)IPEndAdd=NewSystem.Net.IPEndPoint(IPAdd.Address,_Int32.Parse(strPort))'嘗試與郵件伺服器建立連結(jié)pop3Socket.Connect(IPEndAdd)...'郵件伺服器回傳+OKhellofrompopgate訊息?IfNotPOP3Response()ThenReturnFalse首先Client端以System.Net.Sockets.S24其中自訂POP3Response函式為:PrivateFunctionPOP3Response()AsBooleanDimRecvBytes(256)AsByteDimstrResponseAsString=NothingDimbytesAsInt32Trybytes=pop3Socket.Receive(RecvBytes,RecvBytes.Length,0)strResponse=Encoding.ASCII.GetString(RecvBytes,0,bytes)...IfNotstrResponse.StartsWith("+OK")Then...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseElseReturnTrueEndIfCatchexAsException...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseEndTryEndFunction其中自訂POP3Response函式為:PrivateFu25接著便需處理使用者認(rèn)證的流程(AUTHORIZATION),依序由Client端傳送下列訊息至郵件伺服器,並同時處理伺服器所回傳的訊息以判斷是否正確:'USERstrMsg="USER"&strUserIf(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OKpasswordrequired訊息?If(NotPOP3Response())ThenReturnFalse'PASSstrMsg="PASS"&strPassIf(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OKmaildropready,..messages訊息?If(NotPOP3Response())ThenReturnFalse'STATstrMsg="STAT"If(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OK<#ofMail><MailSize>bytes=pop3Socket.Receive(RecvBytes,RecvBytes.Length,0)strResponse=Encoding.ASCII.GetString(RecvBytes,0,bytes)If(NotstrResponse.StartsWith("+OK"))ThenReturnFalseEndIf'+OK<#><Size>DimstrTemp()AsStringstrTemp=strResponse.Split("")totalMail=Int32.Parse(strTemp(1).Trim)mailSize=Int32.Parse(strTemp(2).Trim)接著便需處理使用者認(rèn)證的流程(AUTHORIZATION),26其中自訂POP3Request函式為:PrivateFunctionPOP3Request(ByValstrMsgAsString)AsBooleanDimbyteMsg()AsBytestrMsg=strMsg&ControlChars.CrLfTrybyteMsg=Encoding.ASCII.GetBytes(strMsg.ToCharArray())pop3Socket.Send(byteMsg,byteMsg.Length,SocketFlags.None)...ReturnTrueCatchexAsException...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseEndTryEndFunction其中自訂POP3Request函式為:PrivateFun27認(rèn)證成功之後,便可處理接收郵件交易(TRANSACTION)。程式中,由Client端透過輸入資料流傳送RETR指令至Server端,待Server端回傳訊息,便讀取郵件標(biāo)題及內(nèi)容,其中藉由“.”判斷郵件內(nèi)容結(jié)尾。認(rèn)證成功之後,便可處理接收郵件交易(TRANSACTION)289-3 POP3Client-TcpClient開發(fā)POP3Client端應(yīng)用程式,除了使用System.Net.Sockets.Socket類別之外,另外亦可使用System.Net.Sockets.TcpClient類別處理,其開發(fā)流程為:9-3 POP3Client-TcpClient開發(fā)P29首先Client端以TcpClient類別與POP3郵件伺服器建立Socket通訊連結(jié),可使用TcpClient類別的Connect方法以建立用戶端與伺服端的連線,其方法如下:PublicSubConnect(remoteEPAsIPEndPoint)PublicSubConnect(addressAsIPAddress,portAsInteger)PublicSubConnect(hostnameAsString,portAsInteger)PublicSubConnect(ipAddressAsIPAddress(),portAsInteger)首先Client端以TcpClient類別與POP3郵件伺服30參數(shù)分別為:remoteEP:伺服端IPAddress與通訊埠號。address:指定伺服端的IPAddress,為System.Net.IPAddress類別形式。hostname:指定伺服端的主機(jī)名稱。port:設(shè)定伺服端所提供之Internet服務(wù)的通訊埠號。例如:Dimpop3SocketAsNewSystem.Net.Sockets.TcpClient()pop3Socket.Connect(strHost,Int32.Parse(strPort))參數(shù)分別為:31建立用戶端與伺服端資料傳送接收的輸出入資料流(Input/OutputStream):所建立的TcpClient物件,代表用戶端與伺服端之連線,可藉由TcpClient類別的GetStream方法取得用戶端的輸出入資料流:PublicFunctionGetStream()AsNetworkStream例如:DimnetworkStreamAsStreamnetworkStream=pop3Socket.GetStream()建立用戶端與伺服端資料傳送接收的輸出入資料流(Input/O32接著便以NetworkStream類別的Write方法依序由Client端傳送下列訊息至郵件伺服器,並同時以NetworkStream類別的Read方法處理伺服器所回傳的訊息以判斷是否正確。USERleohuang+OKpasswordrequired.PASSpassword+OKmaildropready,...STAT+OK...LIST+OK...messages(...octets)....RETR1+OK...octets....接著便以NetworkStream類別的Write方法依序由33Client端傳送訊息至郵件伺服器:DimbyteMsg()AsByteTrybyteMsg=Encoding.ASCII.GetBytes(...)networkStream.Write(byteMsg,0,byteMsg.Length)...CatchexAsException...EndTry郵件伺服器回傳訊息至Client端:Dimbytes(pop3Socket.ReceiveBufferSize)AsByteDimstrResponseAsString=NothingTrynetworkStream.Read(bytes,0,CInt(pop3Socket.ReceiveBufferSize))strResponse=Encoding.ASCII.GetString(bytes)...CatchexAsException...EndTryClient端傳送訊息至郵件伺服器:DimbyteMsg(34當(dāng)郵件傳送完畢時,需以TcpClient類別的Close方法關(guān)閉Client端與POP3郵件伺服器之Socket連結(jié),例如:pop3Socket.Close()參考範(fàn)例9-2POP3.sln

當(dāng)郵件傳送完畢時,需以TcpClient類別的Close方法35ENDEND36VisualBasic2005

網(wǎng)際網(wǎng)路程式設(shè)計Chpater9VisualBasic2005

網(wǎng)際網(wǎng)路程式設(shè)計Chpa37網(wǎng)際網(wǎng)路程式設(shè)計課件389-1 POP3介紹SMTP用以傳送郵件的通訊協(xié)定,其外寄郵件伺服器(OutgoingMailServer)的預(yù)設(shè)通訊埠為25,而POP3(PostOfficeProtocolversion3)則是用以接收郵件的通訊協(xié)定,其內(nèi)送郵件伺服器(IncomingMailServer)的預(yù)設(shè)通訊埠為110。在流程的處理上,與SMTP通訊協(xié)定最大的不同在於,SMTP嚴(yán)格來說,只有郵件交易(Transaction)過程,並沒有使用者認(rèn)證(Authorization)的過程,也就是說使用SMTP傳送郵件時,並不需要使用者帳號及密碼,便可透過具有SMTP服務(wù)的郵件伺服器,傳送郵件。但POP3則不同,若接收郵件時,不需要使用者帳號及密碼的確認(rèn),那麼不是任何人都可以讀取別人的郵件了嗎?因此,Client端透過POP3通訊協(xié)定至郵件伺服器讀取郵件時,必須經(jīng)過使用者認(rèn)證(Authorization)過程,方可取得郵件。9-1 POP3介紹SMTP用以傳送郵件的通訊協(xié)定,其外寄郵39POP3的流程共分為以下三個階段:AUTHORIZATION:使用者認(rèn)證。TRANSACTION:處理郵件交易。UPDATE:依據(jù)TRANSACTION流程之定義,更新郵件信箱。POP3的流程共分為以下三個階段:40以下為收件端連結(jié)至郵件伺服器收取郵件過程的內(nèi)容,為區(qū)別起見,在每一行的起頭加上“S:”與“C:”,以代表Server端與Client端之訊息。(Connection)C:Tryingtoconnecttohost.tw,port:110C:Connectingto.tw,port:110S:+OKhellofrompopgate(AUTHORIZATION)C:USERleohkkimoS:+OKpasswordrequired.C:PASSpasswordS:+OKmaildropready,9messages(148129octets)(109557210485760)(TRANSACTION)C:STATS:+OK9148129C:RETR1S:+OK548octetsS:Date:Thu,03May200116:34:27CSTS:From:"LeoHuang"<leohk@.tw>S:Reply-To:"LeoHuang"<leohk@.tw>以下為收件端連結(jié)至郵件伺服器收取郵件過程的內(nèi)容,為區(qū)別起見,41S:Subject:POP3MailviaSocketS:To:leohkkimo@.twS:MIME-Version:1.0S:Content-Transfer-Encoding:8bitS:Content-Type:text/plain;charset="Big5"S:Message-ID:<1010503163429.12764@>S:S:ThisisanexampletoreceivethemailS:basedonPOP3protocol.S:LeoS:S:.C:RETR2S:+OK4906octetsS:...(AUTHORIZATION/UPDATE)C:QUITS:+OKdeweyPOP3serversigningoffS:Subject:POP3MailviaSock42不論是那一個階段,RFC均定義了Client所傳送指令的格式以及Server端回應(yīng)之內(nèi)容,與SMTP相比較,POP3的指令內(nèi)容則較為簡單,分別為:Client端所傳送的指令,必須CRLF為結(jié)尾。Server端所回應(yīng)的訊息不似SMTP之複雜(不含三碼數(shù)字),只有兩種情況:+OK:代表指令執(zhí)行正確。-ERR:代表指令執(zhí)行錯誤。除此之外,在POP3每一階段中,均有相對的指令應(yīng)用。不論是那一個階段,RFC均定義了Client所傳送指令的格式439-1-1AUTHORIZATION在AUTHORIZATION(使用者認(rèn)證)階段中,共有以下幾種Client端指令:指令語法USERUSER<loginname>PASSPASS<password>QUITQUIT9-1-1AUTHORIZATION在AUTHORIZAT44此階段的流程分別為:首先Client需與POP3郵件伺服器建立通訊連結(jié),待連結(jié)建立後,伺服端會回傳以下之訊息,接著便需處理使用者認(rèn)證程序:+OKhellofrompopgate在認(rèn)證程序中,首先Client端以USER指令傳送使用者在POP3郵件伺服器上所註冊的登錄帳號,以確認(rèn)使用者身份,若帳號存在,Server端會回傳+OK之訊息,否則回傳-ERR訊息,以下是USER指令的處理範(fàn)例:USERleohuang+OKpasswordrequired.USERabcd-ERRinvaliduser.此階段的流程分別為:45待登錄帳號確認(rèn)後,Client端需以PASS指令傳送此登錄帳號之密碼,同樣地,若密碼正確,Server端會回傳+OK之訊息,否則回傳-ERR訊息,以下是PASS指令的處理範(fàn)例。待密碼確認(rèn)後,便可開始處理郵件接收的交易(Transaction):PASSpassword+OKmaildropready,9messages(148129octets)(109557210485760)PASSabcd-ERRinvalidpassword待登錄帳號確認(rèn)後,Client端需以PASS指令傳送此登錄帳46AUTHORIZATION階段的最後一個指令則是QUIT(註),當(dāng)郵件交易處理完畢時,Client端便發(fā)送QUIT指令至郵件伺服器中斷連結(jié),以下是QUIT指令的處理範(fàn)例:QUIT+OKdeweyPOP3serversigningoffAUTHORIZATION階段的最後一個指令則是QUIT(註47下圖為AUTHORIZATION階段的流程整理:下圖為AUTHORIZATION階段的流程整理:489-1-2TRANSACTION在TRANSACTION(郵件交易)階段中,共有以下幾種Client端指令:

指令語法STATSTATLISTLIST[mail#]RETRRETR<mail#>DELEDELENOOPNOOPRSETRSET9-1-2TRANSACTION在TRANSACTION(49STAT:說明郵件交易的開始,Client端會傳送STAT指令至郵件伺服器,以便瞭解使用者信箱(INBOX)中郵件數(shù)目及大小,其中第一碼數(shù)字代表郵件數(shù)目,第二碼代表所有郵件的大小,其單位為octet(八位元組),例如:STAT+OK9148129STAT:50LIST:LIST指令有兩種功能,若沒有參數(shù),代表依序列出每一封郵件的大?。▎挝粸閛ctet)。若希望瞭解某一封郵件的大小,則以郵件序號為LIST指令的參數(shù),需注意的是,郵件序號是由1開始,例如:LIST+OK2messages(320octets)11202200.LIST2+OK2200LIST3-ERRnosuchmessage,only2messagesinmaildropLIST:51RETR:為Retrieve(取得)的縮寫,用以取得郵件內(nèi)文,包括郵件標(biāo)題(Header)及郵件內(nèi)容(Content)。若指令執(zhí)行成功,Server端會先回傳+OK訊息,告知Client端此郵件大?。▎挝粸閛ctet),接著則依序傳送郵件標(biāo)題及內(nèi)容。如何判斷標(biāo)題、內(nèi)容及郵件結(jié)尾呢?POP3通訊協(xié)定在傳送郵件內(nèi)文時,是依下圖的順序傳送標(biāo)題與內(nèi)容,其中標(biāo)題與內(nèi)容之間會以空行隔開,並以.CRLF(.\r\n)為郵件結(jié)尾。RETR:52致於標(biāo)題中各行的順序,則會依郵件伺服器的不同而有所差異,以下為RETR指令的範(fàn)例:RETR1+OK548octetsDate:Thu,03May200116:34:27CSTFrom:"LeoHuang"<leohk@.tw>Reply-To:"LeoHuang"<leohk@.tw>Subject:POP3MailviaSocketTo:leohkkimo@.twMIME-Version:1.0Content-Transfer-Encoding:8bitContent-Type:text/plain;charset="Big5"Message-ID:<1010503163429.12764@>ThisisanexampletoreceivethemailbasedonPOP3protocol.Leo致於標(biāo)題中各行的順序,則會依郵件伺服器的不同而有所差異,以下53DELE:為Delete(刪除)的縮寫,用以刪除郵件。執(zhí)行本指令,只是註記(Mark)郵件已被刪除,但實(shí)際上,並未真正自郵件信箱中永久移除,必須等到執(zhí)行QUIT指令,Client端與Server端結(jié)束連結(jié)時,才會真正地永久移除,因此郵件軟體通常會在執(zhí)行結(jié)束時,詢問使用者確認(rèn)刪除的動作。以下為DELE指令的範(fàn)例:DELE1+OKmessage1deletedDELE1-ERRmessage1alreadydeletedDELE:54NOOP:為NoOperation的縮寫,執(zhí)行此指令,Server端僅會回傳+OK的訊息。RSET:用以取消被註記刪除的郵件,例如:DELE1+OKmessage1deletedRSET+OKmaildrophas2messages(320octets)NOOP:55除了上述指令之外,有些POP3伺服器也支援TOP指令。TOP:用以回傳郵件標(biāo)題及指定行數(shù)的內(nèi)容,其語法為:TOP<mail#>[line#]其中:mail#:代表郵件序號,此郵件序號不能被註記為刪除。line#:回傳郵件內(nèi)容(Content)的行數(shù)。例如:TOP10+OK548octetsDate:Thu,03May200116:34:27CSTFrom:"LeoHuang"<leohk@.tw>Reply-To:"LeoHuang"<leohk@.tw>Subject:POP3MailviaSocketTo:leohkkimo@.twMIME-Version:1.0Content-Transfer-Encoding:8bitContent-Type:text/plain;charset="Big5"Message-ID:<1010503163429.12764@>除了上述指令之外,有些POP3伺服器也支援TOP指令。56下圖為TRANSACTION階段的流程整理:

下圖為TRANSACTION階段的流程整理:579-1-3UPDATE

當(dāng)Client端執(zhí)行QUIT指令與Server端結(jié)束通訊連結(jié)時,則進(jìn)入POP3的最後階段-UPDATE,最主要是將在TRANSACTION階段中,被DELE指令刪除的郵件,自郵件信箱中永久移除。此階段沒有任何指令,例如:QUIT+OKdeweyPOP3serversigningoff9-1-3UPDATE當(dāng)Client端執(zhí)行QUIT指令與589-2 POP3Client-Scoket欲以VB.NET所提供的System.Net.Sockets.Socket類別透過POP3通訊協(xié)定接收郵件,需依照上一節(jié)所說明的POP3流程及階段,建立與郵件伺服器的通訊連結(jié),並依序傳送相關(guān)指令至伺服器。參考範(fàn)例9-1POP3.sln

9-2 POP3Client-Scoket欲以VB.N59首先Client端以System.Net.Sockets.Socket類別與POP3郵件伺服器建立Socket通訊連結(jié):範(fàn)例9-1POP3.sln程式說明

IpHost=System.Net.Dns.Resolve(strHost)IPAdd=IpHost.AddressList(0)IPEndAdd=NewSystem.Net.IPEndPoint(IPAdd.Address,_Int32.Parse(strPort))'嘗試與郵件伺服器建立連結(jié)pop3Socket.Connect(IPEndAdd)...'郵件伺服器回傳+OKhellofrompopgate訊息?IfNotPOP3Response()ThenReturnFalse首先Client端以System.Net.Sockets.S60其中自訂POP3Response函式為:PrivateFunctionPOP3Response()AsBooleanDimRecvBytes(256)AsByteDimstrResponseAsString=NothingDimbytesAsInt32Trybytes=pop3Socket.Receive(RecvBytes,RecvBytes.Length,0)strResponse=Encoding.ASCII.GetString(RecvBytes,0,bytes)...IfNotstrResponse.StartsWith("+OK")Then...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseElseReturnTrueEndIfCatchexAsException...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseEndTryEndFunction其中自訂POP3Response函式為:PrivateFu61接著便需處理使用者認(rèn)證的流程(AUTHORIZATION),依序由Client端傳送下列訊息至郵件伺服器,並同時處理伺服器所回傳的訊息以判斷是否正確:'USERstrMsg="USER"&strUserIf(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OKpasswordrequired訊息?If(NotPOP3Response())ThenReturnFalse'PASSstrMsg="PASS"&strPassIf(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OKmaildropready,..messages訊息?If(NotPOP3Response())ThenReturnFalse'STATstrMsg="STAT"If(NotPOP3Request(strMsg))ThenReturnFalse'郵件伺服器回傳+OK<#ofMail><MailSize>bytes=pop3Socket.Receive(RecvBytes,RecvBytes.Length,0)strResponse=Encoding.ASCII.GetString(RecvBytes,0,bytes)If(NotstrResponse.StartsWith("+OK"))ThenReturnFalseEndIf'+OK<#><Size>DimstrTemp()AsStringstrTemp=strResponse.Split("")totalMail=Int32.Parse(strTemp(1).Trim)mailSize=Int32.Parse(strTemp(2).Trim)接著便需處理使用者認(rèn)證的流程(AUTHORIZATION),62其中自訂POP3Request函式為:PrivateFunctionPOP3Request(ByValstrMsgAsString)AsBooleanDimbyteMsg()AsBytestrMsg=strMsg&ControlChars.CrLfTrybyteMsg=Encoding.ASCII.GetBytes(strMsg.ToCharArray())pop3Socket.Send(byteMsg,byteMsg.Length,SocketFlags.None)...ReturnTrueCatchexAsException...pop3Socket.Shutdown(SocketShutdown.Both)pop3Socket.Close()ReturnFalseEndTryEndFunction其中自訂POP3Request函式為:PrivateFun63認(rèn)證成功之後,便可處理接收郵件交易(TRANSACTION)。程式中,由Client端透過輸入資料流傳送RETR指令至Server端,待Server端回傳訊息,便讀取郵件標(biāo)題及內(nèi)容,其中藉由“.”判斷郵件內(nèi)容結(jié)尾。認(rèn)證成功之後,便可處理接收郵件交易(TRANSACTION)64

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論