您现在的位置是:网站首页> 编程资料编程资料
邮件的协议及服务器工作原理_相关技巧_
2023-05-25
259人已围观
简介 邮件的协议及服务器工作原理_相关技巧_
前言
相信大家在日常工作生活中少不了和邮件打交道,比如我们会用邮件进行信息交流,向上级汇报日常工作;再比如大家熟悉的某个WEB系统注册阶段,通常会有一个功能,点击发送到目标邮箱的链接完成账户激活。
但是邮件发送的原理是什么?邮件是如何发送的呢?本系列教程将会讲解邮件的基本常识与概念,邮件的协议以及邮件服务器的工作原理,然后用JavaMail发送邮件的基本实现过程,邮件内嵌图片等高级邮件技巧。相信大家看完后,一定会有所收获。
电子邮件的发送和接收过程
和以往博客一样,LZ这里先给出用户A从QQ邮箱发送邮件到用户B163邮箱的图示,然后对图示的过程进行详细的介绍:

图示的六个步骤分别进行如下的说明:
①、用户A的电子邮箱为:xx@qq.com,通过邮件客户端软件写好一封邮件,交到QQ的邮件服务器,这一步使用的协议是SMTP,对应图示的①;
②、QQ邮箱会根据用户A发送的邮件进行解析,也就是根据收件地址判断是否是自己管辖的账户,如果收件地址也是QQ邮箱,那么会直接存放到自己的存储空间。这里我们假设收件地址不是QQ邮箱,而是163邮箱,那么QQ邮箱就会将邮件转发到163邮箱服务器,转发使用的协议也是SMTP,对应图示的②;
③、163邮箱服务器接收到QQ邮箱转发过来的邮件,也会判断收件地址是否是自己,发现是自己的账户,那么就会将QQ邮箱转发过来的邮件存放到自己的内部存储空间,对应图示的③;
④、用户A将邮件发送了之后,就会通知用户B去指定的邮箱收取邮件。用户B会通过邮件客户端软件先向163邮箱服务器请求,要求收取自己的邮件,对应图示的④;
⑤、163邮箱服务器收到用户B的请求后,会从自己的存储空间中取出B未收取的邮件,对应图示⑤;
⑥、163邮箱服务器取出用户B未收取的邮件后,将邮件发给用户B,对应图示的⑥;最后三步用户B收取邮件的过程,使用的协议是POP3;
上面的步骤可能大家不太明白,这里面出现了很多名词,比如邮件客户端软件,邮件服务器,SMTP和POP3协议(邮件传输协议)等等。不明白没关系,接下来我们来详细介绍这些名词。
1、邮件服务器
图示出现了两个邮件服务器,QQ和163邮件服务器。用户想要在网上收发邮件,必须要有专门的邮件服务器。邮件服务器我们可以假想为现实生活中的邮局。
如果按功能划分,邮件服务器可以划分为两种类型:
①、SMTP邮件服务器:用户替用户发送邮件和接收外面发送给本地用户的邮件,对应上图的第一、二步。它相当于现实生活中邮局的邮件接收部门(可接收普通用户要投出的邮件和其他邮局投递进来的邮件)。
②、POP3/IMAP邮件服务器:用户帮助用户读取SMTP邮件服务器接收进来的邮件,对应上图的第六步。它相当于专门为前来取包裹的用户提供服务的部门。
2、电子邮箱
电子邮箱也称为E-mail地址,比如用户A的xx@qq.com,和用户B的xx@163.com。用户能通过E-mail地址标识自己发送的电子邮件,同时也可以通过这个地址接收别人发来的电子邮件。电子邮箱需要到邮件服务器进行申请,也就是说,电子邮箱其实就是用户在邮件服务器上申请的账户。邮件服务器会把接收到的邮件保存到为该账户所分配的邮箱空间中,用户通过用户名密码登录到邮件服务器查收该地址已经收到的邮件。一般来讲,邮件服务器为用户分配的邮箱空间是有限的。
3、邮件客户端软件
我们可以直接在网站上进行邮件收发,也可以用邮件客户端软件。比如常见的FoxMail,Outlook Express。邮件客户端软件通常集邮件撰写,发送和收发功能于一体,主要用于帮助用户将邮件发送给SMTP邮件服务器和从POP3/IMAP邮件服务器读取用户的电子邮件。
4、邮件传输协议
电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议。下面我们分别简单介绍几种协议(后面会详细讲解):
①、SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
②、POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则。
③、IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则。
使用Smtp协议手工发送邮件
SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。SMTP协议的通信双方采用一问一答的命令/响应形式进行对话,SMTP协议分为标准SMTP协议和扩展SMTP协议,标准SMTP协议是1982年在RFC821 文档中定义的,而扩展SMTP协议是1995年在RFC1869 文档中定义的。扩展SMTP协议在标准 SMTP协议基础上的改动非常小,主要增加了邮件安全方面的认证功能,现在我们说的SMTP协议基本上都是扩展SMTP协议。
RFC1869文档参考如下:https://datatracker.ietf.org/doc/html/rfc1869
SMTP 协议中一共定义了18条命令,但是发送一封电子邮件的过程通常只需要6条命令,我将这6调命令/响应的语法格式总结如下

大家可能光看这些命令不太清楚,下面我总结了一下使用Smtp协议手工发送邮件的步骤:

①、和SMTP服务器建立连接,telnet smtp.163.com 25。这条命令是和163邮箱建立连接,如果是和QQ,那么将163换成qq即可,同理别的邮箱也是一样。后面的数字25表示SMTP服务器的端口号。
②、ehlo 发件人用户名。这没什么好说的,就是告诉SMTP服务器发送者的用户名。
③、选择登录认证方式,一般我们在第二步执行完后,会提示有几种认证方式,我们一般选择的是login。即输入命令:auth login
④、分别输入经过Base64加密后的用户名和密码。注意必须是要经过 Base64加密后的用户名和密码,大家可以网上在线转,也可以用后面给的代码进行转换。
⑤、指明邮件的发送人和收件人
mail from:
rcpt to:
⑥、输入data命令,然后编写要发送的邮件内容,邮件的编写格式规则如下:
第一步:输入data
第二步:输入邮件内容
from:----邮件头发件人地址 to: ----邮件头收件人地址 subject:hello world ----邮件头主题 -----空行 This is the first email sent by hand using the SMTP protocol ----邮件的具体内容
⑦、输入“.”表示邮件内容输入完毕
⑧、输入quit命令断开与邮件服务器的连接
下面我用动图的形式给大家展示用Smtp协议手工发送邮件的前面三个步骤:

上面我执行到第4步,剩下的步骤我就直接截图了:

至此,我们一封邮件便发出去了,我们先登陆到QQ邮箱查看(后面我们通过POP3服务器来查收):

SMTP发送邮件遇到问题
①、执行 telent smtp.163.com 25 命令时,报如下错误:

解决办法是:控制面板----程序------启动或关闭 Windows 功能----将Telnet勾上,然后点击确定即可

②、用户名和密码必须要base64加密,在线网站:http://www1.tc711.com/tool/BASE64.htm
③、每一步骤之间输入命令要尽量快,不然会自动断开连接
④、我上面是和163邮箱链接的,如果是和qq邮箱连接,会有一些问题。首先第一步建立连接为 telnet smtp.qq.com 587,端口号为587,不是25。还有第三步,选择认证方式,在执行 auth login之前,先执行:starttls。还有第四步,输入用户名和授权码,而不是用户名和密码,授权码的获取可以参考:
⑤、输入邮件内容时,空行不要忘记了,还有结束输入是以“.”结束的。
使用POP3协议手工接收邮件
邮件服务商专门为每个用户申请的电子邮箱提供了专门的存储空间,SMTP 服务器将接收到的邮件保存到相应用户的存储空间。用户要从邮件服务提供商提供的电子邮箱中获取自己的电子邮件,那么就需要POP3 邮件服务器来完成。
POP3协议:全称为 Post Office Protocol,它定义了邮件客户端程序和POP3邮件服务器的通信规则。
下面我们演示用POP3协议手工接收邮件:

这是在 163 邮箱的一份邮件。(这里没有用qq邮箱演示是因为qq有很多安全限制,步骤比较繁琐,大家遇到问题了可以留言问我)
第一步:用telnet 连接POP3的163邮箱服务器

接下来收取邮件:

相关命令的详细解释如下:

RFC822 邮件格式
英文参考文档如下:
https://datatracker.ietf.org/doc/html/rfc822
RFC822 文档中定义的文件格式包括两个部分:邮件头和邮件体。在上一篇博客,我们通过SMTP服务发送一封邮件,然后用POP3服务器接收。邮件接收内容如下图红色框所显示:

这上面显示的不全,我这里将其内容整理出来,并在每行左边加上标号:
1 Received: from smtpbg5.qq.com (unknown [183.60.61.230]) by mx6 (Coremail) with SMTP id OMCowACXv+ssf99ZD5FqAg--.5570S3; Thu, 12 Oct 2017 22:41:48 +0800 (CST) 2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1507819308; bh=N2xK6iU/bt0tcntOdutSQ3tkYXbTtOi08RT+HjuXmBc=; h=From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID; b=lzBtxAWw0+HB1bGLkkCqlUeU4bvVoMxDp3UZTKq3YCIJt5Ypu4FkE0m5rrrpcxF0D W0/PQajrQTughLTmpjoudI5aDWjfrfkOc1Z0+ltaAraoZfdE5HmNQ0hxQstNa+IbjC GMVEzCOMikVm5qklyCz/1Lwd5mBJ90YkknS3sL08= 3 X-QQ-FEAT: Gf8h89u9tNwRjwDYIPPhYegibbvTgUmwr4I/ntV6mwr6YOyFiWpUpVj+bCsJz tAz24NjMs/p1D8BXG7LYvZRCPMPQV7jdW3AKjTclrSS9xE29fxWsEjYk5QlD1cMIuhHF9Po 1HMwWKIZX8q6smehIwr+t/du8sprvHVue4ty5KMPeWw967qaAZgta5hcnRtgajhZRcIumVx r+K4/nY7I+wwNenOTfHT4Ly4K1Ne+vD7VNJbLHH674HEJ2CsoSEEBW7X/LeeSq6M= 4 X-QQ-SSF: 0001000000000010000000000000007 5 X-HAS-ATTACH: no 6 X-QQ-BUSINESS-ORIGIN: 2 7 X-Originating-IP: 113.57.253.69 8 X-QQ-STYLE: 9 X-QQ-mid: webmail4t1507819307t4823829 10 From: "=?ISO-8859-1?B?MTEzMjgwMzk1MQ==?=" <1132803951@qq.com> 11 To: "=?ISO-8859-1?B?MTgyNzEyNjU3MzI=?=" <18271265732@163.com> 12 Subject: hello world 13 Mime-Version: 1.0 14 Content-Type: multipart/alternative; boundary="----=_NextPart_59DF7F2B_08CB07D0_339F08F2" 15 Content-Transfer-Encoding: 8Bit 16 Date: Thu, 12 Oct 2017 22:41:47 +0800 17 X-Priority: 3 18 Message-ID:19 X-QQ-MIME: TCMime 1.0 by Tencent 20 X-Mailer: QQMail 2.x 21 X-QQ-Mailer: QQMail 2.x 22 X-QQ-SENDSIZE: 520 23 Received: from qq.com (unknown [10.137.130.92]) by smtp.qq.com (ESMTP) with SMTP id ; Thu, 12 Oct 2017 22:41:47 +0800 (CST) 24 Feedback-ID: webmail:qq.com:bgweb:bgweb4 25 X-CM-TRANSID:OMCowACXv+ssf99ZD5FqAg--.5570S3 26 Authentication-Results: mx6; spf=pass smtp.mail=1132803951@qq.com; dki m=pass header.i=@qq.com 27 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73 VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvj4RWLvtDUUUU 28 This is a multi-part message in MIME format. 29 Content-Type: text/plain; charset="ISO-8859-1" 30 Content-Transfer-Encoding: base64 31 PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdsdWNpZGEgR3JhbmRlJywgVmVyZGFu YSwgJ01pY3Jvc29mdCBZYUhlaSc7IGxpbmUtaGVpZ2h0OiAyMy44cHg7Ij5UaGlzIGlzIHRo ZSBmaXJzdCBlbWFpbCBzZW50IGJ5IGhhbmQgdXNpbmcgdGhlIFNNVFAgcHJvdG9jb2w8L3Nw YW4+PC9kaXY+
上面便是RFC822 所定义的邮件格式,从第 1 行到第 30 行都是邮件头,第 31 行是邮件体(经过base64加密过
相关内容
- 一文了解Hive是什么_相关技巧_
- Kali渗透测试之使用Metasploit对Web应用的攻击_相关技巧_
- 使用 Loki 实现 Kubernetes 容器日志监控的方法_相关技巧_
- OpenStack 安装 Keystone的过程详解_相关技巧_
- 详解Git 的 rebase 命令使用方法_相关技巧_
- 知识蒸馏联邦学习的个性化技术综述_相关技巧_
- FedAvg联邦学习FedProx异质网络优化实验总结_相关技巧_
- 反向传播BP学习算法Gradient Descent的推导过程_相关技巧_
- 级联分类器算法原理解析_相关技巧_
- kafka rabbitMQ及rocketMQ队列的消息可靠性保证分析_相关技巧_
