目录
- 🕒 1. 电子邮件系统概述
- 🕒 2. 简单邮件传送协议SMTP
- 🕒 3. SMTP协议的命令和响应
- 🕘 3.1 命令
- 🕤 3.1.1 HELO
- 🕤 3.1.2 MAIL FROM
- 🕤 3.1.3 RCPT TO
- 🕤 3.1.4 DATA
- 🕤 3.1.5 QUIT
- 🕤 3.1.6 REST
- 🕤 3.1.7 VRFY
- 🕤 3.1.8 NOOP
- 🕤 3.1.9 TURN
- 🕤 3.1.10 EXPN
- 🕤 3.1.11 HELP
- 🕤 3.1.12 SEND FROM
- 🕤 3.1.13 SOML FROM
- 🕤 3.1.14 SAML FROM
- 🕘 3.2 响应
- 🕒 4. SMTP协议的邮件传输阶段
- 🕒 5. 电子邮件的信息格式
- 🕒 6. 多用途因特网邮件扩展MIME
- 🕘 6.1 概述
- 🕘 6.2 特点
- 🕘 6.3 MIME首部
- 🕘 6.4 MIME内容类型
- 🕘 6.5 MIME传送编码
- 🕒 7. 邮件读取协议
- 🕒 8. POP3协议
- 🕘 8.1 工作过程
- 🕘 8.2 命令
- 🕘 8.3 响应
- 🕘 8.4 三种工作状态
- 🕒 9. 基于万维网的电子邮件
- 🕒 10. 实验
🕒 1. 电子邮件系统概述
电子邮件(e-mail)是因特网上最早流行的一种应用,并且仍然是当今因特网上最重要、最实用的应用之一。
电子邮件把邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱中,收件人可随时上网到自己使用的邮件服务器进行读取。
电子邮件不仅使用方便,而且还具有传递迅速和费用低廉的优点。
现在电子邮件不仅可传送文字信息,而且还可附上声音和图像。
电子邮件系统的三个主要组成构件:用户代理,邮件服务器,以及电子邮件所需的协议
- 用户代理是用户与电子邮件系统的接口,又称为电子邮件客户端软件。
- 邮件服务器是电子邮件系统的基础设施。因特网上所有的
ISP
都有邮件服务器,其功能是发送和接收邮件,同时还要负责维护用户的邮箱。 - 协议包括邮件发送协议(如
SMTP
)和邮件读取协议(如POP3
,IMAP
)。
用户代理 UA (User Agent)
- 用户代理 UA 就是用户与电子邮件系统的接口,是电子邮件客户端软件。
- 用户代理的功能:撰写、显示、处理和通信。
邮件服务器
- 邮件服务器的功能是发送和接收邮件,同时还要向发信人报告邮件传送的情况(已交付、被拒绝、丢失等)。
- 邮件服务器按照客户——服务器方式工作。邮件服务器需要使用发送和读取两个不同的协议。
注:
- 一个邮件服务器既可以作为客户,也可以作为服务器。
- 例如,当邮件服务器 A 向另一个邮件服务器 B 发送邮件时,邮件服务器 A 就作为 SMTP 客户,而 B 是 SMTP 服务器。
- 当邮件服务器 A 从另一个邮件服务器 B 接收邮件时,邮件服务器 A 就作为 SMTP 服务器,而 B 是 SMTP 客户。
🕒 2. 简单邮件传送协议SMTP
简单邮件传送协议SMTP(Simple Mail Transfer Protocol)所规定的就是在两个相互通信的 SMTP 进程之间应如何交换信息。
由于 SMTP 使用客户-服务器方式,因此负责发送邮件的 SMTP 进程就是 SMTP 客户,而负责接收邮件的 SMTP 进程就是 SMTP 服务器。
🕒 3. SMTP协议的命令和响应
SMTP使用命令和响应在用户代理和邮件服务器之间传送邮件。
SMTP 规定了 14
条命令和 21
种应答信息。
- 每条命令用
4
个字母组成 - 每一种应答信息一般只有一行信息,由一个
3
位数字的代码开始,后面附上(也可不附上)很简单的文字说明。
🕘 3.1 命令
命令由用户代理发送给邮件服务器,命令包括关键词,后面跟着零个或多个参数。
一般形式是:COMMAND [Parameter] <CRLF>
命令 | 参数 | 命令 | 参数 |
---|---|---|---|
HELO | 发送方的主机名 | NOOP | —— |
MAIL FROM | 发件人 | TURN | —— |
RCPT TO | 预期的收件人 | EXPN | 邮件发送清单 |
DATA | 邮件的主体 | HELP | 命令 |
QUIT | —— | SEND FROM | 预期的收件人 |
REST | —— | SOML FROM | 预期的收件人 |
VRFY | 收件人名字 | SAML FROM | 预期的收件人 |
🕤 3.1.1 HELO
HELO命令用于用户标识自己,其参数是用户主机的域名。
格式举例:HELO hins.mail.qq.com
🕤 3.1.2 MAIL FROM
MAIL FROM命令用于标识发件人。
命令使用的参数是发件人的电子邮件地址(用户名加上主机的域名)。
格式举例:MAIL FROM: 10001@mail.qq.com
🕤 3.1.3 RCPT TO
RCPT TO 命令用于标识预期的收件人。
命令使用的参数是收件人的电子邮件地址。
若有多个收件人,则该命令要重复使用。
格式举例:RCPT TO: 10001@mail.qq.com
🕤 3.1.4 DATA
DATA 用于初始化数据传输。
在DATA命令后面所有的行都被当作是邮件内容,邮件内容以只包含一个“.
”的行表示结束。
格式举例:
DATA
This is a Test Message。
Please don’t reply.
.
🕤 3.1.5 QUIT
QUIT命令指示结束会话。
格式举例:QUIT
🕤 3.1.6 REST
REST命令用于重置会话,取消当前传输。
所存储的关于发件人和收件人的信息都被删除。连接将被复位。
格式举例:REST
🕤 3.1.7 VRFY
VRFY命令用于验证指定的用户/邮箱是否存在;
由于安全方面的原因,服务器常禁止此命令。
格式举例:VRFY: mayun@mail.qq.com
🕤 3.1.8 NOOP
NOOP命令表示无操作,服务器应响应OK,通常用于测试。
格式举例:NOOP
🕤 3.1.9 TURN
TURN命令用于让发件人和收件人交换位置,即发件人变成收件人,收件人变成发件人。
大多数SMTP服务器并不支持该功能。
格式举例:TURN
🕤 3.1.10 EXPN
EXPN命令用于要求接收邮件的主机把作为参数的发送清单进行扩展,并返回组成清单的收件人的邮箱地址。
格式举例:EXPN:xyz
🕤 3.1.11 HELP
HELP命令用于查询服务器支持的命令。
格式举例:HELP:TURN
🕤 3.1.12 SEND FROM
SEND FROM命令指明邮件是要交付到收件人的终端,而不是邮箱。
若收件人没有登录,邮件就被返回。参数就是收件人地址。
格式举例:SEND FROM: 10001@mail.qq.com
🕤 3.1.13 SOML FROM
SOML FROM 命令指明邮件是要交付到收件人的终端或邮箱。
表示若收件人已登录,邮件就只交付到终端;若收件人未登录,邮件就交付到邮箱。
参数是收件人地址。
格式举例:SOML FROM: 10001@mail.qq.com
🕤 3.1.14 SAML FROM
SAML FROM命令指明邮件是要交付到收件人的终端和邮箱。
表示若收件人己登录,邮件就交付给终端和邮箱;若收件人未登录,邮件就只交付给邮箱。
参数是收件人地址。
格式举例:SAML FROM:10001@mail.qq.com
🕘 3.2 响应
- 响应是从邮件服务器发送到用户代理
- 响应用三位十进制数字表示,后面跟着附加的文本信息。
- 一般形式是:
XXX Readable Illustration
- 下表列出了常用的一些响应。
代码 | 说明 |
---|---|
—— | 正面完成应答 |
211 | 系统状态或系统帮助响应 |
214 | 帮助信息 |
220 | 服务器就绪 |
221 | 服务关闭 |
250 | 要求的邮件操作完成 |
251 | 用户非本地,将转发向 |
—— | 正面中间回答 |
354 | 开始邮件输入,以“.”结束 |
—— | 过渡负面完成回答 |
421 | 服务器未就绪,关闭传输信道 |
450 | 邮箱不可用 |
451 | 放弃要求的操作,处理过程中出错 |
452 | 系统存储不足,要求的操作未执行 |
—— | 永久负面完成回答 |
500 | 语法差错:不能识别的命令 |
501 | 参数格式错误 |
502 | 命令不可实现 |
503 | 错误的命令序列 |
504 | 命令参数不可实现 |
550 | 要求的邮件操作未完成,邮箱不可用 |
551 | 用户非本地,请尝试 |
552 | 过量的存储分配,要求的操作未执行 |
553 | 邮箱名不可用,要求的操作未执行 |
554 | 操作失败 |
🕒 4. SMTP协议的邮件传输阶段
基本工作过程:
连接建立:
当用户代理与SMTP邮件服务器熟知端口25建立了TCP连接后,SMTP邮件服务器准备进入连接建立阶段。该阶段包括3个步骤:
① 邮件服务器发送代码220(表示服务就绪)告诉用户代理已准备好接收邮件。若邮件服务器未就绪,发送代码421(表示服务不可用)。
② 用户代理发送HELO命令,并使用自己的域名地址进行标识。用于将用户的域名通知邮件服务器。
③ 邮件服务器响应代码250(请求命令完成)或根据不同情况给出其它代码。若邮件服务器响应代码250,表示连接建立成功。
邮件传送:
在用户代理与邮件服务器之间建立连接后,发件人可以与一个或多个收件人交换单个邮件。该阶段包括8个步骤:
① 用户代理发送MAIL FROM命令声明邮件的发送人。包括发件人的邮件地址(邮箱和域名)。可以把需要返回邮件地址交给服务器,以便返回差错或报告邮件传递状况时使用。
② 服务器响应代码250(请求命令完成)或其它适当的代码。
③ 用户代理发送RCPT TO命令,需要在参数中声明收件人的邮件地址。
若收件人超过一个,则步骤③和 ④将重复进行。
④ 服务器响应代码250(请求命令完成)或其它适当的代码。若收件人超过一个,则步骤③和 ④将重复进行。
⑤ 用户代理发送DATA命令对邮件的传输进行初始化。
⑥ 服务器响应代码354(开始邮件输入)或其它适当的代码。
⑦ 用户代理用连续的行发送邮件的内容。每一行以二字符的行结束标记(回车和换行)终止,最终邮件以仅有一个点的行结束。
⑧ 服务器响应代码250(请求命令完成)或其它适当的代码。
连接终止:
在邮件传送成功后,用户代理终止连接。该阶段包括两个步骤:
① 用户代理发送QUIT命令
② 邮件服务器响应代码221或其它适当的代码。在连接终止阶段后,TCP连接必须关闭。
🕒 5. 电子邮件的信息格式
电子邮件的信息格式并不是由SMTP定义的,而是在RFC 822中单独定义的。这个RFC文档已在2008年更新为RFC 5322。一个电子邮件有信封和内容两部分。而内容又由首部和主体两部分构成。
🕒 6. 多用途因特网邮件扩展MIME
🕘 6.1 概述
- SMTP协议只能传送ASCII码文本数据,不能传送可执行文件或其他的二进制对象。
- SMTP不能满足传送多媒体邮件(例如带有图片、音频或视频数据)的需要。并且许多其他非英语国家的文字(例如中文、俄文、甚至带有重音符号的法文或德文)也无法用SMTP传送。
- SMTP 服务器会拒绝超过一定长度的邮件。
- 某些 SMTP 的实现并没有完全按照[RFC 821]的 SMTP 标准。
- 为解决SMTP传送非ASCII码文本的问题,提出了多用途因特网邮件扩展MIME (Multipurpose Internet MailExtensions)
🕘 6.2 特点
MIME 并没有改动 SMTP 或取代它。
MIME 的意图是继续使用目前的邮件格式,但增加了邮件主体的结构,并定义了传送非 ASCII 码的编码规则。
- 增加了5个新的邮件首部字段,这些字段提供了有关邮件主体的信息。
- 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。
- 定义了传送编码,可对任何内容格式进行转换,而不会被邮件系统改变。
实际上,MIME不仅仅用于SMTP,也用于后来的同样面向ASCII字符的HTTP。
工作过程:
🕘 6.3 MIME首部
MIME-Version
: 标志 MIME 的版本。现在的版本号是 1.1。若无此行,则为英文文本。Content-Description
: 这是可读字符串,说明此邮件是什么。和邮件的主题差不多。Content-Id
: 邮件的唯一标识符。Content-Transfer-Encoding
: 在传送时邮件的主体是如何编码的。Content-Type
: 说明邮件的性质。
🕘 6.4 MIME内容类型
- MIME标准规定 Content-Type 说明必须含有两个标识符,即内容类型(type)和子类型(subtype),中间用“
/
”分开。 - MIME 标准定义了
7
个基本内容类型和15
种子类型。
类型 | 子类型 | 说明 |
---|---|---|
Text (文本) | plain(纯文字) | 无格式的文本 |
richtext | 含有格式命令的文本 | |
Multipart (多部分) | mixed(混合) | 按规定顺序的几个独立部分部分 |
parallel(并行) | 必须同时读取的几部分 | |
digest(摘要) | 每一个部分是一个完整的RFC 822邮件 | |
alternative(交替) | 不同格式的同一邮件 | |
Message (报文) | rfc822 | 主体是被封装的邮件 |
partial(部分) | 主体是更大邮件的分片 | |
external-body(外部主体) | 主体是到另一个邮件的索引 | |
Image (图像) | jpeg | JPEG格式的图像 |
gif | GIF格式的图像 | |
Video (视频) | mpeg | MPEG格式的视频信号 |
Audio (音频) | basic(基本) | 8kHz的单声道语音编码 |
Application (应用) | postscript | Adobe PostScript |
octet-stream(字节流) | 不间断的字节序列 |
- 文本
- 原始邮件是7位的ASC II格式,不需要用MIME来转换。
- 现在有两种子类型:plain(纯文字)、richtext
- 多部分
- 主体包含多个独立的部分。
- 多部分首部需要定义每一个部分的边界。为此目的使用了一个参数。
- 该参数是一个标记串,放在每部分的前面:单独占据一行,前面有两个“-”字符。
- 主体结束的位置也使用边界标记,前面仍然有“-”字符,后面以两个“-”字符结束。
- 该类型定义了4种子类型:混合、并行、摘要和交替
- 多部分举例
Content-Type: multipart/mixed; boundary=xxxx
--xxxx
Content-Type: text/plain
………………………………………………….
--xxxx
Content-Type: image/gif
………………………………………………….
--xxxx—
- 报文
- 在邮件类型中,主体就是完整的邮件、邮件的一部分或到邮件的指针。
- 现在使用的有3种子类型:
- RFC822:主体被封装在另一个邮件中(包括首部和主体)
- 部分:原始邮件被分片成不同的邮件,而邮件是分片之一
- 外部主体:主体不包含真正的邮件,而仅有对原始邮件的索引(指针)。
- 图像
- 原始邮件是一幅静止图像,没有动画。
- 当前使用的两种子类型:JPEG、GIF
- 视频
- 原始邮件是时变图像(动画)。
- 唯一的子类型是mpeg。
- 若动画包括声音,则必须使用音频内容类型分开发送。
- 音频
- 原始邮件是声音。
- 唯一的子类型是使用8kHz标准音频数据的基本子类型。
- 应用
- 原始邮件是一种前面没用定义的数据类型。
- 现在使用的只有两种子类型:
- PostScript:数据为Adobe PostScript格式
- 字节流:数据必须解释为8位字节序列(二进制文件)
🕘 6.5 MIME传送编码
MIME内容传送编码(Content-Transfer-Encoding)共有5种类型:
类型 | 说明 |
---|---|
7bit | ASCII字符和短行 |
8bit | 非ASCII字符和短行 |
二进制 | ASCII字符和长度不限的行 |
Base64 | 6位数据块被编码成8位ASCII字符 |
引用可打印 | 非ASCII字符被编码成等号后跟随一个ASCII码 |
- 7bit
- 7位ASCII编码
- 不能传输特殊的信息
- 行的长度不能超过1000字符。
- 8bit
- 8位编码。
- 非ASCII字符可以发送
- 行的长度仍不能超过1000字符。
- 二进制
- ASCII字符和长度不限的行
- Base64
- 最常见的用于传输8bit字节码的编码方式之一;
- 基于64个可打印字符来表示二进制数据的方法。
- 编码表
值 | 代码 | 值 | 代码 | 值 | 代码 | 值 | 代码 | 值 | 代码 | 值 | 代码 |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | A | 11 | L | 22 | W | 33 | h | 44 | s | 55 | 3 |
1 | B | 12 | M | 23 | X | 34 | i | 45 | t | 56 | 4 |
2 | C | 13 | N | 24 | Y | 35 | j | 46 | u | 57 | 5 |
3 | D | 14 | O | 25 | Z | 36 | k | 47 | v | 58 | 6 |
4 | E | 15 | P | 26 | a | 37 | l | 48 | w | 59 | 7 |
5 | F | 16 | Q | 27 | b | 38 | m | 49 | x | 60 | 8 |
6 | G | 17 | R | 28 | c | 39 | n | 50 | y | 61 | 9 |
7 | H | 18 | S | 29 | d | 40 | o | 51 | z | 62 | + |
8 | I | 19 | T | 30 | e | 41 | p | 52 | 0 | 63 | / |
9 | J | 20 | U | 31 | f | 42 | q | 53 | 1 | ||
10 | K | 21 | V | 32 | g | 43 | r | 54 | 2 |
- 引用可打印字符(Quoted-printable)
- Base64的冗余编码方案;
- 把24比特变为4个字符(32比特),开销为25%;
- 若邮件数据由大部分的ASCII字符和一小部分非ASCII字符组成,可以使用可打印字符引用编码;
- 若字符是ASCII,原样发送;若字符是非ASCII,用3个字符发送;
- 第一个字符是等号“=”,后两个字符是用十六进制表示;
- 适用于当所传送的数据中只有少量的非 ASCII 码。
🕒 7. 邮件读取协议
常用的邮件读取协议有以下两个:
- 邮局协议POP (Post Office Protocol),
POP3
是其第三个版本,是因特网正式标准(RFC 1939)。- 非常简单、功能有限的邮件读取协议。用户只能以下载并删除方式或下载并保留方式从邮件服务器下载邮件到用户方计算机。不允许用户在邮件服务器上管理自己的邮件。(例如创建文件夹,对邮件进行分类管理等)。
- 因特网邮件访问协议IMAP (Internet Message Access Protocol),IMAP4是其第四个版本,目前还只是因特网建议标准。
- 功能比POP3强大的邮件读取协议。用户在自己的计算机上就可以操控邮件服务器中的邮箱,就像在本地操控一样,因此IMAP是一个联机协议。
- POP3和IMAP4都采用基于TCP连接的客户/服务器方式。POP3使用熟知端口
110
,IMAP4使用熟知端口143
。
🕒 8. POP3协议
🕘 8.1 工作过程
两种工作方式:
- 删除方式
- 每一次读取邮件后就把邮箱中的该邮件删除。
- 通常用于用户使用固定计算机工作的场合,而用户在读取或回答邮件后可以保存或整理所收到的邮件。
- 保存方式
- 读取邮件后仍然在邮箱中保存该邮件。
- 通常用于用户离开自己的主要计算机时来读取邮件。邮件读取后还保存在系统中,供日后读取和整理。
🕘 8.2 命令
POP3命令的一般形式是:COMMAND [Parameter] <CRLF>
- COMMAND是ASCII形式的命令名
- Parameter是相应的命令参数
- 是回车换行符(0DH,0AH)
POP3命令不区分大小写,但参数区分大小写
命令 | 参数 | 使用在何种状态中 | 描述 |
---|---|---|---|
USER | Username | 认证 | 此命令与下面的PASS命令若成功,将导致状态转换 |
PASS | Password | 认证 | 此命令若成功,状态转化为处理状态 |
APOP | Name, Digest | 认证 | Digest是MD5消息摘要 |
STAT | None | 处理 | 请求服务器发回关于邮箱的统计资料 |
UIDL | [Msg#] (邮件号,下同) | 处理 | 返回邮件的唯一标识符 |
LIST | [Msg#] | 处理 | 返回邮件数量和每个邮件的大小 |
RETR | [Msg#] | 处理 | 返回由参数标识的邮件的全部文本 |
DELE | [Msg#] | 处理 | 服务器将由参数标识的邮件标记为删除,由QUIT命令执行 |
TOP | [Msg# n] | 处理 | 处理服务器将返回由参数标识的邮件前n行内容,n必须是正整数 |
NOOP | None | 处理 | 服务器返回一个肯定的响应,用于测试连接是否成功 |
QUIT | None | 处理 认证 | 1. 若服务器处于“处理”状态,将进入“更新”状态以删除任何标记为删除的邮件,并重返“认证”状态,结束会话,释放连接。 2. 若服务器处于“认证”状态,则结束会话,退出连接。 |
🕘 8.3 响应
POP3邮件服务器响应是由一个或多个命令行组成
响应第一行“+OK
”或“-ERR
”开头,其后附加若干ASCII文本信息。
“+OK”和“-ERR”分别指出相应的操作状态成功还是失败。
🕘 8.4 三种工作状态
- 认证状态
- 处理状态
- 更新状态
🕒 9. 基于万维网的电子邮件
- 通过浏览器登录(提供用户名和口令)邮件服务器万维网网站就可以撰写、收发、阅读和管理电子邮件。这种工作模式与IMAP很类似,不同的是用户计算机无需安装专门的用户代理程序,只需要使用通用的万维网浏览器。
- 邮件服务器网站通常都提供非常强大和方便的邮件管理功能,用户可以在邮件服务器网站上管理和处理自己的邮件,而不需要将邮件下载到本地进行管理。
- 这种工作模式在用户浏览器与邮件服务器网站之间使用HTTP协议,而邮件服务器之间使用SMTP协议。
🕒 10. 实验
🔎 原来自己可以搭建邮箱服务器发送邮件
实验步骤:
一、准备两台PC机,PC1部署邮件服务器,PC2作为客户端,访问邮件服务器
二、在PC1上使用hmailServer部署邮件服务器
三、在PC2使用Wireshark进行抓包,并使用Foxmail软件进行邮件服务器的访问,包括收邮件和发邮件
使用hmailServer部署邮件服务器:
一路next安装后,进入hMailServer
点击【Advanced】中【TCP/IP ports】的【0.0.0.0/25/SMTP】、【0.0.0.0/110/POP3】、【0.0.0.0/143/IMAP】、【0.0.0.0/587/SMTP】,将TCP/IP address设置为本机IP。
使用Foxmail软件进行邮件服务器的访问:
- 选择“其他邮箱”
- 点击“手动设置”
- 如下图填入【接收服务器类型】,【邮件账号】,【密码】为123456,【POP服务器】、【SMTP服务器】填入hMailServer设置的IP地址
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页