- 3.1 因特网客户端简介
- (1)因特网客户端是什么?
- 用来传输数据的地方,数据在服务提供者和服务使用者之间传输
- (2)“生产者-消费者”的概念
- 一般用途:描述操作系统方面的内容
- 本章解释:
- 服务器:生产者,提供服务
- 客户端:消费者,使用服务
- 对特定的服务,一般只有一个服务器(即进程/主机等),但有多个消费者
- (3)本章目的
- 介绍多个因特网协议。
- 3.2 文件传输
- 3.2.1 文件传输因特网协议
- 用于在因特网上传输文件的协议
- FTP:文件传输协议
- 上传或下载文件,需要输入有效的用户名和密码,但也允许匿名登录。
- 多用户概念(UNIX)
- UUCP:UNIX到UNIX的复制协议
- HTTP:用于web的超文本传输协议
- 基于web的文件下载以及访问web服务
- 大部分http文件传输请求都用于获取网页(即将网页文件下载到本地)
- 一般客户端无需登录就可以访问服务器上的文件和服务
- rcp:UNIX下的远程文件复制命令(以及更安全、更灵活的scp和rsync)
- scp和rsync需要用户登陆到服务器主机,在传输文件之前必须验证客户端身份,否则无法上传或者下载文件
- FTP:文件传输协议
- 用于在因特网上传输文件的协议
- 3.2.2 文件传输协议FTP
- (1)用途
- 匿名下载公共文件
- 在两台计算机之间传输文件(特别在使用Windows工作,文件存储系统使用UNIX的情况下)
- (2)匿名登录和用户名密码登录的区别
- 匿名登录:
- 用户名:anonymous
- 密码:用户的电子邮件地址
- 特点:公开某些目录让大家共同访问
- 缺陷:与登录用户相比只能使用有限的几个FTP命令
- 限制:管理员要先设置FTP服务器以允许匿名登录
- 用户名密码登录
- 特点:
- 可通过FTP向特定登录用户传输文件
- 可使用的FTP命令更多
- 特点:
- 匿名登录:
- (3)FTP的工作流程
-
- ①客户端连接远程主机上的FTP服务器
- ②客户端输入用户名和密码(或“anonymous”和电子邮件地址)
- ③客户端进行各种文件传输和信息查询操作
- ④客户端从远程FTP服务器退出,结束传输
- ⑤中断的情况
- 1)网络两边计算机崩溃——传输完成前中断
- 2)客户端超过15min(900s)没响应,FTP连接超时中断
-
- (4)FTP连接的具体细节
-
1)在底层,FTP只使用TCP不使用UDP
-
2)FTP的客户端和服务器使用两个套接字通信:
-
21号端口:控制和命令端口
-
20号端口:数据端口
-
-
3)FTP的两种模式
-
主动:
-
只有在主动模式下,服务器才使用数据端口
-
即服务器主动连接客户端的数据端口
-
-
被动:
-
服务器只是告诉客户端随机的数据端口号
-
客户端必须主动建立数据连接
-
-
-
- (1)用途
- 3.2.3 python和FTP
- (1)流程
- ①连接到服务器
- ②登录
- ③发出服务请求(希望得到响应)
- ④退出
- (2)相关模块
- ①导入ftplib模块
- ②实例化一个ftplib.FTP的类对象
- ③所有得FTP操作(登录、传输文件、注销)都要使用这个对象完成
- (1)流程
- 3.2.4 ftplib.FTP
- (1)表3-1 FTP对象的方法
- (2)在一般的FTP事务中,常用到的:login(),cwd(),dir(),pwd(),stor*(),retr*()和quit()
- 3.2.5 交互式FTP示例
- 3.2.6 客户端FTP程序示例
- P79示例3-1
- 3.2.7 FTP的其他内容
- (1)主动模式和被动模式
- 在python2.0以前的版本中有被动模式默认关闭
- 在python2.1以后的版本中,默认打开
- (2)典型的FTP客户端
- 命令行客户端程序
- GUI客户端程序
- 工具包:Tk、wxWidgets、GTK、Qt、MFC甚至Swing(需要导入Python或Jython模块)来创建
- web浏览器
- urllib模块解析
- 自定义应用程序
- (1)主动模式和被动模式
- (1)因特网客户端是什么?
- 3.3 网络新闻
- 3.3.1 Usenet与新闻组
- (1)是什么
- Usenet新闻系统是一个全球存档的“电子公告板”
- 大量计算机组成
- 计算机之间共享Usenet上的帖子
- 一个用户发帖,所有相连计算机均可接收
- 帖子在Usenet上存活时间有限
- 每个系统设置已“订阅”的新闻组列表——就像哔站的关注频道一样
- 内容由提供者安排、服务公开、特定服务特定用户(VIP)、可设置只能上传/下载
- 老版本UUCP
- 新版本TCP/IP
- (1)是什么
- 3.3.2 网络新闻传输协议
- 协议特点
- 客户端/服务器架构
- 只使用一个标准端口119进行通信
- FTP中,登录、传输数据和控制需要使用不同的端口
- 用户发一个请求,服务器就响应一次
- 协议特点
- 3.3.3 Python个NNTP
- (1)用到的库和类
- 库:nntplib库
- 类:nntplib.NNTP类(需要实例化)
- (2)操作流程
- ①连接到服务器
- ②登录(根据需要)
- ③发出服务请求
- ④退出
- (1)用到的库和类
- 3.3.4 nntplib.NNTP类方法
- P83页表3-2
- 3.3.5 交互式NNTP示例
- 3.3.6 客户端程序NNTP示例
- 3.3.1 Usenet与新闻组
- 3.4 电子邮件
- 3.4.0 概述
- (1)电子邮件的定义
- RFC2822:(电子邮件)消息由头字段(统称消息标题)以及后面可选的正文组成
- 邮件可以没有正文,但一定要有标题
- (1)电子邮件的定义
- 3.4.1 电子邮件系统组成和协议
- (1)出现时间
- 在因特网诞生之前出现(不同主机用户之间交换消息)——用户使用同一台计算机,所以没有涉及网络
- 网络出现后(不同主机之间交换消息)
- (2)电子邮件怎么工作
- 发送计算机
- 中间主机(跳板)
- 接收计算机
- (3)电子邮件系统的各组件
- 1)消息传输代理(MTA)
- 是什么:在邮件交换主机上运行的服务器进程
- 做什么:邮件的路由、队列处理和发送工作
- 特点:它就是从发送主机到接收主机所要经过的主机和跳板
- 需要怎么做:
- ①要知道如何找到消息应该到达的下一台MTA
- 由域名服务DNS来查找目的域名的MX(Mail eXchange,邮件交换)来完成
- ②要知道如何与另一台MTA通信
- MTA靠某种协议进行通信
- 只有两个MTA都使用同一个协议时,才能进行通信
- MTA之间通过消息传输系统(MTS)互相通信
- MTA靠某种协议进行通信
- ①要知道如何找到消息应该到达的下一台MTA
- 1)消息传输代理(MTA)
- (1)出现时间
- 3.4.0 概述
-
- 3.4.2 发送电子邮件
- (1)SMTP、ESMTP、LMTP
- SMTP:
- 简单邮件传输协议
- ESMTP
- 在SMTP的基础上增加扩展服务
- LMTP
- 本地邮件传输协议
- 基于SMTP、ESMTP
- SMTP需要有一个邮件队列,会增加额外的存储和管理工作
- LMTP移除了对邮件队列的需求,提供了更轻量级的系统,但邮件需要立刻发送
- SMTP:
- (2)MTA
- 开源MTA:Sendmail、Posrfix、Exim、qmail
- 商业MTA:Microsoft Exchange、Lotsus Notes Domino Mail Server
- SMTP是在因特网上的MTA之间信息交换的最常用MTSMTA
- (1)SMTP、ESMTP、LMTP
- 3.4.3 python和SMTP
- (1)相关模块和类
- smtplib模块
- smtplib.SMTP类(需要实例化)
- (2)流程
- ①连接到服务器
- ②登录(根据需要)
- 只有在服务器启动了STMP身份验证(SMTP-AUTH)时才要登录
- ③发出服务请求
- STMP通信时只要一个端口
- ④退出
- (1)相关模块和类
- 3.4.4 smtplib.SMTP类方法
- (1)另外两个类
- SMTP_SSL:类似SMTP,通过加密的套接字通信循环可以作为SMTP/TLS的替代品
- LMTP:实现了LMTP(本地邮件传输协议)
- (2)SMTP客户端所需要的方法
- sendmail(from,to,msg[,mopts,ropts])
- quit()
- 其他见P93表3-3
- (1)另外两个类
- 3.4.2 发送电子邮件
-
- 3.4.5 交互式SMTP示例
- 3.4.6 SMTP的其他内容
- (1)SMTP协议定义/规范:RFC 5321
- (2)如何正确设定因特网地址的格式和电子邮件消息——查看因特网消息格式规范RFC5322
- (3)python对SMTP模块的支持
- 3.4.7 接收电子邮件
- MUA(邮件用户代理)
- 定义:在家用电脑中运行的应用程序
- 功能:能够周期性的把邮件下载到本地计算机,以供离线使用
- 要求:MUA也必须能发送邮件
- 即发邮件的时候,应用程序要能直接使用SMTP与MTA通信
- MUA(邮件用户代理)
- 3.4.8 POP和IMAP
- (1)POP协议
- 名称:邮局协议(post office protocal)
- 功能:下载邮件
- 目的:让用户的工作站可以访问邮箱服务器里的邮件,并在工作站中,通过SMTP将邮件发送到邮件服务器
- 缺点:POP无法很好的应对多邮件客户端
- (2)IMAP协议
- 名称:因特网消息访问协议(internet message access protocol)
- 因特网邮件访问协议
- 交互式邮件访问协议
- 临时邮件访问协议
- 目的:提供比POP更完整的解决方案
- 特点:可适用于用户在不同设备上使用电子邮件的场景
- 当前版本2003:IMAP4rev1
- 名称:因特网消息访问协议(internet message access protocol)
- (1)POP协议
- 3.4.9 python和POP3
- (1)导入模块
- 模块:poplib
- 类:poplib.POP3
- (2)流程
- ①连接到服务器
- ②登录
- ③发出服务请求
- ④退出
- (3)邮件传输过程图解
- (1)导入模块
-
- 3.4.10 交互式POP3示例
- 3.4.11 poplib.POP3类方法
- (1)user()方法
- 像服务器发送用户名,还会等待并显示服务器的响应,表示服务器正在等待输入该用户的密码
- (2)pass()方法
- 在用户使用user()登录后,发送passwd。
- 验证失败:抛出poplib.error_proto异常
- 验证成功:得到一个以"+"号开头的应答消息,然后锁定该邮箱,直到调用quit()方法
- (3)list()方法
- 从服务器返回以三元组表示的整个消息列表(rsp,msg_list,rsp_siz),分别为服务器的响应、消息列表、返回消息的大小
- msg_list的格式为[‘msgnum msgsiz’,...],分别表示每个消息的编号和消息的大小
- (4)其他方法
- P98表3-4
- (1)user()方法
- 3.4.12 客户端程序SMTP和POP3示例
- P98页示例3-3
- 3.4.13 python和IMAP4
- (1)相关模块
- 模块:imaplib
- 类:imaplib.IMAP4
- (2)流程:
- 连接服务器-登录-发出服务请求-退出
- (3)imaplib模块中定义的类
- IMAP4、IMAP_SSL、IMAP4_stream——可以用来连接任何兼容IMAP4的服务器
- IMAP4_stream——可以通过类似文件的对象接口与IMAP4服务器交互
- (1)相关模块
- 3.4.14交互式IMAP4示例
- 3.4.15 imaplib.IMAP4类中的常用方法
- 见P101表3-5
- 3.5 实战
- 3.5.0 关于电子邮件实战的总结
- (1)一封电子邮件的旅程
- 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
- (2)要编写程序来发送和接收邮件,本质上就是:
- 编写MUA把邮件发到MTA——SMTP
- 编写MUA从MDA上收邮件——POP3和IMAP4
- (3)收邮件
- 第一步:用poplib把邮件的原始文本下载到本地;
- 第二部:用email解析原始文本,还原为邮件对象。
- (1)一封电子邮件的旅程
- 3.5.1 生成电子邮件
- (1)内容扩展
- MIME(邮件消息扩展格式):用来识别较长消息的不同部分
- email包:
- 适合处理并管理整个电子邮件消息的MIME部分
- 它有多个组件,分别用来解析和生成电子邮件
- 本节使用:
- email包和smtplib包
- (2)生成电子邮件示例
- P103页3-4
- (1)内容扩展
- 3.5.2 解析电子邮件
- (1)用到的工具
- email.message_from_string()函数:用来解析消息
- message.walk():遍历消息附件
- message.getpayload()方法:从消息正文中获取特定的部分。通常参数decode会被设为True,表示邮件正文根据每个Content-Transfer-Encoding头解码
- (2)典型代码模式
- P105页
- (1)用到的工具
- 3.5.3 基于web的云电子邮件服务
- (1)通用电子邮件服务——来自ISP
- 举例:SMTP、POP、IMAP
- 特点:需要每月支付使用因特网服务
- (2)基于web的公开电子邮件服务
- 举例:Yahoo!Mail和Google的Gmail服务
- 特点:SaaS(Software as a Serveice,软件即服务)类型的云服务
- 无需每月支付费用
- 广告费
- Gmail:
- 使用算法扫描电子邮件消息,对内容进行评价,然后通过优秀的机器学习算法来精准的投放广告
- 特点:更加吸引用户、纯文本、电子邮件消息面板右边
- Yahoo!
- 用图片的方式投放广告,这些图片会被嵌入到web应用中
- 特点:
- 不精确,收益少
- 有些服务需要付费订阅,这样才能下载电子邮件
- Yahoo!不想用户很方便的就移动他们的电子邮件
- Gmail:
- (1)通用电子邮件服务——来自ISP
- 3.5.4 最佳实践:安全、重构
- (1)代码重构的关注点
- ①在实际开发环境中,web上的连接需要加密,相应的代码中使用的协议也要加密
- IMAP4->IMAP4_SSL
- POP3->POP3_SSL
- SMTP->SMTP_SSL
- ②不能外代码中直接用纯文本保存登录名和密码
- 登录名和密码的获取方式:
- 安全的数据库中获取
- 编译后的字节码文件获取(.pyc或.pyo文件)
- 从公司内联网中的服务器代理获取
- 登录名和密码的获取方式:
- ③邮件消息头和正文的表示:用列表替代字符串
- 因为实际中,消息正文由应用生成或控制,不是硬编码的字符串
- 使用列表可以方便增删数据
- ④邮件的收件人可能不止一个:to的变量类型也改成了列表
- ⑤小知识点:调用timeit可以知道两种代码(完成相同工作)哪个效率更高
- ①在实际开发环境中,web上的连接需要加密,相应的代码中使用的协议也要加密
- (2)实际代码在P106页
- (1)代码重构的关注点
- 3.5.5 Yahoo!Mail
- (1)代码在P108页
- (2)代码执行的前提条件:
- 需要一个Yahoo!Mail Plus账号
- 付费用户且python版本在2.6.3及以后(解决办法:使用异常抛出)
- 非付费用户执行代码会报错
- (3)重构后的代码
- P110页示例3-5
- 3.5.6 Gmail
- (1)特点
- 所有访问都是免费的
- 提供了使用传输层安全(TLS)的SMTP
- (1)特点
- 3.5.0 关于电子邮件实战的总结
- 3.6 相关模块
- 3.6.1 电子邮件相关
- P115页表3-6
- 3.6.2 其他因特网客户端协议
- P116页表3-7
- 3.6.1 电子邮件相关