资源描述
主标题12,一级标题12,二级标题12,37,第,9,章,SMTP,与,POP3,应用编程,9.1,SMTP,简介,9.2 POP3,简介,9.3,邮件收发相关类,9.4,邮件收发举例,本章重点,本章教学目的,通过实例熟悉异步开发邮件接收及发送程序的核心流程。,本章教学要求,(,1,)熟悉,SMTP,和,POP3,编程的流程。,(,2,)掌握如何,发送和接收邮件,。,9.1 SMTP,简介,9.1.1 SMTP,和,ESMTP,9.1.2,与邮件服务器连接,9.1.3,邮件的发送过程,9.1.1 SMTP,和,ESMTP,1. SMTP,和,ESMTP,简介,SMTP,是,Simple Mail Transfer Protocol,的简称,即简单邮件传输协议,命令和响应都是基于,ASCII,文本,命令和响应并均以回车(,CR,)和换行(,LF,)符结束。,SMTP,服务器,(,1,),SMTP,服务器是遵循,SMTP,协议的发送邮件服务器,用来发送或中转电子邮件。(,2,),SMTP,服务器在,TCP,的,25,端口监听连接请求。,客户端发送电子邮件过程是:,先通过客户端软件将邮件发送到,SMTP,邮件服务器,然后再由,SMTP,邮件服务器发送到目标,SMTP,邮件服务器。,9.1.1 SMTP,和,ESMTP,(续),ESMTP,指,Extended SMTP,(扩展,SMTP,),,ESMTP,与,SMTP,的区别是,:,SMTP,发信不需要验证用户帐户,而,ESMTP,发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与,SMTP,方式完全相同。,提供服务器端软件的方式,(,1,)随操作系统一起提供的服务,如,IIS,中的,SMTP,服务。(,2,)软件公司提供的,SMTP,服务器软件。,9.1.1 SMTP,和,ESMTP,(续),提供客户端软件的方式,(,1,),Windows,应用程序客户端软件,比如,OutLook,、,Foxmail,等,(,2,)提供,SMTP,服务的公司提供的,Web,应用程序,比如提供的邮件服务。,客户端发送电子邮件过程,首先通过,25,端口与,SMTP,邮件服务器建立连接,然后向服务器发送命令,将邮件发送到,SMTP,邮件服务器,然后再由,SMTP,邮件服务器发送到目标,SMTP,邮件服务器。,9.1.1 SMTP和ESMTP (续),2. SMTP,的基本命令,表,9-1,中列出了常用的,SMTP,的基本命令,SMTP,命令总共定义了,14,个命令,命令由命令码和其后的参数域组成。命令码不区分大小写。,9.1.1 SMTP,和,ESMTP,(续),在,SMTP,协议中,电子邮件由三部分组成,信封、首部和正文。,1),信封,信封包括发信人的邮件地址和接收人的邮件地址,包括两条,SMTP,命令。,MAIL FROM:,,告诉,SMTP,服务器发信人的地址。,RCPT TO:,,告诉,SMTP,服务器收信人的地址。,9.1.1 SMTP,和,ESMTP,(续),2),首部,。首部常用命令:,FROM,:,,表明邮件发送者是谁。,TO,:,,表明邮件接收者是谁。,SUBJECT,:,,表明邮件的主题。,DATE,:,,表明发邮件的时间。,REPLY-TO,:,,表明邮件的回复地址。,Content-Type,:,,表明邮件包含文本、,HTML,超文本和附件类型。,X-Priority,:,,表明邮件的发送优先级。,MIME-Version,:,,指定传输内容的消息、附件及其内容格式。,9.1.1 SMTP,和,ESMTP,(续),3),正文,正文是邮件的内容。首部以一个空行结束,再下面就是正文部分。,4),结束符号,符合协议的邮件均以,“,.,”,结束。客户端软件接收到邮件后,再将其转换为某种形式展现给用户。,9.1.1 SMTP和ESMTP (续),3.,响应信息,接收方收到,SMTP,命令之后,会给出一个,响应码,。发送者在发送下一条命令前必须等待应答,成功应答才能继续向下执行。每个命令必须有且只有一个响应码。,SMTP,响应码由,3,位数字组成,,,其后跟一些文本信息,。,格式:,3,位数字的响应码,文本,其中,,SP,表示空格,,CRLF,表示回车换行。,表,9-2,9.1.2 与邮件服务器连接,1,与,SMTP,服务器的连接,命令格式:,HELO ,格式举例:,HELO Local,2,与,ESMTP,服务器建立连接,(,1,)命令格式:,EHLO ,格式举例:,EHLO Local,(,2,)启动服务器认证,命令格式:,AUTH LOGIN,3,断开与服务器的连接,命令格式:,QUIT,客户端发送,QUIT,命令,退出系统,断开与服务器的连接,9.1.3 邮件的发送过程,第,1,步:客户端先与服务器建立连接。,客户端发送“,EHLO Local,”命令,服务器收到后返回“,220,”响应码,表示服务器准备就绪。,客户端发送“,AUTH LOGIN,”命令,服务器收到后返回“,334,”响应码,表示要求用户输入用户名。,客户端发送经过,Base64,编码处理的用户名,服务器收到并经认证成功后返回“,334,”响应码,表示要求用户输入密码。,客户端发送经过,Base64,编码处理的密码,服务器收到并经认证成功后返回“,235,”响应码,表示认证成功,用户可以发送邮件。,10.1.3 邮件的发送过程,第,2,步:客户端开始发送邮件的信封。,客户端发送“,MAIL FROM:,”命令,服务器收到后返回“,250,”响应码,表示请求操作就绪。,客户端发送“,RCPT TO:,”命令,服务器收到后返回“,250,”响应码,表示请求操作就绪。,第,3,步:客户端开始发送邮件数据。,客户端发送“,DATA,”命令,表示开始向服务器发送邮件数据,包括邮件的首部和正文。,客户端发送邮件首部(可选)。,客户端发送正文。,客户端发送“,QUIT,”命令,表示断开连接。,9.2 POP3简介,客户端接收邮件时,可以通过两种方式来读取和保存接收到的邮件。,使用POP(Post Office Protocol,即邮局协议)用于电子邮件的接收。常用的是第三版,简称POP3。POP允许客户端连接到服务器并且下载所有的邮件到客户机上的邮箱。,使用IMAP(Internet Message Access Protocol,Internet邮件访问协议)。IMAP使用的端口是143,目前常用版本是IMAP4。IMAP允许客户端在邮件服务器上建立文件夹保存邮件而不用下载邮件到客户机上。,9.2 POP3简介,POP3,规定每条命令均由命令和参数两部分组成,每条命令都以回车(,CR,)换行(,LF,)结束。命令和参数之间由空格间隔。,POP3,服务器回送的响应信息由状态码和附加信息(可选)组成。所有响应也以回车(,CR,)换行(,LF,)结束。,状态码有两种:,+OK,表示正确执行了客户端发送的命令,-ERR,表示服务器执行命令失败,9.2 POP3,简介(续),POP3,命令及执行过程,假设用,C,表示客户端(,Client,),,S,表示服务器端(,Server,)。,客户端首先使用,TCP,与,POP3,服务器建立连接,连接成功后,服务器发送一个单行的确认信息,然后要求客户端发送用户名和密码进行确认,下面是客户端发送的命令:,发送用户名。,格式:,USER ,服务器返回:,+OK,用户名正确;,-ERR,用户名错误。,示例:,C,:,S,:,+OK welcome on this server.,9.2 POP3,简介(续),发送密码,用户名确认成功后,客户端再发送密码。,语法形式:,PASS ,功能:将客户的密码发送给服务器。,服务器返回:,+OK,表示密码正确;,-ERR,表示密码错误。,示例:,C,:,PASS *,S,:,+OK myname logged in at 19:04,9.2 POP3,简介(续),服务器对用户名和密码验证成功后,客户端就可以发送,POP3,命令要求服务器执行相应的操作。对于每个命令,服务器都会返回应答信息。常用命令有:,STAT,命令,格式:,STAT,功能:从服务器中获邮件总数和总字节数。,服务器返回:邮件总数和总字节数。,示例:,C,:,STAT,S,:,+OK 2 320,9.2 POP3,简介(续),LIST,命令,格式:,LIST,功能:从服务中获得邮件列表和大小。,服务器返回:列出邮件列表和大小。,示例:,C,:,LIST,S,:,+OK 2 messages (320 octets),S,:,1 120,S,:,2 200,S,:,.,注意,,“,.,”,单独占一行。,9.2 POP3,简介(续),RETR,命令,格式:,RETR ,功能:从服务器中获得一个邮件。,服务器返回:,+OK,成功;,-ERR,错误。,示例:,C,:,RETR 1,S,:,+OK 120 octets,S,:,S,:,.,注意,,“,.,”,单独占一行。,9.2 POP3,简介(续),DELE,命令,语法形式:,DELE ,功能:服务器将邮件标记为删除,当执行,QUIT,命令时才真正删除。,服务器返回:,+OK,成功;,-ERR,错误。,示例:,C,:,DELE 1,S,:,+OK 1 Deleted,QUIT,命令,格式:,QUIT,功能:关闭与服务器的连接。,服务器返回:,+OK,;,-ERR,。,示例:,C,:,QUIT,S,:,+OK,然后服务器自动断开与该客户端的连接。,9.3,邮件收发相关的类,9.3.1 NetworkCredential,类,9.3.2 MailAddress,类,9.3.3 MailMessage,类,9.3.4 Attachment,类,9.3.5 SmtpClient,类,9.3.6,邮件附加信息类,9.3.1 NetworkCredential,类,NetworkCredential,类用于提供客户端身份验证凭据,提供,SMTP,服务器需要验证的用户名和密码,用法为:,NetworkCredential myCredentials,= new NetworkCredential(,“,发件人邮箱, ,密码,);,9.3.2 MailAddress,类,位于命名空间下,MailAddress,类用于提供发件人和收件人的邮件地址举例:,MailAddress from = new MailAddress(,“,发件人邮箱,);,MailAddress to = new MailAddress(,“,收件人邮箱,);,9.3.3 MailMessage,类,位于命名空间下,MailMessage,类用于提供邮件的信息,包括主题、内容、附件、信息类型等,举例:,MailMessage message = new MailMessage(from, to);,message.Subject =,“,我的邮件,;,message.SubjectEncoding = System.Text.Encoding.UTF8;,message.Body =,“,这是邮件内容,;,message.BodyEncoding = System.Text.Encoding.UTF8;,9.3.4 Attachment,类,提供附件对象,例如:,Attachment attachFile = new Attachment(,“,aa.rar);,message.Attachments.Add(attachFile);,9.3.5 SmtpClient,类,将电子邮件发送到,SMTP,服务器。使用,SmtpClient,发送的电子邮件包含,Attachment,、,MailAddress,和,MailMessage,的相关信息。,构造函数:,(,1,),SmtpClient(),:用专门的配置文件初始化,SmtpClient,类的新实例。配置文件中包括客户端的,Host,、,Credentials,和,Port,属性。,(,2,),SmtpClient(string serverName),:用指定的,SMTP,服务器发送电子邮件,服务器端口默认为,25,。例如:,SmtpClient client = new SmtpClient(,“,);,client.Send(message);,(,3,),SmtpClient(string serverName,int port),:指定,SMTP,服务器和端口。例如:,SmtpClient client = new SmtpClient(,“, 25);,client.Send(message);,9.3.5 SmtpClient,类(续),常用属性,Credentials,属性:获取或设置验证发件人身份的凭据。,EnableSsl,属性:是否使用安全套接字层加密连接。,Port,属性:获取或设置,SMTP,服务器端口,TimeOut,属性:获取或设置发送的超时时间。,常用方法:,Send,方法:采用同步方式发送电子邮件。,SendAsync,方法:采用异步方式发送电子邮件。,SendAsyncCancel,方法:取消异步发送。,SendCompleted,事件:异步发送完成时触发。,9.3.6 邮件附加信息类,命名空间包含用于表示Multipurpose Internet Mail Exchange(MIME,多用途因特网邮件扩展)标头的类型。,使用SmtpClient类发送电子邮件时与命名空间中的类联合使用,用于指定Content-Type、Content-Disposition和 Content-transfer-Encoding标头。,表9-5和表9-6,9.3.6 邮件附加信息类,例如:,Attachment,attachment = new,Attachment,(C:a.doc, , MediaTypeNames.Application.Octet);,attachment.,TransferEncoding,=,TransferEncoding.Base64;,ContentDisposition cd =,attachment.ContentDisposition;,cd.CreationDate =,File.GetCreationTime(pathFileNam);,cd.ModificationDate =,File.GetLastWriteTime(pathFileName);,cd.ReadDate = File.GetLastAccessTime(pathFileName);,9.4,邮件收发举例,9.4.1,同步方式收发邮件举例,9.4.2,异步方式收发邮件举例,9.4.1,同步方式收发邮件举例,例,9-1,:同步发送。运行效果,9.4.1,同步方式收发邮件举例(续),例,9-2,:同步接收。运行效果,9.4.2,异步方式收发邮件,异步发送邮件的代码和同步发送的代码不同的地方在于,发送电子邮件时使用的是,SmtpClient,类提供的异步发送方法,SendAsync,若要取消异步发送电子邮件则调用,SmtpClient,类的,SendAsyncCancel,方法,当异步发送邮件操作完成时触发,SendCompleted,事件,可以在该事件中判断邮件是否发送成功。,具体程序见源码,9.4.2 异步方式收发邮件,异步接收邮件通过,TCP,的异步编程实现。异步接收邮件与同步接收邮件不同的地方在于客户端的异步连接、异步发送数据和异步接收数据。,异步连接,异步建立连接通过使用,TcpClient,类的,BeginConnect,方法和,EndConnect,方法来实现。,异步发送数据,使用,NetWorkStream,类中的,BeginWrite,方法和,EndWrite,方法可以实现异步发送数据。,异步接收数据,使用,NetWorkStream,类中的,BeginRead,方法和,EndRead,方法可以实现异步发送数据。,9.4.2,异步方式收发邮件举例(续),异步接收。运行效果:,
展开阅读全文