应用层——电子邮件(SMTP、POP3、IMAP)

2023-10-09 15:30

本文主要是介绍应用层——电子邮件(SMTP、POP3、IMAP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 电子邮件系统及组成结构

1.1 电子邮件 

1.2 电子邮件系统的组件 

2. SMTP(邮件发送协议)

2.1 SMTP的特征 

2.2 SMTP的基本操作 

2.3 SMTP协议的基本流程

2.4 SMTP交互与应答

2.5 SMTP与HTTP的对比 

3. 邮件报文格式与MIME

3.1 电子邮件格式 

3.2 多用途网际邮件扩充-MIME

4. 邮件访问协议

4.1 POP3

4.2 IMAP 

4.3 基于Web的电子邮件 


1. 电子邮件系统及组成结构

1.1 电子邮件 

电子邮件自因特网诞生以来已经成为最为流行的应用程序,时至今日,仍然是最为重要和实用的互联网应用之一

与普通邮件一样,电子邮件是一种异步通信方式,不像电话等通信方式必须通信双方同时在场,发送方可以在任意时间发送邮件,接收方也可以在任意时间接收邮件

9a12410c9626890cbcb9b373ca20fdb2.png

电子邮件较普通邮件更为快速而且易于分发,价格便宜。现代电子邮件具有许多强大的特性,包括具有附件、超链接、HTML格式文本和图片的报文 

1.2 电子邮件系统的组件 

一个电子邮件系统的组成构件

fb569ca2ac194a5184e43dc8acad019c.png

主要有三个组成部分:

  • 用户代理(user agents,UA)
  • 邮件服务器(mail servers)
  • 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)

电子邮箱的工作方式和寄快递类似

  1. 首先找一个跑腿小哥(相当于用户代理)帮你去寄东西,你要先把发件人收件人信息填好(邮箱地址)
  2. 跑腿小哥将你的东西拿到寄件处(邮件服务器)准备邮寄
  3. 寄件处帮你把物品寄出去,通过物流(相当于传输协议)运往目的地
  4. 物品到达收件人的寄件处(对方的邮件服务器)
  5. 收件人也叫了一个跑腿小哥(对方的用户代理)将东西取回来

用户代理:用户和电子邮件系统的接口

用户代理简单来说就是一个程序,如QQ邮箱、Outlook等。通常具有撰写、显示和处理邮件的功能

邮件服务器:用于发送和接受邮件,先发信人报告邮件传送的情况 ,一个邮件服务器可能有多个代理

是电子邮件体系结构的核心。它采用C/S结构, 但它必须要能够同时充当服务器和客户端

邮件服务器有两个功能:

  • 邮箱:存储发给该用户的Email 
  • 消息队列(message queue):存储等待发送的Email

简单邮件传输协议:用于完成邮件在邮件服务器之间的传输

SMTP是因特网电子邮件中主要的应用层协议,邮件服务器之间传递消息所使用的协议

145ed093f04b4a73b10b328327bdf78c.png

一个典型的邮件发送的例子是:

  • 发送方通过用户代理将邮件传输到A用户的邮件服务器
  • 由A的邮件服务器传输到B的邮件服务器
  • 然后该邮件被分发到接受方的邮箱中

通常,如果发送方的服务器不能完成邮件的传输,那么邮件就在发送方的邮件服务器的消息队列中排队,一段时间后(一般是30分钟)再尝试发送

2. SMTP(邮件发送协议)

2.1 SMTP的特征 

SMTP协议定义在[RFC 5321]中,用于从发送方的邮件服务器发送报文到接受发的邮件服务器,它最典型的特征有:

  • 使用TCP进行email消息的可靠传输
  • 端口25
  • 传输过程的三个阶段——握手、消息传输、关闭
  • Email消息只能包含7位ASCII码
  • 使用命令/响应交互模式
    命令(command): ASCII文本
    响应(response): 状态代码和语句

2.2 SMTP的基本操作 

举一个例子来描述SMTP的基本操作,假设左边的用户是Alice,右边的用户是Bob:

5719ecc9bdc1471d952e46e4fdb4a958.png

  1. Alice首先通过她的用户代理写了一封邮件,并且在邮件中填上Bob的邮件地址
  2. 然后这封邮件被用户代理发送到Alice的邮件服务器上,这一过程中这封邮件需要在服务器中排队
  3. Alice邮件服务器上的SMTP客户端在报文队列中发现有邮件要发送,与Bob的邮件服务器建立一条TCP连接
  4. 经过一些SMTP握手后,SMTP客户端通过该TCP连接发送邮件
  5. 邮件被传送到Bob的邮件服务器上
  6. Bob随时可以来读取邮件

值得注意的是:

SMTP一般不使用中间邮件服务器发送邮件,也就是说即使邮件的发送者和接收者相距再远,中间所隔的网络再复杂,SMTP也总是倾向于建立起一条直连发送方和接受方的TCP连接

2.3 SMTP协议的基本流程

SMTP将一个报文从发送邮件服务器传送到接收邮件服务器的过程:

1️⃣ 客户SMTP(运行在发送邮件服务器主机上)在25号端口,建立一个到服务器SMTP(运行在接受邮件服务器主机上)的TCP连接

c71b7e2454dead9e6c79acef11733b8f.png

2️⃣ SMTP的客户和服务器在传输信息前要向对方“打招呼并先介绍自己”,在SMTP的握手阶段,SMTP客户指示发送方的邮件地址和接受发的邮件地址SMTP的客户和服务器彼此介绍后,客户发送报文

76dc4cd76d7121264c5e6a01e74d699f.png

3️⃣ 如果SMTP客户还有别的邮件要发送到这台服务器,就继续发送,否则关闭TCP连接

2.4 SMTP交互与应答

SMTP交互与应答整体过程 

5e828cd628871493519ba675a7cf721c.png

💠 首先,当TCP连接建立后,最开始由接受方邮件服务器进行交互,发送一条服务就绪应答给客户邮件服务器,应答代码为220

f7cbf1d6b7a1c72948d774f65cc68900.png

💠 SMTP客户收到该应答后,以HELO(HELLO的缩写)进行应答,同时带上自己的域名

7e0ed5fc49b5b5882b78969c9d03f993.gif

💠 SMTP服务器若认为身份有效,则发回应答代码:250

e962233c90134201294572dde0b5ae21.gif

💠 SMTP客户收到该应答后,使用命令 MAIL FROM 来告诉服务器该邮件来自何方,用MAIL FROM指明发件人邮箱地址

6d764c499042daa345ea60d0113d7f2e.gif

💠 服务器认为命令合理,则发回应答代码:250

8471ca1506252d3613905863c6487c51.gif

💠 SMTP客户收到该应答后,使用命令 RCPT TO 告诉服务器邮件去往何地,也就是收件人邮箱

af3ac6e3b6801aaa8d0017a0e4563403.gif

💠 服务器中若有该收件人邮箱(确认是否存在代理),则发回应答代码250

1444b729b18e5acccc57153be9b77231.gif

💠 SMTP客户收到该应答后,使用 DATA 命令来告诉服务器自己准备发送邮件内容了

bdda090e2e47cccc8ff897cd238bdbb1.gif

 💠 SMTP服务器准备对该邮件进行接受,发回应代码:354

37c6cd69400e17ea4229ffb1c8e5ef35.gif

💠 SMTP客户收到该应答,发送邮件

3c799e6fa6bf541c6f657133dc55e747.gif

💠 最后发送结束符CRLF.CRLF来结束邮件的发送

c143cf1d9f3c2c1afd2726d3fc9693e5.gif

💠 服务器成功收到邮件,应答:250

3be2d9c5dcd4e6cff03b69530261cb95.gif

💠 SMTP客户收到该应答后,使用命令 QUIT 向服务器请求断开连接

4832ab599f6c4d8cdcfbc8c58c81da5b.gif

💠服务器发回应答代码 221表示接受请求并主动断开连接

194d54c4b4e1d1fa073890c786fc65ab.png

下面给出一个SMTP客户(以C代表)和一个SMTP服务器(以S代表)之间交换报文文本的例子

S: 220 hamburger.edu                                          (服务就绪应答)
C: HELO crepes.fr                                                (客户收到应答,打招呼并给出自己的域名)
S: 250 Hello crepes.fr, pleased to meet you         (域名有效,问好)
C: MAIL FROM: <alice@crepes.fr>                      (给出发件人邮箱地址)
S: 250 alice@crepes.fr ... Sender ok                    (发件人合理,给出应答)
C: RCPT TO: <bob@hamburger.edu>                  (给出收件人邮箱地址)
S: 250 bob@hamburger.edu ... Recipient ok        (收件人合理,给出应答)
C: DATA                                                                 (客户即将发送数据)
S: 354 Enter mail, end with “.” on a line by itself   (服务器准备接受)
C: Do you like ketchup?                                         (邮件内容)
C: How about pickles?                                           (...)
C: .                                                                         (邮件结束)
S: 250 Message accepted for delivery                   (服务器成功收到邮件)
C: QUIT                                                                  (客户即将断开连接)
S: 221 hamburger.edu closing connection             (服务器断开连接)

2.5 SMTP与HTTP的对比 

SMTPHTTP
连接方式持续连接持续连接
获取信息方式推式(PUSH)拉式(PULL)
交互模式命令/响应命令/响应
命令和状态码ASCII码ASCII码
对象的封装多个对象在由多个
部分构成的消息中发送
每个对象封装在独
立的响应消息中

3. 邮件报文格式与MIME

3.1 电子邮件格式 

一个电子邮件分为信封内容两大部分,邮件内容又分为首部主体两部分

  • [RFC 5322]规定了邮件的首部格式,用户要按照格式填写首部内容
  • 主体部分由用户自由撰写(邮件正文)
  • 信封无需用户填写,邮件系统自动从用户填写的首部中提取所需信息并写在信封上

一个典型的邮件内容首部如下

From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Searching for the meaning of life. 

邮件内容的首部包含一些首部行,格式为 [关键字 :值],有些关键字是必须的,有些是可选的。最重要的是To:和Subject:

  • To是必需的关键字,后面填入一个或多个收件人的邮件地址,电子邮件地址的规定格式为:收件人邮箱名@邮箱所在主机的域名,如abc@mail.com,其中收件人邮箱名即用户名,abc在mail.com这个邮件服务器上必须是唯一的
  • Subject是可选关键字,是邮件的主题,反应了邮件的主要内容
  • From也是必需的关键字,但它由邮件系统自动填入

d56ed02cbda74533a1fc452f8ec2f6c6.png

首部和报文主体之间由空行进行分隔,报文主体以ASCII格式表示 

3.2 多用途网际邮件扩充-MIME

MIME-多用途网际邮件扩充(Multipurpose Internet Mail Extensions)定义在[RFC 2045, 2056],用于解决SMTP只能传输7位ASCII码的问题

SMTP只能传输一定长度的ASCII码邮件,对于其他国家的文字、二进制文件和可执行文件都无法传送,MIME就是对SMTP的一种扩展,它并没有改变SMTP或取而代之,相反它继续使用SMTP的格式,但增加了邮件的主体结构,并定义了传送非ASCII码的编码规则

MIME通过在邮件首部增加额外的行以声明MIME的内容类型

e7037fc8cc9745908020c2b40f1c4698.png

MIME主要包括以下三部分内容

  • 5个新的邮件首部字段——MIME版本、内容描述、内容标识、传送编码和内容类型
  • 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化
  • 定义了传输编码,可对任何内容格式进行转换,而不会被邮件系统改变

MIME是工作在SMTP之上的,对于非ASCII码的内容,先通过MIME以一定编码规则转化成ASCII码,再交由SMTP传送,在接受端的MIME中被还原

d1942332018c9c417110c3877b325145.png

实际上,MIME不仅仅用于SMTP,也用于后来的同样面向ASCII字符的HTTP

4. 邮件访问协议

SMTP完成的是发送方的用户代理→发送方邮件服务器,发送方邮件服务器到接受方邮件服务器之间的传送,接受方用户从自己的邮件服务器中将邮件取回本地则使用邮件访问协议

2acfbb65deeb44438a5ffde164c7cfb5.png

4.1 POP3

邮局协议(Post Office Protocol, POP)是一个非常简单但功能有限的邮件读取协议,由[RFC 1939]定义,现在使用的是它的第三个版本POP3

当用户代理(客户)打开一个到邮件服务器端口110上的TCP连接后,POP3就开始工作了,分为三个阶段

  1. 特许( authorization ):用户代理以明文形式发送用户名和口令以鉴别用户(我理解为输入用户名和密码进行登录)
  2. 事务处理( transaction ):用户从邮件服务器取回报文
  3. 更新( update ):出现在客户发出quit命令之后,目的是结束POP3会话并删除一删除标记的邮件

f000989b26b14df58d6323bf80d22aa2.png

POP3的主要特征

  • 采用"PULL"拉式进行通信,拉取用户邮箱中的邮件
  • 使用C/S结构,在传输层使用TCP,端口号为110
  • POP3是无状态的
  • 有两种工作方式 —— “下载并保留” 和 “下载并删除”

下载并删除:用户如果换了客户端软件,无法重读该邮件

下载并保留:不同客户端都可以保留消息的拷贝 

但正是由于POP3的简单性,使得它无法完成更多功能,如不允许用户在邮件服务器上管理自己的邮件(例如创建文件夹,对邮件进行分类管理等)

4.2 IMAP 

因特网报文存取协议(Internet Message Access Protocol, IMAP),由[RFC 3501]定义,主要解决了POP3无法为用户提供在远程服务器管理邮件服务的问题

IMAP与POP3有许多相似的地方,例如它们都使用TCP连接,都使用客户-服务器结构,但IMAP比POP3复杂得多,因此功能也更强大,它为用户提供了创建文件夹、在不同文件夹之间移动邮件以及在远程文件夹中查询邮件等联机命令,为此IMAP服务器维护了会话用户的状态信息

IMAP的另一特性是允许用户代理只获取报文的某些部分,例如可以指读取一个报文首部,或多部分MIME报文的一部分,这尤其适用于低带宽的情况

IMAP的主要特点有

  • 所有消息统一保存在一个地方:服务器
  • 允许用户利用文件夹组织消息
  • 支持跨会话(Session)的用户状态:文件夹名字,文件夹与消息ID之间的映射 

4.3 基于Web的电子邮件 

随着万维网的流行,目前出现了许多基于万维网的电子邮件,如Hotmail、Gmail等

使用这种电子邮件相较于前面所说的有两种改变

  • 用户代理由邮件客户端程序变成了普通的浏览器
  • 用户和本地邮箱服务器之间的通信通过HTTP进行

发送方的用户代理(浏览器)将邮件传送到发送方的邮件服务器时,使用的是HTTP而非SMTP;接受发从接受发的邮件服务器将邮件读取到本地也使用HTTP而非POP3或IMAP,但在邮箱服务器与邮箱服务器之间进行的传送,总是使用SMTP

c7d304b79b3e2280f6a28bc02e0bb82c.png

最终,我们所得到的电子邮件传送过程可表示为

bf7a6c51e3414bfca680321d3fb2c32c.png

这篇关于应用层——电子邮件(SMTP、POP3、IMAP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/173815

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

匹配电子邮件地址的正则表达式

这个正则表达式 QRegularExpression regex(R"((\w+)(\.|_)?(\w+)@(\w+)(\.(\w+))+))"); 用于匹配电子邮件地址的格式。下面是对这个正则表达式的逐步解析和解释: 1. QRegularExpression 构造函数 QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+

应用层简单实现udp / tcp网络通信

一、常见网络接口总结 1、创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器) int socket(int domain, int type, int protocol); domain:AF_INET:网络通信,AF_LOCAL:本地通信 type:UDP:SOCK_DGRAM,TCP:SOCK_STREAM protocol:协议编号一开始设0 返回值:文件描

【go语言发送电子邮件】go语言版发送电子邮件

一、实现功能 用go语言发送一封邮件 二、实现源代码 package mainimport ("net/smtp""fmt""strings")/** user : example@example.com login smtp server user* password: xxxxx login smtp server password* host: smtp.example.co

python并行计算之pool.apply_async()与pool.imap()的异同点

目录 1. 框架和技术概要: 🎨🖥️2. 相似点: 🧩💡3. 不同点: 📊👣4. 使用示例: 😊👨‍💻5. 总结: 🎉 1. 框架和技术概要: 🎨🖥️ multiprocessing 模块中的 pool.apply_async() 与 pool.imap() 都用于并行处理,但它们在使用方式和返回结果上有所不同。 2. 相似点: 🧩💡 并行处理

imap发送邮件:如何配置IMAP服务器发邮件?

imap发送邮件的设置教程?如何使用IMAP服务发送邮件? IMAP发送邮件作为一种高效的邮件管理方式,允许用户在多个设备上同步邮件,极大地提升了工作效率。AokSend将详细介绍如何配置IMAP服务器以实现邮件的发送。 imap发送邮件:选择服务 在开始配置之前,需要选择一个可靠的IMAP发送邮件服务提供商。市面上有许多知名的邮件服务提供商,如Google Gmail、Microsof

【Linux网络】应用层协议HTTP(1)

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C++初阶 | C++进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 应用层协议HTTP 的相关内容。 如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长! 文章目录

Python Mail:如何设置SMTP服务器发邮件?

Python Mail发送邮件的步骤?如何使用Python 发邮件? 在现代通信中,电子邮件仍然是不可或缺的一部分。Python Mail 提供了一种简单而强大的方式来通过 SMTP 服务器发送邮件。AokSend将详细介绍如何使用 Python Mail 库来设置和发送电子邮件。 Python Mail:安装软件 在开始使用Python Mail之前,我们需要确保已经安装了必要的库。通

新路程------hi3516a 在应用层对寄存器的操作

由于在应用层没法用writel,所以参考himm.c写了一个设置,代码如下: void uart1_rtsn_high(void) {     void * pMem  = NULL;   pMem = memmap(0x201d0010, DEFAULT_MD_LEN);   *(U32*)pMem = 0xff; } 文件名是rs485.c,但是用arm-hisiv300-linux