C#實(shí)現(xiàn)POP3接收郵件_第1頁
C#實(shí)現(xiàn)POP3接收郵件_第2頁
C#實(shí)現(xiàn)POP3接收郵件_第3頁
C#實(shí)現(xiàn)POP3接收郵件_第4頁
C#實(shí)現(xiàn)POP3接收郵件_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C#實(shí)現(xiàn)POP3接收郵件一.首先我向大家介紹郵件接收的基本原理:開始便是客戶端與服務(wù)器的連接。不過,在客戶端連接到服務(wù)器之前,注意把端口設(shè)為POP3協(xié)議默認(rèn)的110號(hào)??蛻舳诉B接服務(wù)器成功后,服務(wù)器會(huì)返回以下信息:+OK……字符+OK是POP3協(xié)議的返回信息。它的回應(yīng)信息不像SMTP協(xié)議那樣用豐富多變的數(shù)字表示,只有兩個(gè):+OK或者-ERR。其中,+OK表示連接成功,而-ERR則表示連接失敗。接下來,客戶端輸入U(xiǎn)SER<用戶名>該命令告訴服務(wù)器你的用戶名。注意,有些服務(wù)器會(huì)區(qū)分大小寫字母的。服務(wù)器返回+OK后,客戶端輸入PASS<口令>服務(wù)器返回+OK后,還返回一些郵箱的統(tǒng)計(jì)信息,比如:+OK1message(s)[1304byte(s)]不同的服務(wù)器返回的信息格式不太一樣,所以我們可以用STAT命令來查看郵箱的情況。STAT命令的回應(yīng)中有兩個(gè)數(shù)字,分別表示郵件的數(shù)量和郵件的大小。如果信箱里有信,就可以用RETR命令來獲取郵件的正文。RETR命令的格式為:RETR<郵件編號(hào)>如果返回結(jié)果第一行是+OK信息,則表示成功。第二行起便是郵件的正文。最后一行和SMTP協(xié)議一樣,是一個(gè)單獨(dú)的英文句號(hào),表示郵件的結(jié)尾部分。把郵件存儲(chǔ)起來后要用DELE命令刪除郵箱中的郵件,否則原有的郵件會(huì)繼續(xù)保留在服務(wù)器上,一旦郵件一多,你的郵箱就爆了。DELE命令的格式為:DELE<郵件編號(hào)>如果刪錯(cuò)了,可以用RSET命令來恢復(fù)所有已被刪除的郵件。條件是你還沒有退出,一旦退出,那就一切ByeBye了。全部完成以后,輸入QUIT命令就可以退出POP3服務(wù)器了。實(shí)現(xiàn)以上,我簡要地向大家介紹了POP3郵件接收的基本過程和原理,下面就是一個(gè)運(yùn)用上面的原理實(shí)現(xiàn)的簡易的郵件接收程序。有了對(duì)基本原理的理解,編程的工作就變得相當(dāng)輕松了。二代碼實(shí)現(xiàn):usingSystem;usingSystem.Net.Sockets;usingSystem.IO;usingPop3;//類名:Pop3//功能:接收電子郵件namespacePop3{///<summary>///Pop3的摘要說明。///</summary>publicclassPop3{privatestringmstrHost=null;//主機(jī)名稱或IP地址privateintmintPort=110;//主機(jī)的端口號(hào)(默認(rèn)為110)privateTcpClientmtcpClient=null;//客戶端privateNetworkStreammnetStream=null;//網(wǎng)絡(luò)基礎(chǔ)數(shù)據(jù)流privateStreamReaderm_stmReader=null;//讀取字節(jié)流privatestringmstrStatMessage=null;//執(zhí)行STAT命令后得到的消息(從中得到郵件數(shù))///<summary>///構(gòu)造函數(shù)///</summary>///<remarks>一個(gè)郵件接收對(duì)象</remarks>publicPop3(){}///<summary>///構(gòu)造函數(shù)///</summary>///<paramname="host">主機(jī)名稱或IP地址</param>publicPop3(stringhost){mstrHost=host;}///<summary>///構(gòu)造函數(shù)///</summary>///<paramname="host">主機(jī)名稱或IP地址</param>///<paramname="port">主機(jī)的端口號(hào)</param>///<remarks>一個(gè)郵件接收對(duì)象</remarks>publicPop3(stringhost,intport){mstrHost=host;mintPort=port;}#region屬性///<summary>///主機(jī)名稱或IP地址///</summary>///<remarks>主機(jī)名稱或IP地址</remarks>publicstringHostName{get{returnmstrHost;}set{mstrHost=value;}}///<summary>///主機(jī)的端口號(hào)///</summary>///<remarks>主機(jī)的端口號(hào)</remarks>publicintPort{get{returnmintPort;}set{mintPort=value;}}#endregion#region私有方法///<summary>///向網(wǎng)絡(luò)訪問的基礎(chǔ)數(shù)據(jù)流中寫數(shù)據(jù)(發(fā)送命令碼)///</summary>///<paramname="netStream">可以用于網(wǎng)絡(luò)訪問的基礎(chǔ)數(shù)據(jù)流</param>///<paramname="command">命令行</param>///<remarks>向網(wǎng)絡(luò)訪問的基礎(chǔ)數(shù)據(jù)流中寫數(shù)據(jù)(發(fā)送命令碼)</remarks>privatevoidWriteToNetStream(refNetworkStreamnetStream,Stringcommand){stringstrToSend=command+"\r\n";byte[]arrayToSend=System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());netStream.Write(arrayToSend,0,arrayToSend.Length);}///<summary>///檢查命令行結(jié)果是否正確///</summary>///<paramname="message">命令行的執(zhí)行結(jié)果</param>///<paramname="check">正確標(biāo)志</param>///<returns>///類型:布爾///內(nèi)容:true表示沒有錯(cuò)誤,false為有錯(cuò)誤///</returns>///<remarks>檢查命令行結(jié)果是否有錯(cuò)誤</remarks>privateboolCheckCorrect(stringmessage,stringcheck){if(message.IndexOf(check)==-1)returnfalse;elsereturntrue;}///<summary>///郵箱中的未讀郵件數(shù)///</summary>///<paramname="message">執(zhí)行完LIST命令后的結(jié)果</param>///<returns>///類型:整型///內(nèi)容:郵箱中的未讀郵件數(shù)///</returns>///<remarks>郵箱中的未讀郵件數(shù)</remarks>privateintGetMailNumber(stringmessage){string[]strMessage=message.Split('');returnInt32.Parse(strMessage[1]);}///<summary>///得到經(jīng)過解碼后的郵件的內(nèi)容///</summary>///<paramname="encodingContent">解碼前的郵件的內(nèi)容</param>///<returns>///類型:字符串///內(nèi)容:解碼后的郵件的內(nèi)容///</returns>///<remarks>得到解碼后的郵件的內(nèi)容</remarks>privatestringGetDecodeMailContent(stringencodingContent){stringstrContent=encodingContent.Trim();stringstrEncode=null;intiStart=strContent.IndexOf("Base64");if(iStart==-1)thrownewPop3Exception("郵件內(nèi)容不是Base64編碼,請(qǐng)檢查");else{strEncode=strContent.Substring(iStart+6,strContent.Length-iStart-6);returnstrEncode;//try//{////returnSX.Encode.TransformToString(strEncode);//returnstrEncode;//}//catch(SX.EncodeExceptionexc)//{//thrownewPop3Exception(exc.Message);//}}}#endregion///<summary>///與主機(jī)建立連接///</summary>///<returns>///類型:布爾///內(nèi)容:連接結(jié)果(true為連接成功,false為連接失?。?//</returns>///<remarks>與主機(jī)建立連接</remarks>publicboolConnect(){if(mstrHost==null)thrownewException("請(qǐng)?zhí)峁㏒MTP主機(jī)名稱或IP地址!");if(mintPort==0)thrownewException("請(qǐng)?zhí)峁㏒MTP主機(jī)的端口號(hào)");try{mtcpClient=newTcpClient(mstrHost,mintPort);mnetStream=mtcpClient.GetStream();m_stmReader=newStreamReader(mtcpClient.GetStream());stringstrMessage=m_stmReader.ReadLine();if(CheckCorrect(strMessage,"+OK")==true)returntrue;elsereturnfalse;}catch(SocketExceptionexc){thrownewPop3Exception(exc.ToString());}catch(NullReferenceExceptionexc){thrownewPop3Exception(exc.ToString());}}#regionPop3命令///<summary>///執(zhí)行Pop3命令,并檢查執(zhí)行的結(jié)果///</summary>///<paramname="command">Pop3命令行</param>///<returns>///類型:字符串///內(nèi)容:Pop3命令的執(zhí)行結(jié)果///</returns>privatestringExecuteCommand(stringcommand){stringstrMessage=null;//執(zhí)行Pop3命令后返回的消息try{//發(fā)送命令WriteToNetStream(refmnetStream,command);//讀取多行if(command.Substring(0,4).Equals("LIST")||command.Substring(0,4).Equals("RETR")||command.Substring(0,4).Equals("UIDL"))//記錄STAT后的消息(其中包含郵件數(shù)){strMessage=ReadMultiLine();if(command.Equals("LIST"))//記錄LIST后的消息(其中包含郵件數(shù))mstrStatMessage=strMessage;}//讀取單行elsestrMessage=m_stmReader.ReadLine();//判斷執(zhí)行結(jié)果是否正確if(CheckCorrect(strMessage,"+OK"))returnstrMessage;elsereturn"Error";}catch(IOExceptionexc){thrownewPop3Exception(exc.ToString());}}///<summary>///在Pop3命令中,LIST、RETR和UIDL命令的結(jié)果要返回多行,以點(diǎn)號(hào)(.)結(jié)尾,///所以如果想得到正確的結(jié)果,必須讀取多行///</summary>///<returns>///類型:字符串///內(nèi)容:執(zhí)行Pop3命令后的結(jié)果///</returns>privatestringReadMultiLine(){stringstrMessage=m_stmReader.ReadLine();stringstrTemp=null;while(strMessage!="."){strTemp=strTemp+strMessage;strMessage=m_stmReader.ReadLine();}returnstrTemp;}//USER命令privatestringUSER(stringuser){returnExecuteCommand("USER"+user)+"\r\n";}//PASS命令privatestringPASS(stringpassword){returnExecuteCommand("PASS"+password)+"\r\n";}//LIST命令privatestringLIST(){returnExecuteCommand("LIST")+"\r\n";}//UIDL命令privatestringUIDL(){returnExecuteCommand("UIDL")+"\r\n";}//NOOP命令privatestringNOOP(){returnExecuteCommand("NOOP")+"\r\n";}//STAT命令privatestringSTAT(){returnExecuteCommand("STAT")+"\r\n";}//RETR命令privatestringRETR(intnumber){returnExecuteCommand("RETR"+number.ToString())+"\r\n";}//DELE命令privatestringDELE(intnumber){returnExecuteCommand("DELE"+number.ToString())+"\r\n";}//QUIT命令privatevoidQuit(){WriteToNetStream(refmnetStream,"QUIT");}///<summary>///收取郵件///</summary>///<paramname="user">用戶名</param>///<paramname="password">口令</param>///<returns>///類型:字符串?dāng)?shù)組///內(nèi)容:解碼前的郵件內(nèi)容///</returns>privatestring[]ReceiveMail(stringuser,stringpassword){intiMailNumber=0;//郵件數(shù)if(USER(user).Equals("Error"))thrownewPop3Exception("用戶名不正確!");if(PASS(password).Equals("Error"))thrownewPop3Exception("用戶口令不正確!");if(STAT().Equals("Error"))thrownewPop3Exception("準(zhǔn)備接收郵件時(shí)發(fā)生錯(cuò)誤!");if(LIST().Equals("Error"))thrownewPop3Exception("得到郵件列表時(shí)發(fā)生錯(cuò)誤!");try{iMailNumber=GetMailNumber(mstrStatMessage);//沒有新郵件if(iMailNumber==0)returnnull;else{string[]strMailContent=newstring[iMailNumber];for(inti=1;i<=iMailNumber;i++){//讀取郵件內(nèi)容strMailContent[i-1]=GetDecodeMailContent(RETR(i));}returnstrMailContent;}}catch(Pop3Exceptionexc){thrownewPop3Exception(exc.ToString());}}#endregion///<summary>///收取郵件///</summary>///<paramname="user">用戶名</param>///<paramname="password">口令</param>///<returns>///類型:字符串?dāng)?shù)組///內(nèi)容:解碼前的郵件內(nèi)容///</returns>///<remarks>收取郵箱中的未讀郵件</remarks>publicstring[]Receive(stringuser,stringpassword){try{returnReceiveMail(user,password);}catch(Pop3Exceptionexc){thrownew

溫馨提示

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

評(píng)論

0/150

提交評(píng)論