Python网络编程:E-mail服务(一)原理篇
2015-04-22 22:10
323 查看
简介
很多程序员都遇到过这样的需求,就是以自动的方式产生并发送邮件,Python提供了相关的模块支持邮件的编码和发送等相关功能。为了更好的编写相关的E-mail服务,我们需要更深入的了解相关的原理。本文简要介绍E-mail服务的原理,讲解邮件编码和邮件传输的基本知识,相信相关内容能够加深对E-mail的认识。E-mail服务的总体流程
用户Bob通过E-mail客户端程序编写了邮件,准备发送给mary@her.com。客户端程序会按照相关的标准对邮件内容进行编码,以便于邮件传输协议进行传输。客户端程序通过简单邮件传输协议SMTP(Simple Mail Transfer Protocol)将邮件发送给Bob的ISP的邮件服务器器。Bob的ISP邮件服务器查看邮件,得知是发给Mary的ISP邮件服务器,会通过DNS服务,解析其服务器的IP地址,并通过SMTP将邮件转发给它。Mary的ISP邮件服务器接收到相关邮件会进行转储。当Mary的客户端程序启动后,会与其邮件服务器进行交互,通过POP3或IMAP协议从邮件服务器上查看和下载邮件,并将其根据邮件编码格式显示给用户Mary。这样,就完成了一次完整的邮件发送和接收过程。整个过程可以参考下面的示意图(google搜索到的一张图片):从上面的邮件服务的过程看,一封邮件从发送到接收,经过
1. 邮件编码
2. 邮件的传输
3. 邮件查看和下载
4. 邮件解码
TCP/IP协议栈分别为这些过程定义相关的标准和协议,下面我们会对其进行逐一介绍。
邮件编解码
邮件格式有RFC 822 - Standard For The Format of ARPA Internet Text Message定义,使用空行分隔邮件的首部和主体部分。此协议已被最新的RFC 2822 - Internet Message Format取代。RFC2045 - Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies提供了使用邮件传输协议传输任意数据的机制,MIME在电子邮件首部中增加一行,用来定义数据类型和使用的编码。关于MIME,因为其非常重要,将会有专门的文章来讲解。在此,只需要理解,MIME是用来定义数据类型和编码的即可。机器间交互邮件的标准SMTP
TCP/IP协议栈定义了机器间交互邮件的标准SMTP(Simple MailTransfer Protocol),其着重关注底层邮件交付系统如何将邮件从一台机器传到另一台机器。客户和服务器间的连接使用可读的ASCII文本组成。邮件检索和邮箱操纵协议
允许远程用户从邮件服务器永久邮箱检索邮件,并允许用户操纵邮箱内容(如永久删除邮件)。邮局协议POP
把邮件从永久邮箱传输到本地计算机的最流行的协议成为邮局协议(Post Office Protocol)版本3,即POP3。用户激活一个POP3客户,该客户创建一个TCP连接,连接具有邮箱的计算机上的POP3服务器。用户首先发送登录名和口令,以鉴别该会话。一旦接受了鉴别,用户客户则可以发送命令,检索一个或多个邮件的副本,或者从永久邮箱里删除邮件。邮件按RFC 822标准格式的文本文件进行存储和传输。注意,带有永久邮箱的计算机必须运行两个服务器,SMTP服务器接受一个用户的邮件,并把传入的每个邮件添加到该用户的永久邮箱中,POP3服务器允许用户从邮箱中提取邮件并将其删除。为了确保操作正确,这两个服务器必须协调对邮箱的使用,如果邮件通过SMTP到达的同时用户通过POP3提取邮件,邮箱必须能够保持有效状态。
Internet邮件访问协议IMAP
Internet邮件访问协议(Internet Message AccessProtocl)版本4 IMAP4,是POP3的一种替代协议,与POP3不同的是,IMAP4允许用户动态创建、删除或重命名邮箱。它同时提供了邮件检索和处理的扩展功能。总结
讲到这里,大家应该对E-mail有一个总体的认识:为了是不同的客户端程序和邮件服务器能够理解邮件,需要有相关的编码的标准,主要涉及RFC 822、RFC 2822及MIME相关内容;为了在不同机器间传输邮件,需要定义相关的传输协议,即简单邮件传输协议;客户需要从服务器上查看和下载邮件,定义了POP3和IMAP4协议。由于大部分时候我们遇到的问题是由编写和发送邮件,因此在相关的文章中重点讲解这些相关内容。
相关文章推荐
- Python网络编程:E-mail服务(九) 发送HTML格式邮件
- Python网络编程:E-mail服务(三)MIME解析
- Python网络编程:E-mail服务(八) 实现抄送和密送功能
- Python网络编程:E-mail服务(四) 编写传统邮件
- Python网络编程:E-mail服务(三)MIME解析
- Python网络编程:E-mail服务(五)深入理解email模块的message和MIME类
- Python网络编程:E-mail服务(五)深入理解email模块的message和MIME类
- Python网络编程:E-mail服务(二)传统E-mail格式
- Twisted是python下的用来进行网络服务和应用程序编程的框架
- [python&php 网络编程]通过端口号获取服务名
- Python 网络编程socket说明
- Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题
- Python 网络编程测试-HTML解析
- Python网络编程 1.1 协议栈、编解码、IP
- 入门级最简单的python网络编程源码socket,仅供参考
- .Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室]
- Python -- 网络编程 -- 认识Python3的urllib库
- Python学习笔记(二)网络编程的简单示例
- 网络编程——connect()函数用于无连接的网络服务
- Python网络编程之medusa