C#实现POP3接收邮件_第1页
C#实现POP3接收邮件_第2页
C#实现POP3接收邮件_第3页
C#实现POP3接收邮件_第4页
C#实现POP3接收邮件_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#实现POP3接收邮件一.首先我向大家介绍邮件接收的基本原理:开始便是客户端与服务器的连接。不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号。客户端连接服务器成功后,服务器会返回以下信息:+OK……字符+OK是POP3协议的返回信息。它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有两个:+OK或者-ERR。其中,+OK表示连接成功,而-ERR则表示连接失败。接下来,客户端输入USER<用户名>该命令告诉服务器你的用户名。注意,有些服务器会区分大小写字母的。服务器返回+OK后,客户端输入PASS<口令>服务器返回+OK后,还返回一些邮箱的统计信息,比如:+OK1message(s)[1304byte(s)]不同的服务器返回的信息格式不太一样,所以我们可以用STAT命令来查看邮箱的情况。STAT命令的回应中有两个数字,分别表示邮件的数量和邮件的大小。如果信箱里有信,就可以用RETR命令来获取邮件的正文。RETR命令的格式为:RETR<邮件编号>如果返回结果第一行是+OK信息,则表示成功。第二行起便是邮件的正文。最后一行和SMTP协议一样,是一个单独的英文句号,表示邮件的结尾部分。把邮件存储起来后要用DELE命令删除邮箱中的邮件,否则原有的邮件会继续保留在服务器上,一旦邮件一多,你的邮箱就爆了。DELE命令的格式为:DELE<邮件编号>如果删错了,可以用RSET命令来恢复所有已被删除的邮件。条件是你还没有退出,一旦退出,那就一切ByeBye了。全部完成以后,输入QUIT命令就可以退出POP3服务器了。实现以上,我简要地向大家介绍了POP3邮件接收的基本过程和原理,下面就是一个运用上面的原理实现的简易的邮件接收程序。有了对基本原理的理解,编程的工作就变得相当轻松了。二代码实现:usingSystem;usingSystem.Net.Sockets;usingSystem.IO;usingPop3;//类名:Pop3//功能:接收电子邮件namespacePop3{///<summary>///Pop3的摘要说明。///</summary>publicclassPop3{privatestringmstrHost=null;//主机名称或IP地址privateintmintPort=110;//主机的端口号(默认为110)privateTcpClientmtcpClient=null;//客户端privateNetworkStreammnetStream=null;//网络基础数据流privateStreamReaderm_stmReader=null;//读取字节流privatestringmstrStatMessage=null;//执行STAT命令后得到的消息(从中得到邮件数)///<summary>///构造函数///</summary>///<remarks>一个邮件接收对象</remarks>publicPop3(){}///<summary>///构造函数///</summary>///<paramname="host">主机名称或IP地址</param>publicPop3(stringhost){mstrHost=host;}///<summary>///构造函数///</summary>///<paramname="host">主机名称或IP地址</param>///<paramname="port">主机的端口号</param>///<remarks>一个邮件接收对象</remarks>publicPop3(stringhost,intport){mstrHost=host;mintPort=port;}#region属性///<summary>///主机名称或IP地址///</summary>///<remarks>主机名称或IP地址</remarks>publicstringHostName{get{returnmstrHost;}set{mstrHost=value;}}///<summary>///主机的端口号///</summary>///<remarks>主机的端口号</remarks>publicintPort{get{returnmintPort;}set{mintPort=value;}}#endregion#region私有方法///<summary>///向网络访问的基础数据流中写数据(发送命令码)///</summary>///<paramname="netStream">可以用于网络访问的基础数据流</param>///<paramname="command">命令行</param>///<remarks>向网络访问的基础数据流中写数据(发送命令码)</remarks>privatevoidWriteToNetStream(refNetworkStreamnetStream,Stringcommand){stringstrToSend=command+"\r\n";byte[]arrayToSend=System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());netStream.Write(arrayToSend,0,arrayToSend.Length);}///<summary>///检查命令行结果是否正确///</summary>///<paramname="message">命令行的执行结果</param>///<paramname="check">正确标志</param>///<returns>///类型:布尔///内容:true表示没有错误,false为有错误///</returns>///<remarks>检查命令行结果是否有错误</remarks>privateboolCheckCorrect(stringmessage,stringcheck){if(message.IndexOf(check)==-1)returnfalse;elsereturntrue;}///<summary>///邮箱中的未读邮件数///</summary>///<paramname="message">执行完LIST命令后的结果</param>///<returns>///类型:整型///内容:邮箱中的未读邮件数///</returns>///<remarks>邮箱中的未读邮件数</remarks>privateintGetMailNumber(stringmessage){string[]strMessage=message.Split('');returnInt32.Parse(strMessage[1]);}///<summary>///得到经过解码后的邮件的内容///</summary>///<paramname="encodingContent">解码前的邮件的内容</param>///<returns>///类型:字符串///内容:解码后的邮件的内容///</returns>///<remarks>得到解码后的邮件的内容</remarks>privatestringGetDecodeMailContent(stringencodingContent){stringstrContent=encodingContent.Trim();stringstrEncode=null;intiStart=strContent.IndexOf("Base64");if(iStart==-1)thrownewPop3Exception("邮件内容不是Base64编码,请检查");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>///与主机建立连接///</summary>///<returns>///类型:布尔///内容:连接结果(true为连接成功,false为连接失败)///</returns>///<remarks>与主机建立连接</remarks>publicboolConnect(){if(mstrHost==null)thrownewException("请提供SMTP主机名称或IP地址!");if(mintPort==0)thrownewException("请提供SMTP主机的端口号");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>///执行Pop3命令,并检查执行的结果///</summary>///<paramname="command">Pop3命令行</param>///<returns>///类型:字符串///内容:Pop3命令的执行结果///</returns>privatestringExecuteCommand(stringcommand){stringstrMessage=null;//执行Pop3命令后返回的消息try{//发送命令WriteToNetStream(refmnetStream,command);//读取多行if(command.Substring(0,4).Equals("LIST")||command.Substring(0,4).Equals("RETR")||command.Substring(0,4).Equals("UIDL"))//记录STAT后的消息(其中包含邮件数){strMessage=ReadMultiLine();if(command.Equals("LIST"))//记录LIST后的消息(其中包含邮件数)mstrStatMessage=strMessage;}//读取单行elsestrMessage=m_stmReader.ReadLine();//判断执行结果是否正确if(CheckCorrect(strMessage,"+OK"))returnstrMessage;elsereturn"Error";}catch(IOExceptionexc){thrownewPop3Exception(exc.ToString());}}///<summary>///在Pop3命令中,LIST、RETR和UIDL命令的结果要返回多行,以点号(.)结尾,///所以如果想得到正确的结果,必须读取多行///</summary>///<returns>///类型:字符串///内容:执行Pop3命令后的结果///</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>///类型:字符串数组///内容:解码前的邮件内容///</returns>privatestring[]ReceiveMail(stringuser,stringpassword){intiMailNumber=0;//邮件数if(USER(user).Equals("Error"))thrownewPop3Exception("用户名不正确!");if(PASS(password).Equals("Error"))thrownewPop3Exception("用户口令不正确!");if(STAT().Equals("Error"))thrownewPop3Exception("准备接收邮件时发生错误!");if(LIST().Equals("Error"))thrownewPop3Exception("得到邮件列表时发生错误!");try{iMailNumber=GetMailNumber(mstrStatMessage);//没有新邮件if(iMailNumber==0)returnnull;else{string[]strMailContent=newstring[iMailNumber];for(inti=1;i<=iMailNumber;i++){//读取邮件内容strMailContent[i-1]=GetDecodeMailContent(RETR(i));}returnstrMailContent;}}catch(Pop3Exceptionexc){thrownewPop3Exception(exc.ToString());}}#endregion///<summary>///收取邮件///</summary>///<paramname="user">用户名</param>///<paramname="password">口令</param>///<returns>///类型:字符串数组///内容:解码前的邮件内容///</returns>///<remarks>收取邮箱中的未读邮件</remarks>publicstring[]Receive(stringuser,stringpassword){try{returnReceiveMail(user,password);}catch(Pop3Exceptionexc){thrownew

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论