当前位置: 首页 > article >正文

【计算机网络】应用层电子邮件协议

一、电子邮件系统架构

电子邮件是一个典型的异步通信系统,发送方从UA,也就是邮件客户端,通过应用层SMTP协议,传输层tcp协议,发送给发送方的邮件服务器,比如使用的是163邮箱,163提供的SMTP服务器就是smtp.163.com发送方给这个地方发送。

之后,这个163 smtp服务器又会作为smtp客户端,再次通过应用层SMTP,传输层TCP给接收方的邮件服务器发邮件。

最后收件人会通过POP或IMAP协议,从他的POP3或IMAP服务器把他的邮件pop出来,还是走TCP连接。

注意这里都是客户端和服务器通信,走的都是典型的Client-Server架构。

例如,发送方邮件服务器,在接收发件人发来的邮件的时候,是作为服务器,然后他在给接收方邮件服务器送信的时候,是作为客户端。

这里我们把发送方邮件服务器——接收方邮件服务器这一大块,叫做电子邮件系统,这里面一定是走SMTP的。这之外,比如现在很多邮箱提供网页端,那么从发送方到发送方服务器这个过程就有可能走HTTP了,接收方服务器到接收方这里也是同理,可以走HTTP。

、SMTP(Simple Mail Transfer Protocol)

整个过程的大部分应用层协议走的都是SMTP,先看看SMTP。

它主要规定了这个客户端和服务器通信的过程,不含加密和认证,而且SMTP只能传7bit-ASCII码,这是上古时代的ASCII码,只包含了前128个字符。看下面这个通信的过程。

客户端和服务器通过简单的helo来建立连接,然后说这是从谁来的,给谁发的。

之后是信息的头和body,最后在把连接断掉。

这是一个原来的简单的邮件的格式,包括这些很基础的内容。

后来发现我们要传一些别的,视频、音频、文件、甚至二进制代码,为了遵循开闭原则,不对原先的系统修改,只添加功能,那就需要一种方式把这些东西映射成7bit-ASCII码,再走SMTP。

三、MIME(Multipurpose Internet Mail Extension)

就有了这个MIME扩展,

它通过规定了很多的Content Type,来支持不同样式的信息。

来看这样一个例子,最上面的是MIME的头,接着就是Content,type是mutipart-alternative,里面就是各种格式的信息,他还定义了一个boundary,来分隔不同的信息。

例如下面第一个content-type是text/html,然后用那个boundary分隔,然后是mesage/external-body,最后是一个音频文件。

四、POP3和IMAP

就是很简单的从邮件服务器pop出来消息到本地。

看这里都是些很简单的消息,把邮件都list出来,把某个邮件retrieve出来,然后删除某个邮件,最后退出。

这里就是POP3的局限,只能把整个邮件POP出来才能看。

IMAP可以把邮件的一部分POP出来。


http://www.kler.cn/a/163057.html

相关文章:

  • UDP协议和TCP协议之间有什么具体区别?
  • 一文简单了解Android中的input流程
  • nginx配置负载均衡详解
  • 结构体(c语言)
  • 重构代码之内联临时变量
  • 软件测试项目实战
  • AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 3 “编译 NXP i.MX RT1060”( 完 )
  • 奇点云2023数智科技大会来了,“双12”直播见!
  • 【游戏引擎 - C#脚本系统】6、C#端调用C++函数
  • 使用 Axios 进行网络请求的全面指南
  • echart中定义brush,默认状态,触发状态
  • MQTT协议对比TCP网络性能测试模拟弱网测试
  • Mybatis XML改查操作(结合上文)
  • SpringBoot集成WebSocket
  • Redis 基础—Redis Desktop Manager(Redis可视化工具)安装及使用教程
  • 如何使用玻璃材质制作3D钻石模型
  • 【conda】利用Conda创建虚拟环境,Pytorch各版本安装教程(Ubuntu)
  • IO多路转接之select
  • SQL命令---修改数据库的编码
  • 【ChatGLM3】第三代大语言模型多GPU部署指南
  • node14升级node16之后无法启动处理
  • Java编程中通用的正则表达式(二)
  • idea__SpringBoot微服务05——JSR303校验(新注解)(新的依赖),配置文件优先级,多环境切换
  • Mysql 命令行导出SQL文件和导入文件
  • mybatisplus手动获取数据源执行非主数据库事务
  • sql行转列