Jack Frost

WEB后台–邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解

本来就打算针对一些固定的特别点的业务(QQ与网易邮件、拦截设计、短信、定时器等等)来进行记录以及解析原理,这些会比较零散记录在JavaWeb的分类里面,感兴趣的童鞋可以去看下。

文章结构:(1)邮件实现与原理;(2)短信实现与原理。

DEMO在本文最下方。

文章目录:

(1)邮件实现与原理

  • 邮件概述(邮件在互联网通信架构中的位置)
  • 一个邮件系统的组成分析
  • 邮件系统–邮件通信过程如图
  • 邮件协议详解
  • Java一键实现邮件发送
  • Java邮件封装和异步实现

    (2)短信实现与原理

  • 短信的概述:(短信在互联网通信架构中的位置)
  • 短信原理
  • 短信系统–短信通信过程
  • 短信的协议
  • 一键实现短信发送
  • Java短信封装和异步实现

一、邮件实现与原理:

(1)邮件概述(邮件在互联网通信架构中的位置):

这里写图片描述

上图就是互联网的TCP/IP架构。具体详情请见我的【计算机网络系列】。

应用层定义了应用程序使用互联网的规程。电子邮件的协议就建立在这一层。

(2)一个邮件系统的组成分析:

一个邮件系统组成必须包括邮件服务器,然后是用户代理和邮件传送协议。

(一)邮件服务器。(存储用户邮箱的地方)

是一个供在网上存储邮件的空间。

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

(二) 用户代理:(用户读取邮件的地方)

就是你用来从邮件服务器上读取或者发送邮件到邮件服务器上的一个软件。

比如常用的OutLook,qq邮箱(公司呈现出来的,邮箱服务器是看不到的另一区域)等等。我们知道,我们的邮件都是存储在邮件服务器上面的,我们发送邮件的时候,去往邮件服务器上面发,我们收取邮件的时候,也需要从服务器上面读。为了方便的完成这些工作,我们就需要用户代理。

(三) 邮件传送协议:(邮箱信息发送的约定)

是指邮件在传送过程中必须遵守的约定,它规定了不同的服务器(或客户端)之间应如何交换信息。

比较常见的有邮件服务器之间的通信协议SMTP以及用户代理与邮件服务器之间的通信协议POP3。(注意:邮件服务器之间的协议是使用SMTP,用户发送邮件到邮件服务器使用的还是SMTP协议,用户从邮件服务器读取邮件用的才是POP3协议)。

(3)邮件系统–邮件通信过程如图:

图取自教材的计算机网络–谢希任

这里写图片描述

邮件通信过程(文字描述):

1)发信人调用自己的用户代理撰写、编辑邮件,并写清楚收件人的邮箱地址;

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

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

4) 发信人的邮件服务器的 SMTP 客户端与接收方邮件服务器的 SMTP 服务器建立 TCP 连接,发信人的邮件服务器使用SMTP协议把这封邮件发送到收件人的邮件服务器上(它会自动根据收件人的邮箱来分析出收件人的邮箱服务器);

5)收件人的邮件服务器收到邮件后,把这封邮件放到收件人在这个服务器上的邮箱中,等待收件人进行读取;

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

(4)邮件协议详解:

(一)SMTP:

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。SMTP主要负责底层的邮件系统如何将邮件从一台机器传至另外一台机器。

SMTP提供了一种邮件传输的机制,当收件方和发件方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP首先由发件方提出申请,要求与接收方SMTP建立双向的通信渠道,收件方可以是最终收件人也可以是中间转发的服务器。收件方服务器确认可以建立连接后,双发就可以开始通信。

(二)POP3:

是把邮件从电子邮箱服务器中传输到本地计算机客户端的协议。

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

(三)IMAP:

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

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

IMAP的一个与POP3的区别是:IMAP它只下载邮件的主题,并不是把所有的邮件内容都下载下来,而是你邮箱当中还保留着邮件的副本,没有把你原邮箱中的邮件删除,你用邮件客户软件阅读邮件时才下载邮件的内容。

(5)Java一键实现邮件发送:(QQ邮箱为例,一会封装用网易邮箱(很多坑))

(一)先导入库:

(二)给发信的邮箱申请协议服务开通

这里写图片描述

(三)一键复制即可实现:

我们需要修改的东西:邮箱、邮箱服务器授权码

这里写图片描述

(6)Java邮件封装和异步实现:(网易邮箱为例)

为什么要异步??邮件和短信都要经过复杂的网络通信,这就意味着很可能极其耗时,使用同步方式,很容易导致主线程卡死,导致极差的体验。

所以,我们应该以异步方式去执行此业务,然后直接告诉用户已经发送(发送情况失败毕竟很少见)。

(一)定接口与实现类:

记得配置好config.properties。分别是发件人邮箱(开通SMTP服务的),授权码,邮件名字

可以看到跟使用qq邮箱有很大区别,但是必须如此配置使用,必须使用Authenticator 去验证

(二)采用工厂模式:

(三)使用线程异步一键调用:


二、短信实现与原理:

(1)短信的概述:(短信在互联网通信架构中的位置)

首先短信与邮件同属于TCP/IP这一层。SMS表示短信服务。简单来讲,它是在手机之间发送文字信息或从个人计算机或手持设备向手机发送信息的一种方式。短信的“短”指的是文本信息的最大发送量:160个字符(字母、数字或拉丁字母中的符号)。至于其他字母,例如中文,一条短信的最大发送量为70个字符。

(2)短信原理:

在理解其原理前,需要先懂得手机的通信原理。

手机通信原理:

尽管您没有使用手机打电话,您的手机也在不停地发送和接收着信息。它通过被称为控制通道的通路与手机发射塔进行通信。这种通讯的目的是让手机系统了解自己所在的信号区域,以便在您移动时,手机可以切换到其他信号区域。每隔一段时间,手机和发射塔将交换数据包以确定一切工作正常。手机也使用控制通道来建立呼叫。当有人打电话给您时,手机发射塔将通过控制通道向手机发送信号,然后手机就会振铃。同时,手机发射塔为手机提供两个语音信道频率用来进行通话。

手机通信为什么这样做??

在美国的标准模拟手机系统中,手机运营商获准在整个城市使用约800个频率。运营商将城市细分成小区,每个小区面积通常约26平方公里。通常把小区看作是一个大六边形网格上的一个个六边形。
由于手机和基站使用低功率发射器,因此相同频率可以在非邻小区中重复使用。每个小区有一个基站,由一个塔和一个安装有无线电设备的小机房组成。在模拟系统中,一个小区使用七分之一可用的双工语音信道。换句话说,在由七个小区构成的六边形网格中,每个小区使用七分之一的可用信道,因此每个小区都有唯一的一组频率,彼此间不会发生冲突:手机运营商通常可以在一个城市中使用832个无线电频率。每部手机在每次通话期间使用两个频率,即一个双工信道,因此每个运营商通常有395个语音信道。其他42个频率用于控制信道。
因此,每个小区大约有56个语音信道可用。也就是在任何小区中,可以有56个人同时用手机通话。以上是第一代的蜂窝方案设计。往后的方案基于此去扩展。
基站与小区内手机之间的传输不会超出该小区太远。蜂窝方案要求无论城市大小,都需要有大量的基站。一般的大城市可能有数百个发射塔,不过由于很多人使用手机,因此按用户平均下来,成本仍能保持较低。每个运营商在各个城市还会设置一个中心局,也称为移动电话交换局(MTSO)。该局处理与普通陆地电话系统的所有电话连接,控制所辖区域的所有基站。

短信通信原理:

基于手机通信原理,控制通道也为SMS短信提供通路。当朋友给您发送SMS短信时,该条短信将以控制通道上小型数据包的形式先通过SMSC(短信业务中心),然后通过手机发射塔,再由发射塔将短信发送到手机。同理,当您发送短信时,手机将通过控制通道将短信发送到发射塔,再由发射塔传送到SMSC,最后从这个位置到达接收目标。

短信的实际数据格式包括短信的长度、时戳、目标电话号码以及格式等等。

为什么是160个字符?就是为什么叫短信??

手机短信可以提供像数字页那样的短量数据。为了避免使用多于标准的转发和回复操作而使系统过载,短信技术的开发人员一致同意使用一次160个字符的最大发送量。但是160个字符的限制并不是绝对的。字符长度限制可能会因网络、手机型号以及无线运营商的差异而不同。许多手机在达到160个字符的限制时将不允许继续键入。这样您只能在发送后才可以继续键入。但是,许多服务可以自动将你所发送的短信拆分成若干个小于等于160个字符的信息块。这样,您就可以键入并发送一长条短信,只不过它会以几条短信的方式传输。

相对于电话的优势:

短信交流要比电话交流更加私密,而且省时。

手机短信是一种存储和转发服务,这意味着,如果您向朋友发送一条短信,短信不会直接进入到您朋友的手机上。这种方法的优势在于,您朋友的手机不必开机或处于服务区内,您也可以发送短信。您发出的短信将被存储在短消息业务中心(可以根据需要存储数日),当您的朋友打开手机或进入服务区时,就会立即收到这条信息。如果不将它删除,这条短信将始终存储在您朋友的SIM卡上。

除了一人对一人的短信交流,SMS也可以用于同时将一条短信发送给很多人,包括联系人列表或是特定区域的所有用户。这种服务叫做群发,企业用它来联系各组员工或通过在线服务向订阅用户发布新闻或其他信息。

(3)短信系统–短信通信过程:

这里写图片描述

当朋友给您发送SMS短信时,该条短信将通过基站以控制通道上小型数据包的形式先通过SMSC(短信业务中心),然后通过手机发射塔,再由发射塔(基站)将短信发送到手机。同理,当您发送短信时,手机将通过控制通道将短信发送到发射塔,再由发射塔传送到SMSC,最后从这个位置到达接收目标。

(4)短信的协议

标准的短信协议是SMPP。

SMPP(ShortMessage Peer to Peer)协议是一个开放的消息转换协议;它定义了一系列操作的协议数据单元(PDUS)和当SMPP运行时ESMS应用系统与SMSC之间交换的数据格式。从而完成SMSC与ESMES(外部短消息实体)的信息交换。SMPP是基于SMSC与ESME之间的请求和响应协议数据单元的交换,每一个SMPP操作都由一个请求PDU和相应的一个响应PDU组成,这种交换一般是基于IP网络。

SMPP协议是一个应用层协议,不提供传输功能。因此,底层网络连接将提供点对点的可靠数据传输。这些传输包括加密包,窗口,流量控制和错误处理等。

但是,广大运营商门都是自己定义自己的协议。如中国电信:SGMP;中国移动:CMPP; 中国联通:SGIP。

(5)一键实现短信发送:

####

实现的效果如下:

这里写图片描述

(6)Java短信封装和异步实现:

同样用工厂模式:

接口

短信接口的实现类:

可以基于我暴露出来的状态码设计,进行一些短信的分门别类判断。

至于如何异步实现,请参考上面邮件的发送。


源码下载:WEB后台–邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解

好了,WEB后台–邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解讲完了,这是实习时候所负责的一些功能,在这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

更多内容,可以访问JackFrost的博客

码字很辛苦,转载请注明来自JackFrost《WEB后台–邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解》

Leave a Reply

Your email address will not be published. Required fields are marked *