邮件发送接收原理

2023-11-17

概述

     电子邮件是因特网上使用得非常多的一种应用,它可以非常方便的使相隔很远的人进行通信。它主要的特点就是操作简单,快捷。当你发送一封邮件的时候,它首先会发送到收件人的邮件服务器上,并放入收件人的信箱中。(如果你在某一个邮件服务器提供商那里申请了一个邮箱账号,那么你在这个邮件服务器上面就有一个电子信箱)。收件人只需要定时读取它的电子信箱,就可以接收别人发送过来的信件,并与别人进行通信了。

 

基本组成部分:

      一个简单的邮件系统,应该包含三部分:首先是邮件服务器,然后是用户代理和邮件传送协议。 

    邮件服务器就是一个供在网上存储邮件的空间。一般每个邮件服务器的提供商都有自己的邮件服务器,只要你申请了他的邮箱账号,你就会在他的邮件服务器上拥有自己邮箱。像Google,腾讯都是邮件服务的提供商,他们都有自己的邮件服务器,如果你申请了Gamil邮箱,那么在Google的邮件服务器上面,你就有自己的一块存储空间了。同样,如果你申请了qq邮箱,那么在qq邮件服务器上面也有你自己的空间了,也就是你的邮箱。当你要收取信件的时候,你就需要连接到不同的服务器上面。不同的邮件服务提供商,他们的邮件服务器的地址是不一样的。后面会介绍一些常用的邮件服务器的地址。

     用户代理也就是你用来从邮件服务器上读取或者发送邮件到邮件服务器上的一个软件。比如常用的OutLook,Foxmail等等。我们知道,我们的邮件都是存储在邮件服务器上面的,我们发送邮件的时候,去往邮件服务器上面发,我们收取邮件的时候,也需要从服务器上面读。为了方便的完成这些工作,我们就需要用户代理。

      邮件传送协议是指邮件在传送过程中必须遵守的约定,它规定了不同的服务器(或客户端)之间应如何交换信息。比较常见的有邮件服务器之间的通信协议SMTP以及用户代理与邮件服务器之间的通信协议POP3。(注意:邮件服务器之间的协议是使用SMTP,用户发送邮件到邮件服务器使用的还是SMTP协议,用户从邮件服务器读取邮件用的才是POP3协议)。

 

基本流程:

image

截图来自谢希仁《计算机网络》

      邮件的收发过程:

1. 发信人在用户代理上编辑邮件,并写清楚收件人的邮箱地址;

2. 用户代理根据发信人编辑的信息,生成一封符合邮件格式的邮件;

3. 用户代理把邮件发送到发信人的的邮件服务器上,邮件服务器上面有一个缓冲队列,发送到邮件服务器上面的邮件都会加入到缓冲队列中,等待邮件服务器上的SMTP客户端进行发送;

4. 发信人的邮件服务器使用SMTP协议把这封邮件发送到收件人的邮件服务器上(它会自动根据收件人的邮箱来分析出收件人的邮箱服务器);

5. 收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的信箱中;

6. 收件人使用用户代理来收取邮件。首先用户代理使用POP3协议来连接收件人所在的邮件服务器,身份验证成功后,用户代理就可以把邮件服务器上面的收件人邮箱里面的邮件读取出来,并展示给收件人。

    下面以一个简短的例子来说明这个过程:

     比如Tom要给Lucy发一封邮件,邀请她明天晚上一起看电脑。首先TOM会打开OutLook(用户代理),第一次使用用户代理时,需要进行相关的配置,详细的配置过程见后面的例子。我们先假设Tom已经配置好用户代理.Tom打开OutLook后,首先会填写收件人的邮箱,然后是邮件的主题以及邮件的内容,写好之后,点击发送。OutLook就会把这封邮件发送到Tom邮箱的服务器上面(比如Tom申请的是Gmail邮箱,那么这封邮件就会发送到Gmail的邮件服务器上面,这个邮件服务器的地址一般会由邮件服务商给出,在第一次配置OutLook时,就需要填写这个地址)。Tom邮箱服务器上面的SMTP客户端就根据收件人的地址,找到收件人所在的邮箱服务器,然后与收件人邮件服务器上面的SMTP端建立一个TCP连接,经过三次握手后,这封邮件就会通过这个连接传送到收件人的邮件服务器上面,也就是Lucy的邮箱服务器上面。如果Lucy需要收取邮件,它也需要一个用户代理,就假设她用的也是OutLook(她在第一次使用OutLook时,也要配置她的邮箱服务器地址),启动OutLook后,OutLook会每隔一段时间(这个时间可以由用户自己设置)去连接邮箱服务器,判断是否收到新的邮件,如果收到了新的邮件,就使用POP3协议把这封邮件读取出来,并通过OutLook显示给Lucy看。Lucy看到邮件后,答应了Tom的请求,她就会向Tom回复一封邮件,回复邮件的过程与上面的过程是一样的,这里就不细说了。

 

协议简介:SMTP

     SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。(来自百度百科

 

协议简介:POP3

     POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。(来自百度百科

POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是 PC机或 MAC。一旦邮件发送到 PC 机或 MAC上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。(来自百度百科

 

协议简介:IMAP

      Internet Mail Access Protocol(交互式邮件存取协议)IMAP是斯坦福大学在1986年开发的研发的一种邮件获取协议。它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。当前的权威定义是RFC3501。IMAP协议运行在TCP/IP协议之上,使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。

IMAP协议比较酷的功能是用户可以维护自己在服务器上的邮件目录;可以直接抓取邮件的特定部分(例如只有文本)。(来自百度百科

      IMAP的一个与POP3的区别是:IMAP它只下载邮件的主题,并不是把所有的邮件内容都下载下来,而是你邮箱当中还保留着邮件的副本,没有把你原邮箱中的邮件删除,你用邮件客户软件阅读邮件时才下载邮件的内容。较好支持这两种协议的邮件客户端有:ThunderMail,Foxmail,outlook等。(来自百度百科

 

协议简介:Mime

     由于SMTP这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。(来自百度百科

 

在.NET中如何实现:

    在.NET中,已经有实现邮件发送的相关类,在System.Net.Mail命名空间下,有实现SMTP连接的SmtpClient类,还有封装邮件信息的实体类MailMessage。我们首先需要用给定的服务器地址和端口号实例化一个SmtpClient对象;

   1:  
   2: SmtpClient smtp = new SmtpClient(smtpHost, smptPort);
   3:smtp.Credentials = new NetworkCredential("test.qq.com", "test008");

   然后定义一个MailMessage对象,MailMessage对象里面包括了一封标准邮件所需要的所有信息,比如收件人,邮件主题,邮件内容等。你只需要对相关的属性赋值即可,

   1: MailMessage msg = new MailMessage(sender, receivers, title, content);
   2: msg.BodyEncoding = Encoding.UTF8;
   3: msg.SubjectEncoding = Encoding.UTF8;
   4: msg.IsBodyHtml = true;
   5: smtp.Send(msg);
   6: msg.Dispose();

    赋值完毕后,调用smtp.Send(msg);邮件即可发送出去。注意,如果有身份验证的话,还需要输入你的用户名和密码。msg.CC.Add(new MailAddress("test002qq.com"));这样可以增加抄送人;msg.Attachments.Add()可以增加相应的附件。还有其他一些用法参见文章最后的参考网址。

 

常用的邮件服务器地址:(以下数据来自网络)

126邮箱

POP3服务器:pop.126.com 
SMTP服务器:smtp.126.com

163邮箱

POP3服务器:pop.163.com 
SMTP服务器:smtp.163.com

 

yahoo邮箱

注意:yahoo在foxmail 4.1以上的版本设置如下:

POP3服务器:pop.mail.yahoo.com.cn 
SMTP服务器:smtp.mail.yahoo.com.cn

 

Sohu邮箱

POP3服务器:pop3.sohu.com 
SMTP服务器:smtp.sohu.com

 

Gmail邮箱

第一步:要手动配置: POP3服务器是pop.gmail.com 
SMTP服务器是smtp.gmail.com 
第二步:使用自动配置文件 http://toolbar.google.com/gmail-helper/GmailConfig.exe 
这样就OK喽~ 可以发送和接收 Gmail 邮件了。

QQ邮箱

  POP3服务器:pop.qq.com 
SMTP服务器:smtp.qq.com 
SMTP服务器需要身份验证

 

从上面大家可以看出,一般的POP3邮件服务器地址为pop然后加上自己的域名,SMTP邮件服务器地址为smtp加上自己的域名。常用的邮件服务器地址都可以在网上找到。各大型邮箱smtp服务器及端口收集 

 

遇到的问题:

     当我用qq邮箱测试时,发现邮件并没有发送成功。找了半天原因,才发现原来是我的QQ邮箱的SMTP服务没有启用,如果你按照上面的代码,也没有发送成功,有可能也是这个原因。我们只需要进入自己的邮箱,把这个服务启用即可。

     首先登录QQ邮箱,选择“邮箱设置”的“账户”一栏

image

     然后往下浏览到“POP3/IMAP/SMTP/Exchange服务”这个地方,打上对勾即可。

image

     有没有发现上面的单词那么熟悉,就是上面讨论的几种协议,现在发现理解是不是更容易了。QQ邮箱做得比较好,如果你还没有理解这些协议的意思,你可以点击后面的超链接,里面有更详细的解释。

 

配置用户代理:

    如果你理解了上面的内容,配置用户代理将是一件非常容易的事情。这里以FoxMail为例,解释一个地方就可以了,就是设置邮件服务器。(截图来自QQ邮箱里面的“帮助”)

image

    上面的接收服务器类型,你可以选择POP3,也可以选择IMAP,选择了什么类型的,下面的地址中就应该输入这个类型的邮件服务器地址。最下面的是发送邮件服务器,这个没得选,非要写SMTP邮件服务器的地址。对于其他设置,你完全可以登录进入QQ邮箱,里面的帮助说的非常详细,而且网上也有许多配置用户代理的资料,可以参考。

 

总结

     上面的就是邮件发送的一些基本知识,大部分内容网上都有,我这里只是把它串起来,希望对大家有帮助,如果有任何错误,请指正。还有一点要说明的是,.NET中封装的“太好”了,完全对我们屏蔽了实现的具体细节,如果想深入研究,完全可以自己写一个发送邮件的类,实现SMTP通信,而不使用.NET中的SMTPClient类,如果大家有兴趣,可以继续研究。


本人在码云上提交了关于阅读spring源码之后编写的一些基础模块的实现,https://git.oschina.net/73hulu/spring.git 望大家不吝给颗星star,谢谢大家
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

邮件发送接收原理 的相关文章

  • flink连接kafka报:org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic

    报错信息 Caused by org apache flink runtime JobException Recovery is suppressed by NoRestartBackoffTimeStrategy at org apach
  • 跑通SOLOV1-V2实例分割代码,并训练自己的数据集。

    系统平台 Ubuntu18 04 硬件平台 RTX2080 super cuda和cudnn版本 cuda10 0 cudnn 7 5 6 pytorch版本 pytorch1 2 0 环境安装 创建solo虚拟环境 conda creat
  • 图(一)之邻接表Adjacency List

    开始攻克图的算法 先从最简单的存储开始实现 本文关于邻接表的实现 邻接表是图的存储中最简单也是最基本的存储结构 基于链表的思想实现的 在邻接表中 对于中的每个顶点建立一个单链表 第i个单链表中的节点表示依附于顶点的vi的边 每个节点由3个域
  • Android进阶之光:Dagger2原理简要分析

    Dagger2注入框架原理简要分析 使用Dagger2需要的依赖 implementation com google dagger dagger android 2 46 implementation com google dagger d
  • 实训九 网络服务的基本配置

    实训九 网络服务的基本配置 2017 年 4 月 16 日 今日公布 实训目标 完成本次实训 将能够 配置网卡 配置xinetd超级服务器 实训准备 两台计算机 其中一台安装RHEL6系统 该系统出来root账号外 至少还有一个普通账号 另
  • 【Linux系统编程】静态库和共享库

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 Linux系统编程 专栏定位 整理一下 C 相关的知识点 供大家学习参考 如果有收获的话 欢迎点赞 收藏 您的支
  • YOLOv5小目标检测(方法与评价)

    问题 当我们在对小目标数据集进行检测时 发现无论如何都有一些漏检的 其中我们也添加一些模块 以及其他的一些改进方法 如注意力 激活函数等等 结果始终不会令人满意 map也没有丝毫的提升 目的 增加对小目标的检测能力 不能产生漏检 自述 许多
  • ARM芯片学习(S5PV210开发)——GPIO控制LED

    1 GPIO介绍 GPIO general purpose input output 通用输入输出 GPIO就是芯片的引脚 是比较特殊的引脚 可以通过代码来操作 控制引脚的高低电平以及工作模式 与GPIO相对的就是固定功能的引脚 我们不能通
  • FPGA笔记8——串口通信(回环实验)

    目录 串口通信原理 串行通信基础知识 处理器与外部设备通信的两种方式 串行通信的通信方式 串行通信的传输方向 常见的串行通信接口 异步串口通信UART基础知识 数据格式 传输速率 接口标准 RS232接口 串口通信实验RS 232 实验任务
  • LeetCode-斐波那契数列

    class Solution public int Fibonacci int n if n 0 return 0 if n 1 return 1 return Fibonacci n 1 Fibonacci n 2 int a 0 b 1
  • 1 RocketMQ简介

    简介 RocketMQ是由阿里捐赠给Apache的一款低延迟 高并发 高可用 高可靠的分布式消息中间件 经历了淘宝双十一的洗礼 RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力 同时也具备互联网应用所需的海量消息堆积 高吞吐

随机推荐

  • 深入解决Linux内存管理之page fault处理

    说明 Kernel版本 4 14 ARM64处理器 Contex A53 双核 使用工具 Source Insight 3 5 Visio 1 概述 内核实现只是在进程的地址空间建立好了vma区域 并没有实际的虚拟地址到物理地址的映射操作
  • 《学会提问》-批判性思维

    这本书名为学会提问 但实际内容是讲解如何训练批判性思维能力 如何通过提问 来质疑别人的观点 选择正确的论证 来形成自己的理性决策 批判性思维的最终结果就是要求一个人虚怀若谷地接纳各种观点 理性评判这些观点 然后在理性判断的基础上决定采取哪些
  • 如何使用python调用电脑麦克录音

    import wave import pyaudio 定义数据流块 CHUNK 1024 FORMAT pyaudio paInt16 CHANNELS 2 RATE 44100 录音时间 RECORD SECONDS 5 要写入的文件名
  • 华为OD机试 C++ 回文字符串

    题目 什么是 回文串 就是一个字符串正着读和反着读都一样 而且要注意大小写的区别 例如 leVel 是一个回文串 因为正着反着都一样 art 就不是 反过来就变成 tra 了 Level 也不是 因为大小写不同 现在 你要做的就是用给定的一
  • NOIP中的数学--第6课 计数原理 (上)

    加法原理与乘法原理 1 加法原理 完成一个工程可以有n类办法 ai代表第i类方法的数目 那么完成这件事共有 S a 1 a 2 a n 种不同的方法 2 乘法原理 完成一个工程需要分n个步骤 ai 代表第i个步骤的不同方法数目 那么完成这件
  • python3 通过 pybind11 使用Eigen加速

    python是很容易上手的编程语言 但是有些时候使用python编写的程序并不能保证其运行速度 例如 while 和 for 这个时候我们就需要借助c 等为我们的代码提速 下面是我使用pybind11调用c 的Eigen库的简单介绍 第一步
  • 实现页面失去焦点十秒后强制执行js

    页面失去焦点后开始倒计时 时间到了执行指定js 适用于 检测页面无操作退出登录 在线答题防止切换页面搜索答案 浏览页面多久后获取奖励等场景
  • 概率论与数理统计--排列组合(一)

    排列 从n个不同元素中 任取m m n m与n均为自然数 下同 个元素按照一定的顺序排成一列 叫做从n个不同元素中取出m个元素的一个排列 从n个不同元素中取出m m n 个元素的所有排列的个数 叫做从n个不同元素中取出m个元素的排列数 用符
  • 118.杨辉三角

    一 题目 118 杨辉三角 力扣 LeetCode 二 代码 class Solution public vector
  • 开关电源环路稳定性分析(2)-从开环到闭环

    大家好 这里是大话硬件 在上一节中 基于欧姆定律 基尔霍夫定律 伏秒平衡这些已知的知识点 可以推导出Buck变换器的输入输出关系 今天这一节 我们还是从全局的概念来解析开关电源 1 运放和开关电源 如果一上来就分析开关电源的环路稳定性 我估
  • Spring Boot中集成Redis

    14 1 简介 redis是一款高性能的NOSQL系列的非关系型数据库 14 1 1 非关系型数据库的优势 1 性能NOSQL是基于键值对的 可以想象成表中的主键和值的对应关系 而且不需要经过SQL层的解析 所以性能非常高 2 可扩展性同样
  • 华为三层交换机STP配置

    学习目的 掌握启用和关闭STP的方法 了解不同的STP模式的差异 掌握修改网桥优先级影响根网桥选举的方法 掌握修改端口优先级影响根端口与指定端口选举的方法 掌握配置边缘的方法 拓扑图 场景 你是公司的网络管理员 公司的网络使用了两层网络结构
  • Redis基础--认识redis和对比同类型产品

    一 redis定义与应用 Nosql定义 NoSQL是不同于传统的关系数据库的数据库管理系统的统称 其两者最重要的区别是NoSQL不使用SQL作为查询语言 MySQL定义 MySQL是一种关系型数据库 关系型数据库的一个常见用法是存储长期的
  • 如何大批量压缩图片

    一 ImageMagick ImageMagick 是一个功能强大的命令行图像处理工具 可以用于批量处理图片 它支持各种图像格式和操作 包括压缩和优化 二 使用 ImageMagick 进行大批量压缩指定路径的图片 你可以通过以下步骤实现
  • JavaScript中的内存回收机制

    JS的内存回收 在js中 垃圾回收器每隔一段时间就会找出那些不再使用的数据 并释放其所占用的内存空间 以全局变量和局部变量来说 函数中的局部变量在函数执行结束后这些变量已经不再被需要 所以垃圾回收器会识别并释放它们 而对于全局变量 垃圾回收
  • 宝塔中 nodejs项目 nginx 网站基础/代理设置

    上面是一些基础配置就不写了 吧请求全部代理到 nodejs 项目 location 如果使用pm2等启动node项目 需要加header头 防止读取不到客户端IP proxy set header Host proxy host proxy
  • 生态伙伴

    提到时间管理 想必大多数人的第一反应就是 番茄工作法 番茄工作法是意大利人弗朗西斯科 西里洛于1992年创立的 他和我们大多数人一样 是一个重度拖延症患者 在他大学生活的前几年 曾一度苦于学习效率低下 于是他做了个简单的实验 他找来形状像番
  • JMeter下载及使用

    前言 我是个前端 只是一次偶然的机会被安排用了一次JMeter 做了下步骤记录 所以内容比较基础 想深入研究的兄弟可以再多找找哈 一 下载 官网地址 Apache JMeter Download Apache JMeter 下载zip包 应
  • 计算机网络的软件系统包括哪几部分,系统软件由哪几部分组成?

    系统软件用于实现计算机系统的管理 调度 监视和服务等功能 其目的是方便用户 提高计算机使用效率 扩充系统的功能 通常将系统软件分为以下六类 1 操作系统操作系统是控制和管理计算机各种资源 自动调度用户作业程序 处理各种中断的软件 操作系统的
  • 邮件发送接收原理

    概述 电子邮件是因特网上使用得非常多的一种应用 它可以非常方便的使相隔很远的人进行通信 它主要的特点就是操作简单 快捷 当你发送一封邮件的时候 它首先会发送到收件人的邮件服务器上 并放入收件人的信箱中 如果你在某一个邮件服务器提供商那里申请