互联网应用笔记(八)
Email Basics
Electronic Mail (email, e-mail)
提供一种将电子消息从一个人异步发送到另一个人的方法
Email service can be provided by
ISPs: @126.com, @163.com, @sina.com, @yahoo.cn, …
Corporations and institutes: @baidu.com, @bupt.edu.cn, @ietf.org, …
Bundled with other services: @139.com, @qq.com
Components Of Email System
Spooling :按队列存储邮件
UA (User Agent)
end-user mail program
Interface between the end users and the email servers
用户和电子邮件服务器之间的接口
E.g., outlook, foxmail,
Mail Server
Responsible for transmitting/receiving emails and reporting status information about mail transferring to the mail sender
Both a client and a server
- Email protocols(发送接收不一样)
SMTP: used for sending an email
POP3/IMAP: used for receiving an email
Composition——是指创建消息和答案的过程。
Transfer ——指将信息从发送者传送到接收者。
Reporting——指通知发送者消息发生了什么情况的过程。
Displaying-显示信息的方式。
Disposition——指信息被接收方阅读后发生的情况
Mailboxes – created by the user to store incoming email.邮箱
Mailing lists – means of sending identical emails to a group
指向一组邮箱
MTA (Mail Transfer Agent) – SMTP servers and clients provide a mail transport service
Email Sending
要发送电子邮件消息,用户必须提供消息、目的地地址和可能的其他一些参数(例如,安全性或安全级别)。
Email Address
Many user agents expect DNS addresses of the form mailboxname@domain.
Each email address is unique on the Internet because
Domain name is unique on the Internet
Mailboxname is unique in the domain
Email Reading
通常,当用户代理启动时,在屏幕上显示任何内容之前,它将查看用户的邮箱以查找传入的电子邮件
然后,它可以宣布邮箱中的消息数量,或者显示每条消息的一行摘要,并等待命令
Email Standards
Internet Message Format 定义格式
SMTP (Simple Mail Transfer Protocol)
POP (Post Office Protocol)
IMAP (Internet Message Access Protocol)
MIME (Multipurpose Internet Mail Extension) 扩展功能
Internet Message Format
Message envelop
包含完成传输和交付所需的任何信息
Message contents
包含要传递给接收者的对象
Headers: from, to, subject, date, postmarks
Blank line
Body: actual message, may have many parts
每个报头字段由一行ASCII文本组成,其中包含字段名、冒号和大多数字段的值
eg. from:abc@gmail.com
在正常使用中,用户代理构建一条消息并将其传递给MTA
然后MTA使用一些报头字段来构造实际的信封
用户提供正文和密钥头,而邮件系统提供其余部分
字段定义
originator fields 跟发送者相关的字段
- reply-to回复到哪个地址去
Destination adress fields 目的地址字段
- Cc 抄送
- Bcc 秘送,用户收到的时候能看到To和Cc的地址,但是看不到Bcc里面的邮件地址
Identification fields 跟身份认证相关的字段
- Message-ID 标识符
- Reference 跟邮件相关的其他的message-id
Information fields
- subject 主题
- keywords 关键词
Trace fields
- received 记录邮件经历的路径
- return-path 指定回复的路径
SMTP
The source machine establishes a TCP connection to Port 25 of the destination machine
- 发送端和接收端都用:**==TCP Port 25==**
- SMTP服务器对这个端口进行监听
- 接受传入的连接
- 通过连接接收消息
- 如果消息无法传递,则向发送方返回一个错误报告,其中包含无法传递的消息的第一部分
- SMTP是ASCII协议
- 建立连接后,作为客户端等待接收端先发消息。server先发消息
通信的三个阶段
- 建立连接
- 邮件传送
- 释放连接
基本命令
- 标识domain name
- 标识发送者邮箱
- 标识接收者邮箱,多个可以发送多次rcpt to
- “\r\n”标识换行,一行的结束;period
.
标识邮件的结尾 - QUIT 关掉连接
扩展命令
EHLO
(Extended Hello): 与HELO功能相同。支持地址文字及IPv4地址- VRFY:确认名称是有效的收件人(确认是否地址是否有效)
- EXPN:邮件列表展开
- NOOP:回复一个肯定的回复码
- RSET:中止当前事务
- HELP:使服务器向客户端发送帮助性的信息
状态码
服务器用一个3位数的代码作为响应的状态码
- 2开头——成功
- 3开头——成功但需要更多信息
- 4开头——错误 但是是临时的
- 5开头——错误 永久性的错误,没法进行修正
可以看到是server先发消息
HELO发域名
左发送端mailserver 右边接收端mailserver
建立TCP连接,三次握手
Server先发送220
client发送HELO 标识发送端域名
250 beta.gov表示成功,带上了自己的域名
定义关键字段 MAIL FROM 定义发送者邮箱
RCPT TO定义接收端邮箱,多个发送多次
550 No such user here 永久性的错误,该邮箱用户不存在
发送data
354 告知邮件以什么表示结尾
message 一行一行发,最后以一个“.”结尾,server知道发送结束了
QUIT 关掉connection
221 告知关闭成功
例子:使用Telnet模拟邮件发送过程 (TELNET登录邮箱)
建立连接 telnet smtp.163.com 25
helo mail.163.com
用了base64对用户名和密码进行了编码加密,秘文
message符合要求:空白行、点结束
SMTP的限制
- 只能用ASCII格式
- 没有很好的身份证认证的机制
- 所有的消息都是明文的,可以被抓包解析
- 很容易产生垃圾邮件,或者伪造邮件发送者的地址,难以追踪
接收协议 POP/IMAP
POP
两个协议都是:用于将邮件从==邮件服务器发送到UA==
端口:110
POP
基本功能:
- ==存储和转发==(store and forward)
- 邮件存储在服务器,客户端连接,然后下载到客户端。可以在服务器上留下一个副本。
- 过去:下载到客户端之后就删掉
- 现在:支持保存
- 邮件存储在服务器,客户端连接,然后下载到客户端。可以在服务器上留下一个副本。
特点:协议简单,应用广泛。
- 许多客户端可用,如Eudora, foxmail, outlook
问题:对移动端用户或使用多台机器的用户来说非常糟糕
常用版本:POP3
POP3
类似于SMTP,使用命令/回复lockstep协议
用于检索单个用户的邮件
- 需要身份验证
命令和应答都是ASCII行
- 回复以“+OK”或“-ERR”开头
- 回复可以包含多行
POP3 命令
获取邮箱状态
大小 size 一封一行,终止“.”
获取邮件
删掉
NOOP 发送消息给server
RSET 制定删掉的标记
QUIT 关闭连接
例子:通过Telnet模拟收取邮件的过程
IMAP
- 文件夹和消息可以存储在服务器上,也可以存储在本地计算机上。
- 由于文件夹可以保留在服务器上,所以即使更换了设备,也可以访问相同的邮件存储。
- 对于移动用户来说比POP更好(因为邮件仍然在服务器上)
- 选择性下载需要的文件到本地当中
QQ/163/gmail支持IMAP和POP3
POP与IMAP的对比
POP3设计考虑本地
IMAP更多考虑移动端的场景
copy是把邮件直接放到UA
Copy模式:IMAP仍然会给在服务器上保存
RFC不一样
**==TCP==**端口不一样
- POP:**==110==**
- IMAP:**==143==**
邮件存储地,实际上都支持存储在服务器和本地PC,这里说的是设计最初考虑的场景,更倾向于哪种
邮件在哪里读取:POP3 离线,不用联网就能读取
邮件同步:POP3不做邮件同步;IMAP支持邮件同步
方向:
- POP3单向,邮件下载本地,本地任何操作都不会反馈到服务器中;
- IMAP本地任何操作都会同步到服务器
移动端用户友好性:POP3没有那么支持;IMAP支持
部分邮件下载:IMAP支持选择性下载
POP3更快,不需要联网,IMAP连接会受网络影响
MIME
MIME (Multipurpose Internet Mail Extension):
- 多用途互联网邮件扩展【**==支持邮件内容多样化==**】
解决的问题:
- 最初,电子邮件完全是用英语写的、用ASCII表示的文本信息(RFC 5322)。
- 现在,这种方法已经不合适了,因为:
- 使用有重音语言的消息(例如ö, ç, ğ)
- 使用非拉丁字母的消息
- 使用没有字母的语言的消息
- 消息完全不包含文本——音频/视频
MIME 特点
扩展支持:多部分(multipart)和多媒体(multimedia)电子邮件
增加文件头部定义的内容
- type:(文本,图像,音频,视频,应用程序)和子类型内(如文本/html,图像/gif)
- encoding:(ASCII,引用可打印,base64)处理任意二进制数据时,电子邮件系统只能处理普通ASCII字符
没有改变原来的邮件系统,传输的仍然是ASCII码字符,但是现在目的是将原来不是ASCII的内容转换成ASCII字符【将多样化的内容依靠特定编码方式转换喂ASCII码传输】
MIME的基本思想是使用ASCII格式(RFC 5322),但为消息体添加结构并为非ASCII消息定义编码规则
通过不偏离RFC 5322,可以使用现有的邮件程序和协议发送MIME消息
MIME 新引入的headers
==MIME-Version==:告诉接收用户代理它正在处理的是MIME消息以及它使用的是MIME的哪个版本——任何不包含MIME-version的消息都被认为是英文纯文本消息
*==Content-Description==*:是一个ASCII字符串表明该消息是什么
==Content-Id==:header的唯一标识符
*==Content-Transfer-Encoding==*:说明Body的编码方式
*==Content-Type==*:说明内容的类型和子类型
不含格式 plain
根据格式分子类
mixed 每个部分都是独立的
根据客户端发送顺序,将客户端进行展示
MIME 例子
版本号、包含多部分/多类型混合、空白行隔开header和body
多部分,每个部分都要有自己的header
邮件包含 文本和附件