《C#网络编程---第5章 SMTP与POP3应用编程.ppt》由会员分享,可在线阅读,更多相关《C#网络编程---第5章 SMTP与POP3应用编程.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第第5章章 SMTP与与POP3应用编程应用编程 5.1 5.1 通通过应过应用程序用程序发发送送电电子子邮邮件件 5.2 5.2 利用同步利用同步TCPTCP接收接收电电子子邮邮件件 2 电子邮件是通过电子邮件是通过SMTP服务器进行发送的,服务器进行发送的,SMTP是英文是英文Simple Mail Transfer Protocol的缩的缩写,意为简单邮件传输协议,默认端口为写,意为简单邮件传输协议,默认端口为25。使。使用用SMTP协议发送邮件时,有两种形式:协议发送邮件时,有两种形式:1)客户端可以使用匿名方式发送邮件,不使用客户端客户端可以使用匿名方式发送邮件,不使用客户端认证,
2、这种方式即是一般的认证,这种方式即是一般的SMTP协议协议 2)客户端必须提供用户名和密码,这种方式称为客户端必须提供用户名和密码,这种方式称为ESMTP协议,即协议,即Extended SMTP,或者叫扩展,或者叫扩展SMTP。3)ESMTP与与SMTP的区别除了是否需要认证以外,其的区别除了是否需要认证以外,其他均相同。为了避免或者减少垃圾邮件,目前大部分他均相同。为了避免或者减少垃圾邮件,目前大部分SMTP邮件服务器一般均采用用户名密码认证的方式。邮件服务器一般均采用用户名密码认证的方式。5.1 通过应用程序发送电子邮件通过应用程序发送电子邮件3 在在SMTP协议中,电子邮件由三部分组成
3、,协议中,电子邮件由三部分组成,信封、首部和正文。信封、首部和正文。1)信封信封 信封包括发信人的邮件地址和接收人的邮件信封包括发信人的邮件地址和接收人的邮件地址,用两条地址,用两条SMTP命令指明。命令指明。MAIL FROM:,告诉,告诉SMTP服务器发信人的地址。服务器发信人的地址。RCPT TO:,告诉,告诉SMTP服务器收信人地址。服务器收信人地址。5.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)45.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)2)首部首部 首部中常用命令:首部中常用命令:FROM:,表明邮件发送者是谁。,表明邮件发送者是谁。TO:,
4、表明邮件接收者是谁。,表明邮件接收者是谁。SUBJECT:,表明邮件的主题。,表明邮件的主题。DATE:,表明发邮件的时间。,表明发邮件的时间。REPLY-TO:,表明邮件的回复地址。,表明邮件的回复地址。Content-Type:,表明邮件包含文本、,表明邮件包含文本、HTML超文超文本和附件的哪些类型。本和附件的哪些类型。X-Priority:,表明邮件的发送优先级。,表明邮件的发送优先级。MIME-Version:,MIME的意思是的意思是Multipurpose Internet Mail Extensions,即多用途,即多用途Internet邮件扩展标准,它对传邮件扩展标准,它对传
5、输内容的消息、附件及其他的内容定义了格式。输内容的消息、附件及其他的内容定义了格式。55.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)3)正文正文 正文是邮件的内容。首部以一个空行结束,正文是邮件的内容。首部以一个空行结束,再下面就是正文部分。再下面就是正文部分。4)结束符号结束符号 邮件以邮件以“.”结束。结束。65.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)对于运行在没有专用邮件服务器的大多数客对于运行在没有专用邮件服务器的大多数客户程序而言,向户程序而言,向SMTP服务器发送邮件需要提供服务器发送邮件需要提供用户名和密码,服务器验证成功后,才能进行发用户
6、名和密码,服务器验证成功后,才能进行发送或接收。因此在应用程序中发送邮件,需要使送或接收。因此在应用程序中发送邮件,需要使用下面几个类:用下面几个类:71)System.Net命名空间下的命名空间下的NetworkCredential类类 该类用于提供客户端身份验证机制的凭该类用于提供客户端身份验证机制的凭据。其中包括标准据。其中包括标准Internet身份验证方法身份验证方法(基本、简要、协商、(基本、简要、协商、NTLM和和Kerberos身身份验证)以及可以创建的自定义方法。在邮份验证)以及可以创建的自定义方法。在邮件发送中,我们需要使用这个类提供件发送中,我们需要使用这个类提供SMTP
7、服务器需要的用户名和密码,用法为:服务器需要的用户名和密码,用法为:NetworkCredential myCredentials=new NetworkCredential(发件人邮件地址发件人邮件地址,密码密码);85.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)2)System.Net.Mail命名空间下的命名空间下的MailAddress类类 该类用于提供发件人和收件人的邮件地址,常用该类用于提供发件人和收件人的邮件地址,常用形式为:形式为:MailAddress from=new MailAddress(发发件人邮件地址件人邮件地址);MailAddress to=n
8、ew MailAddress(收收件人邮件地址件人邮件地址);95.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)3)System.Net.Mail命名空间下的命名空间下的MailMessage类类 该类用于提供邮件的信息,包括主题、内容、附件、该类用于提供邮件的信息,包括主题、内容、附件、信息类型等,常用形式为:信息类型等,常用形式为:MailMessage message=new MailMessage(from,to);message.Subject=主题主题;message.SubjectEncoding=System.Text.Encoding.UTF8;message
9、.Body=邮件内容邮件内容;message.BodyEncoding=System.Text.Encoding.UTF8;105.1 通过应用程序发送电子邮件通过应用程序发送电子邮件(续续)4)System.Net.Mail命名空间下的命名空间下的Attachment类类 该类用于提供附件对象,常用形式为:该类用于提供附件对象,常用形式为:Attachment attachFile=new Attachment(文件名文件名);message.Attachments.Add(attachFile);5)SmtpClient类类 该类用于发送邮件,常用形式为:该类用于发送邮件,常用形式为:Sm
10、tpClient client=new SmtpClient(邮件服务器地址邮件服务器地址);client.Send(message);115.2 利用同步利用同步TCP接收电子邮件接收电子邮件 收发邮件使用了两种协议,一种是收发邮件使用了两种协议,一种是TCP协议,协议,用于收发数据;另一种是用于收发数据;另一种是POP3协议,用于解析传送协议,用于解析传送的命令。的命令。接收电子邮件主要是利用接收电子邮件主要是利用POP(Post Office Protocol)协议,现在常用的是第三版,简称为)协议,现在常用的是第三版,简称为POP3,默认端口为,默认端口为110。通过通过POP3协议,
11、客户机登录到服务器后,可以协议,客户机登录到服务器后,可以对自己的邮件进行删除或下载,下载后,电子邮件对自己的邮件进行删除或下载,下载后,电子邮件客户端软件就可以在本地对邮件进行处理。客户端软件就可以在本地对邮件进行处理。121.POP3工作原理工作原理 客户端软件读取邮件之前,需要事先与客户端软件读取邮件之前,需要事先与服务器建立服务器建立TCP连接。连接成功后,连接。连接成功后,POP3服务器会向该客户端发送确认消息,客户端服务器会向该客户端发送确认消息,客户端等待服务器响应,并处理接收的信息,然后等待服务器响应,并处理接收的信息,然后再接着发送下一个命令,如此往复多次,一再接着发送下一个
12、命令,如此往复多次,一直持续到连接终止。直持续到连接终止。这个过程经历了三个状态:授权状态这个过程经历了三个状态:授权状态(AUTHORIZATION)、操作状态)、操作状态(TRANSACTION)和更新状态()和更新状态(UPDATE)。)。135.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)2.POP3协议中的命令协议中的命令 每条命令均由命令和参数两大部分组成,而且每条命令均由命令和参数两大部分组成,而且每条命令都以回车换行结束。命令和参数之间由空每条命令都以回车换行结束。命令和参数之间由空格间隔。格间隔。POP3服务器回送的响应信息由一个状态码和服务器回送的响应信息
13、由一个状态码和一个可能跟有附加信息的命令组成。所有响应也以一个可能跟有附加信息的命令组成。所有响应也以回车换行结束。状态码有两种:回车换行结束。状态码有两种:“确定确定”(“+OK”)和)和“失败失败”(“-ERR”)。)。143.POP3协议工作的具体过程协议工作的具体过程 假设用假设用C表示客户端(表示客户端(Client),),S表示表示服务器端(服务器端(Server)。)。1)授权状态授权状态 客户端首先与客户端首先与POP3服务器建立服务器建立TCP连连接,服务器接收后发送一个单行的确认信息。接,服务器接收后发送一个单行的确认信息。此时此时POP3会话就进入了授权状态。在授权会话就
14、进入了授权状态。在授权状态,客户需要向服务器发送用户名和密码状态,客户需要向服务器发送用户名和密码进行确认,具体命令如下:进行确认,具体命令如下:155.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)发送用户名。发送用户名。语法形式:语法形式:USER 功能:将客户的用户名发送到服务器。功能:将客户的用户名发送到服务器。服务器返回:服务器返回:+OK正确的用户名;正确的用户名;-ERR错误的用错误的用户名。户名。示例:示例:C:USER S:+OK welcome on this server.16用户名确认成功后,需要输入密码。用户名确认成功后,需要输入密码。语法形式:语法形
15、式:PASS 功能:将客户的密码发送给服务器。功能:将客户的密码发送给服务器。服务器返回:服务器返回:+OK正确的用户名;正确的用户名;-OK错误错误的用户名。的用户名。示例:示例:C:PASS*S:+OK myname logged in at 19:04175.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)2)操作操作状态状态 授权成功后,授权成功后,POP3会话将进入操作状态,会话将进入操作状态,客户就可以执行客户就可以执行POP3命令进行相应的操作。对于命令进行相应的操作。对于每个命令,服务器都会返回应答信息。下面是在操每个命令,服务器都会返回应答信息。下面是在操作状态
16、中使用的命令:作状态中使用的命令:18STAT命令命令 语法形式:语法形式:STAT 功能:从服务器中获邮件总数和总字节数。功能:从服务器中获邮件总数和总字节数。服务器返回:邮件总数和总字节数。服务器返回:邮件总数和总字节数。示例:示例:C:STAT S:+OK 2 320 195.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)LIST命令命令 语法形式:语法形式:LIST 功能:从服务中获得邮件列表和大小。功能:从服务中获得邮件列表和大小。服务器返回:列出邮件列表和大小。服务器返回:列出邮件列表和大小。示例:示例:C:LIST S:+OK 2 messages(320 oct
17、ets)S:1 120 S:2 200 S:.20RETR命令命令 语法形式:语法形式:RETR 功能:从服务器中获得一个邮件。功能:从服务器中获得一个邮件。服务器返回:服务器返回:+OK成功;成功;-ERR错误。错误。示例:示例:C:RETR 1 S:+OK 120 octets S:S:.注意,这里的注意,这里的“.”是单独发送的。是单独发送的。215.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)DELE命令命令 语法形式:语法形式:DELE 功能:服务器将邮件标记为删除,当执行功能:服务器将邮件标记为删除,当执行QUIT命令命令时才真正删除。时才真正删除。服务器返回:服
18、务器返回:+OK成功;成功;-ERR错误。错误。示例:示例:C:DELE 1 S:+OK 1 Deleted223)更新状态更新状态 当客户在操作状态下发送当客户在操作状态下发送QUIT命令后,会命令后,会话进入更新状态。话进入更新状态。QUIT命令命令 语法形式:语法形式:QUIT 功能:关闭与服务器的连接。功能:关闭与服务器的连接。235.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)服务器返回:服务器返回:+OK;-ERR。示例:示例:C:QUIT S:+OK 然后服务器自动断开与该客户端的然后服务器自动断开与该客户端的TCP连接。连接。242.邮件接收处理邮件接收处理
19、这个例子中只需要编写客户端程序,而这个例子中只需要编写客户端程序,而不需要编写服务器端程序即可正常运行。我不需要编写服务器端程序即可正常运行。我们重点关心的是如何利用同步们重点关心的是如何利用同步TCP发送和接发送和接收数据。收数据。部分代码部分代码255.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)建立连接建立连接 int index=textBoxUser.Text.IndexOf();/大部分大部分pop3服务器都加前缀服务器都加前缀pop3.,这里仅获,这里仅获取这种服务器取这种服务器 /对不以对不以pop3.为前缀的这个例子未进行处理为前缀的这个例子未进行处理 st
20、ring pop3Server=pop3.+textBoxUser.Text.Substring(index+1);265.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)/建立与建立与POP3服务器的连接,使用默认端口服务器的连接,使用默认端口110 tcpClient=new TcpClient(pop3Server,110);listBoxStatus.Items.Add(与与pop3服务器连接成服务器连接成功功);/获取获取 Networkstream对象,以便通过建立好的连接发对象,以便通过建立好的连接发送和接收数据送和接收数据 networkStream=tcpCli
21、ent.GetStream();/得到读对象,并查找字节顺序标记,防止显示乱得到读对象,并查找字节顺序标记,防止显示乱码码 sr=new StreamReader(networkStream);/得到写对象得到写对象 sw=new StreamWriter(networkStream);/读取服务器回送的连接信息读取服务器回送的连接信息 if(ReadDataFromServer()=null)return;275.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)/向服务器发送用户名,请求确认向服务器发送用户名,请求确认 if(SendDataToServer(USER +tex
22、tBoxUser.Text)=false)return;if(ReadDataFromServer()=null)return;/向服务器发送密码,请求确认向服务器发送密码,请求确认 if(SendDataToServer(PASS +textBoxPassword.Text)=false)return;if(ReadDataFromServer()=null)return;/向服务器发送向服务器发送STAT命令,请求获取邮件总数和命令,请求获取邮件总数和总字节数总字节数 if(SendDataToServer(LIST)=false)return;if(str=ReadDataFromSer
23、ver()=null)return;285.2 利用同步利用同步TCP接收电子邮件(续)接收电子邮件(续)从网络流中读取服务器回送的信息,从网络流中读取服务器回送的信息,写入信息列表框写入信息列表框 string str=null;str=sr.ReadLine();listBoxStatus.Items.Add(收到:收到:+str);/如果是如果是-ERR,表明有错,表明有错 if(str0=-)MessageBox.Show(str,有错了有错了);str=null;29 断开连接断开连接 /向服务器发送向服务器发送QUIT命令命令 SendDataToServer(QUIT);sr.Close();sw.Close();networkStream.Close();tcpClient.Close();