因特网电子邮件系统(email)
组成部分
- 用户代理 邮件客户端,允许用户阅读,回复,转发,保存,撰写报文(电子邮件)
- 邮件服务器 每个邮件接收方都在某邮件服务器上有一个邮箱,邮箱存储发给该用户的Email,邮箱的消息队列存储等待发送的Email
- 简单邮件传输协议,SMTP 邮件服务器之间传递消息所使用的协议
- 发送方代理和发送方服务器间,可通过SMTP,HTTP协议推送报文;
- 发送方服务器和接收方服务器间,通过邮件传输协议SMTP推送报文;
- 接收方服务器和接收方代理间,可通过邮件访问协议,如POP3,IMAP,HTTP等拉取报文;
SMTP简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)
用于从发送方邮件服务器发送报文到接收方邮件服务器
参见 [RFC 5321]
古老(1982年有正式RFC文档,但事实上早在此前出现),限制报文的体只能用ASCII表示。传输现代多媒体附件时,要将多媒体数据编码为ASCII码,用SMTP传输完毕后再解码还原为多媒体数据。
SMTP一般不使用中间邮件服务器发送邮件,即使两服务器相距甚远也会尝试直接建立连接。
依赖TCP运输层协议,端口:25,使用持久性连接
要求消息必须由7位ASCII码构成
SMTP通信双方在TCP连接建立之后,还会进行应用层的握手,SMTP客户端会指示收发双方的邮件地址。
SMTP服务器利用CRLF.CRLF确定消息的结束。
若SMTP发送方服务器有多个发往同一接收服务器的报文,它会在同一TCP连接内传输,但在每个报文发送前都进行应用层握手(声明邮件的收发双方)
命令/响应交互模式
- 命令(command): ASCII文本
- 响应(response): 状态代码和语句
拉协议(pull protocol)
用户依据协议从服务器上拉取信息,连接由文件接收方发起。如HTTP(的主要功能)
推协议(push protocol)
用户依据协议把文件推送到服务器上,连接由文件发送方发起。如SMTP
SMTP对比HTTP
同:都用于主机间的文件传输
异:
- HTTP主要是拉协议,SMTP主要是推协议。
- HTTP无编码限制,SMTP要求每个报文(包括报文体)使用7比特的ASCII码格式。
- 对于由多个对象组成的文档,HTTP将每个对象封装到独立的报文中,而SMTP把所有报文对象放在一个报文内。
Email消息格式
定义邮件消息本身的格式,包括首部行和报文体
参见 [RFC 5322]
头部行(header)
- To
- From
- Subject 主题,可选的
email头部行不同于SMTP中的命令,尽管它们可能冗余了同样的信息。email from,to头部行是email报文的一部分,而SMTP的from,to命令是SMTP握手协议的一部分。
空行 分隔
消息体(body)
消息本身,只能是ASCII字符
Email消息格式:多媒体扩展 MIME
MIME:多媒体邮件扩展 RFC 2045, 2056
通过在邮件头部增加额外的行以声明MIME的内容类型
额外的头部行包括数据编码方法,多媒体类型,子类型,参数等。
邮件访问协议
用于接收方从接收方邮件服务器上拉取报文。
常用邮件访问协议:
- Post Office Protocol-Version 3,POP3
- Internet Mail Access Protocol,IMAP
- HTTP
POP协议
极为简单的邮件访问协议。带有认证/授权和下载功能。
参见 [RFC 1939]
POP3的包括 特许,事务处理,更新三个阶段
POP3是无状态的
服务器响应
- +OK [可选的数据]
- -ERR
认证过程
用户代理以明文形式发送用户名和口令以鉴别用户
客户端命令
- User:声明用户名
- Pass: 声明密码
事务阶段
用户代理拉取报文
获取服务器上的报文信息
将报文标记为待删除
- List:列出消息数量
- Retr:用编号获取消息
- Dele: 删除消息
- Quit
更新阶段
发生在用户发出quit命令后,删除那些被用户标记为待删除的报文
IMAP协议
比POP3功能更为强大也更为复杂的邮件访问协议
所有消息统一保存在一个地方:服务器
允许用户利用文件夹组织消息
IMAP支持跨会话(Session)的用户状态
HTTP协议
现今基于Web的电子邮件都使用HTTP协议,此时用户代理就是普通的浏览器。
用户和邮件服务器间的报文传输都通过HTTP进行,而邮件服务器间的报文传输仍通过SMTP进行。
邮件发送过程
- 发送方用户代理用SMTP(或HTTP)将邮件推送至发送方邮件服务器;
- 发送方邮件服务器用SMTP将邮件推送至接收方邮件服务器;具体地,发送方邮件暂存与发送方邮件服务器中,发送方邮件服务器会周期性的尝试连接接收方服务器,若多次尝试失败,则返回给发送方一个错误信息
- 接收方邮件服务器分发邮件给接收方;具体地,接收方通过邮件访问协议从接收方邮件服务器上拉取邮件。