邮件传输的过程都看不懂。那我走(狗头)

简介: 给学习网络的新手一个我自己总结的建议: 我觉得学网络先要先把最基础最常用的协议的原理搞的明明白白,然后再学习难的协议或者是拓展的协议就好理解容易上手了。

给学习网络的新手一个我自己总结的建议:
我觉得学网络先要先把最基础最常用的协议的原理搞的明明白白,然后再学习难的协议或者是拓展的协议就好理解容易上手了。

image.png

邮件的传输流程

先将邮箱xxx.@qq.com用DNS解析成IP地址然后在一步步的传输。

image.pngimage.png


Webmail

电子邮件从 A 发送到客户服务器是使用 HTTP 协议。两个邮件服务器之间的传送使用 SMTP。邮件从服务端邮件服务器传送到 B 是使用 HTTP 协议。

image.png

使用邮件客户端收发邮件

电子邮件从 A 发送到客户服务器是使用 SMTP 协议。两个邮件服务器之间的传送使用 SMTP。B从服务端邮件服务器获取邮件使用POP3或IMAP协议。常见的邮件客户端有Foxmail,Outlook Express等.

image.png

用QQ邮箱给网易邮箱发邮件的传输过程

image.png

邮件服务器各组件关系图

  • MUA(Mail User Agent):用户代理,提供邮件编辑,查看功能;
  • MTA(Mail Transfer Agent): 邮件传输代理,负责传送和接收邮件;
  • MDA(Mail Dilivery Agent): 邮件投递代理,负责将MTA接收到的邮件传递到用户邮箱或转递其他MTA,兼具有过滤功能。

image.png

SMTP简单邮件传输协议

  • SMTP 使用客户/服务器方式,负责发送邮件的 SMTP 进程是 SMTP 客户,而负责接收邮件的 SMTP进程是 SMTP 服务器,当两个进程建立了TCP连接后,电子邮件就能通过该标准准确无误地传输;
  • SMTP协议是基于文本的协议,通过SMTP发送的电子邮件都是普通文本格式的,不支持声音、图像等非文本信息,但可以通过MIME标准将此类信息进行编码后再通过SMTP传输;
  • SMTP 规定了 14 条命令和 21 种应答信息。每条命令用 4 个字母组成,而每一种应答信息一般只有一行信息,由一个 3 位数字的代码开始;

SMTP命令

命令由客户端发送请求给服务端

image.png

SMTP应答码

每一条SMTP命令都会返回一条SMTP响应,由服务端返回给客户端

image.png

SMTP传输流程图

  1. 客户端主动连接到服务器的25端口,建立TCP连image.png。服务器会发送一个应答码为220的问候报文,表示已经准备就绪。
  2. 客户端向服务器发送HELO命令以标识发送方身份,若服务器接受请求,则返回一个代码为250的应答,表示可以开始报文传输。
  3. 客户端发送MAIL命令以标识邮件发送方身份,通过FROM参数指定发送方的邮件地址。若服务器准备接收,则返回250的OK应答。
  4. 客户端发送RCPT命令标识邮件的接收方,通过TO参数指定接收方的电子邮件地址,若有多个接收人,可发送多个RCPT命令。如果服务器能够识别接收人,则会返回代码为250的OK应答,否则返回代码为550的失败应答。
  5. 客户端与服务器之间的协商结束,客户端发送DATA命令指示将要发送邮件数据,服务器端返回应答码为354的响应进行确认,表示可以开始邮件输入。
  6. 客户端将邮件内容按行发送,邮件的末尾由客户端指定,是只有一个小数点(邮件数据结束指示器)的一行,服务器检测到邮件数据结束指示器后,返回代码为250的OK应答。
  7. 客户端发送QUIT命令终止连接。

注: 由于SMTP不需要身份验证,人们连接到邮件服务器就能随便给一个知道的邮箱地址发送邮件,造成垃圾邮件泛滥。后来就有了ESMTP  (Extended SMTP)。他和 SMTP 服务的区别仅仅是,使用 ESMTP  发信时,需要经过身份验证才能发送邮件。即在HELO命令后多加一条auth login登陆命令,登陆成功后才能使用后续的发送邮件命令。

电子邮件的信息格式

每一封电子邮件的结构格式为:

  • 报文头(Header)
  • 分隔邮件头与邮件体的空行
  • 报文体(Body)

报文头是一些控制信息,它是由一系列的头字段组成,每个头字段的结构格式是:

字段名(field-name):字段体(field-body)

包括收方和发方的地址,发送时间等,常用的头字段有:

  • Date域:记录邮件发送日期(本地主机的日期和时间);
  • Subject域:邮件主题;
  • From域:发信人邮件地址;
  • To域:收信人邮件地址;
    ……
    报文体是用户邮件内容,由用户自由撰写。但SMTP只支持传输7位ASCII码的英文字符,有很大局限性,后来邮件系统就扩展了MIME。

MIME

MIME扩展了基本的面向文本的Internet邮件系统,在不改动现有邮件协议的情况下,实现了用标准的文本格式邮件传输非文本(二进制)数据的功能。MIME的原理是将二进制数据转化为文本格式,然后再进行传输。

image.pngMIME扩包括三部分内容:新增了5个首部字段名,这些字段提供了邮件的主题信息;新增了许多邮件内容,对多媒体的表示方法进行标准化;定义了编码方法,可对任何内容进行准换。

邮件报文示例

image.png

POP3协议

POP是一种邮件接收协议,其作用是:当用户计算机与支持POP协议的电子邮件服务器连接时,把存储在该服务器的电子邮箱中的邮件准确无误地下载到用户的计算机中。POP3属于离线式协议,即不能对邮件进行在线操作,必须下载到本地才能进行处理。POP协议已发展到第三版,称作POP3。


POP3与SMTP一样都是请求响应协议,命令与响应也都是用NVT ASCII格式的文本表示。POP3响应由一个状态码和其后的附加信息组成,只有两种状态码:“+OK”(正确)和“-ERR”(失败)。

image.png

POP3命令

image.png

POP3连接

image.png

  • 当客户端连接到服务器的110端口,并建立起TCP连接后,即进入身份验证状态,需要使用USER和PASS命令将用户名和密码提供给服务器。
  • 通过身份验证之后,即转入事务处理状态,这时客户端可以发送POP3命令进行相应操作,服务器会接收命令并做出响应。
  • 操作完成之后,客户端发出QUIT命令,则进入更新状态,服务器确认用户的操作,更新邮件存储区,同时关闭客户端与服务器之间的连接。

POP3客户和服务器会话例

S:<在TCP端口110等待连接> 
C:<打开TCP连接>  - telnet <服务器域名> 110
S:+OK  oar pop3 server ready 
C:USER  your_userid 
S:+OK  your_userid is welcome here 
C:PASS  your_password 
S:+OK your_userid’s  maildrop has 2 messages   (320 octets) 
S:. 
C:STAT  
S:+OK  <邮件数量> <总大小>
C:RETR  2 
S:+OK  200 octets 
S:报文2的内容 
S:. 
C:DELE  2 
S:+OK  message 2 deleted 
…………


相关文章
|
消息中间件 缓存 安全
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(下)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
1622 0
|
算法 安全 Java
快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底
加密算法通常被分为两种:对称加密和非对称加密。其中,对称加密算法在加密和解密时使用的密钥相同;非对称加密算法在加密和解密时使用的密钥不同,分为公钥和私钥。此外,还有一类叫做消息摘要算法,是对数据进行摘要并且不可逆的算法。 这次我们了解一下消息摘要算法。
646 0
快速了解常用的消息摘要算法,再也不用担心面试官的刨根问底
|
小程序 Java 机器人
使用Java实现发送微信消息(附源码)_此程序在手再也不怕对象跟你闹了
此程序在手再也不怕女朋友跟你闹了!!!!自从有了女朋友比如:早安、晚安之类的问候语可不能断,但是也难免有时候会忘记那么该咋么办呢?很简单写一个程序么,近日闲来无趣想着用Java写一个自动发送微信的小程序,实现定时给指定的好友发送指定的消息,这不就很Nice了?本文主要包括实现的思路、代码的实现、打包为jar快捷方式!
166 0
|
存储 机器学习/深度学习 算法
大逆不道,从天界偷下来的算法修仙秘籍竟然传到你手上~~(结尾有彩蛋)
这有可能是你见过最离谱的标题 这有可能是你没见过的技术文章模式 我不知道我的选择是否正确,但是我的想法就是: 不再让技术冷冰冰,让所有人学习中获得快乐!
272 1
|
安全 算法 Java
[超长文,谨入]一文解决面试、工作遇到的安全性问题
安全问题其实是很多程序员容易忽略的问题但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题等等
365 0
[超长文,谨入]一文解决面试、工作遇到的安全性问题
|
分布式计算 大数据 Hadoop
【合集】想要轻松玩转阿里云?这里干货请收下!
在这里你可以寻找你想要的所有干货,带你一图了解阿里云!
292 0
【合集】想要轻松玩转阿里云?这里干货请收下!
|
编译器 C++
萌新学习C++容易漏掉的知识点看看你中招了没有(二)
萌新学习C++容易漏掉的知识点看看你中招了没有(二)
萌新学习C++容易漏掉的知识点看看你中招了没有(二)
萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
萌新学习C++容易漏掉的知识点,看看你中招了没有(一)
|
安全 Java API
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(中)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
607 0
|
安全 Java API
抱歉,Xposed真的可以为所欲为——终 · 庖丁解码(上)
Xposed的使用不难,API也就那些,难点是: 逆向弄清楚Hook APP的方法调用流程,怎么调,参数都是干嘛的等。 经过反复练习,逆向Hook一个普通的APP(非企业级加固)写出可用的Xposed插件早已驾轻就熟(主要是磨时间),但有一个顾虑一直萦绕心间:不知道Xposed底层的具体实现原理。Tips:Xposed通常只能 Hook java层 及 应用资源的替换,有两个实现版本:4.4前的Dalvik虚拟机实现 和 5.0后ART虚拟机实现,本文针对后者进行分析,同时搭配 Android 5.1.1_r6 源码食用。
374 0