440 likes | 709 Views
第 9 章 SMTP 与 POP3 应用编程. 9.1 SMTP 简介 9.2 POP3 简介 9.3 邮件收发相关类 9.4 邮件收发举例. 9.1 SMTP 简介. 9.1.1 SMTP 和 ESMTP 9.1.2 与邮件服务器连接 9.1.3 邮件的发送过程. 9.1.1 SMTP 和 ESMTP. 1. SMTP 和 ESMTP 简介
E N D
第9章 SMTP与POP3应用编程 9.1 SMTP简介 9.2 POP3简介 9.3 邮件收发相关类 9.4 邮件收发举例
9.1 SMTP简介 9.1.1 SMTP和ESMTP 9.1.2 与邮件服务器连接 9.1.3 邮件的发送过程
9.1.1 SMTP和ESMTP 1. SMTP和ESMTP简介 SMTPSimple Mail Transfer Protocol的简称,即简单邮件传输协议, 命令和响应都是基于 ASCII 文本,命令和响应并均以回车(CR)和换行(LF)符结束。 SMTP服务器(1)SMTP服务器是遵循SMTP协议的发送邮件服务器,用来发送或中转电子邮件。(2)SMTP服务器在TCP的25端口监听连接请求。
9.1.1 SMTP和ESMTP • ESMTP指Extended SMTP(扩展 SMTP) • ESMTP与 SMTP的区别SMTP发信不需要验证用户帐户,而ESMTP发信时,服务器会要求用户提供用户名和密码以便验证身份。 • 提供服务器端软件的方式(1)随操作系统一起提供的服务,如IIS中的SMTP服务。(2)软件公司提供的SMTP服务器软件。
9.1.1 SMTP和ESMTP (续) 提供客户端软件的方式 (1)Windows应用程序客户端软件,比如OutLook、Foxmail等 (2)提供SMTP服务的公司提供的Web应用程序,比如www.126.com提供的邮件服务。 客户端发送电子邮件过程首先通过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> 其中,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”响应码,表示认证成功,用户可以发送邮件。
9.1.3 邮件的发送过程 第2步:客户端开始发送邮件的信封。 • 客户端发送“MAIL FROM:<发信人的地址>”命令,服务器收到后返回“250”响应码,表示请求操作就绪。 • 客户端发送“RCPT TO:<收信人的地址>”命令,服务器收到后返回“250”响应码,表示请求操作就绪。
10.1.3 邮件的发送过程 第3步:客户端开始发送邮件数据。 客户端发送“DATA”命令,表示开始向服务器发送邮件数据,包括邮件的首部和正文。 客户端发送邮件首部(可选)。 客户端发送正文。 第4步:客户端断开与服务器的连接。 客户端发送“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命令及执行过程 接收邮件时,客户端与POP3服务器之间经历了3个状态:授权状态、操作状态和更新状态。 假设用C表示客户端,S表示服务器端。 1、授权状态 客户端首先使用TCP与POP3服务器建立连接,连接成功后,服务器发送一个单行的确认信息,然后要求客户端发送用户名和密码进行确认。 客户端需要发送命令有USER命令和PASS命令。
9.2 POP3简介(续) 1.授权状态 ①发送用户名。 格式:USER <用户名> 服务器返回: +OK用户名正确; -ERR用户名错误。 示例: C:USER myname@126.com S:+OK welcome on this server.
9.2 POP3简介(续) 1.授权状态 ②发送密码用户名确认成功后,客户端再发送密码。 语法形式:PASS <密码> 功能:将客户的密码发送给服务器。 服务器返回: +OK 表示密码正确;-ERR 表示密码错误。 示例: C:PASS ***** S:+OK myname logged in at 19:04
9.2 POP3简介(续) 2. 操作状态 验证成功后,客户端就可以发送POP3命令要求服务器执行相应的操作。常用命令有: ①STAT命令 格式:STAT 功能:从服务器中获邮件总数和总字节数。 服务器返回:邮件总数和总字节数。 示例: C:STAT S:+OK 2 320
9.2 POP3简介(续) 2. 操作状态 ②LIST命令 格式:LIST 功能:从服务中获得邮件列表和大小。 服务器返回:列出邮件列表和大小。 示例: C:LIST S:+OK 2 messages (320 octets) S:1 120 S:2 200 S: . //注意,“.”单独占一行。
9.2 POP3简介(续) 2. 操作状态 ③RETR命令 格式:RETR <邮件的序号> 功能:从服务器中获得一个邮件。 服务器返回:+OK成功;-ERR错误。 示例: C: RETR 1 S:+OK 120 octets S:<服务器发送信件1内容> S: . //注意,“.”单独占一行。
9.2 POP3简介(续) 2. 操作状态 ④DELE命令 语法形式:DELE <邮件的序号> 功能:服务器将邮件标记为删除,当执行QUIT命令时才真正删除。 服务器返回:+OK成功;-ERR错误。 示例: C:DELE 1 S:+OK 1 Deleted
9.2 POP3简介(续) 3.更新状态 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类位于System.Net.Mail命名空间下。 MailAddress类用于提供发件人和收件人的邮件地址。举例: MailAddress from = new MailAddress(“发件人邮箱"); MailAddress to = new MailAddress(“收件人邮箱");
9.3.3 MailMessage类 MailMessage位于System.Net.Mail命名空间下 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类提供附件对象。 例如: Attachment attachFile = new Attachment(“aa.rar"); message.Attachments.Add(attachFile);
9.3.5 SmtpClient类 SmtpClient将电子邮件发送到 SMTP 服务器。使用 SmtpClient 发送的电子邮件包含Attachment、MailAddress和MailMessage的相关信息。 1. 构造函数: (1)SmtpClient():用专门的配置文件初始化 SmtpClient 类的新实例。 配置文件中包括客户端的Host、Credentials 和 Port 属性。
9.3.5 SmtpClient类 (2)SmtpClient(string serverName):指定SMTP 服务器,服务器端口默认为25。例如: SmtpClient client = new SmtpClient(“smtp.126.com"); client.Send(message); (3)SmtpClient(string serverName,int port):指定SMTP服务器和端口。例如: SmtpClient client = new SmtpClient(“smtp.126.com", 25); client.Send(message);
9.3.5 SmtpClient类(续) 2. 常用属性 Credentials属性:获取或设置验证发件人身份的凭据。 EnableSsl属性:是否使用安全套接字层加密连接。 Port属性:获取或设置SMTP服务器端口 TimeOut属性:获取或设置发送的超时时间。 3. 常用方法与事件: Send方法:采用同步方式发送电子邮件。 SendAsync方法:采用异步方式发送电子邮件。 SendAsyncCancel方法:取消异步发送。 SendCompleted事件:异步发送完成时触发。
9.3.6 邮件附加信息类 System.Net.Mime命名空间包含用于表示Multipurpose Internet Mail Exchange(MIME,多用途因特网邮件扩展)标头的类型。 使用SmtpClient类发送电子邮件时与System.Net.Mail命名空间中的类联合使用,用于指定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 同步方式收发邮件举例 • 同步发送邮件实现步骤 • 创建SmtpClient对象,设置Smtp服务器和端口信息;P233 • 设置SmtpClient对象是否启动身份验证;若启用则设置身份凭据信息;设置SmtpClient对象的其他属性;P233 • 创建MailMessage对象,设置地址、首部、主体、优先级和附件等信息;P232 • 调用SmtpClient的Send方法实现邮件的发送
9.4.1 同步方式收发邮件举例(续) 例9-2:同步接收。运行效果
9.4.1 同步方式收发邮件举例(续) • 同步接收的实现要点 • 接收邮件服务器的地址设置; P236 • 一般形式 POP3.XX 例如:POP3.126.com • 创建TCPClient对象与邮件服务器建立连接; • tcpClient.Connect(“POP3.126.com”,110); • 客户端向服务器发送命令,然后接收服务器发回的响应信息,并做相应的处理; P236 • 一问一答方式
9.4.2 异步方式收发邮件 异步发送邮件的代码和同步发送的代码不同的地方在于: 发送电子邮件时使用的是SmtpClient类提供的异步发送方法SendAsync 若要取消异步发送电子邮件则调用SmtpClient类的SendAsyncCancel方法 当异步发送邮件操作完成时触发SendCompleted事件,可以在该事件中判断邮件是否发送成功。 具体程序见源码
9.4.2 异步方式收发邮件 异步接收邮件通过TCP的异步编程实现。异步接收邮件与同步接收邮件不同的地方在于客户端的异步连接、异步发送数据和异步接收数据。 1. 异步连接 异步建立连接通过使用TcpClient类的BeginConnect方法和EndConnect方法来实现。
9.4.2 异步方式收发邮件 • 2. 异步发送数据 使用NetWorkStream类中的BeginWrite方法和EndWrite方法可以实现异步发送数据。 • 3.异步接收数据 使用NetWorkStream类中的BeginRead方法和EndRead方法可以实现异步发送数据。
9.4.2 异步方式收发邮件举例(续) 异步接收。运行效果:
本章作业与实验 • 本章作业 习题2 • 本章实验 无对应的实验