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

有人问为什么要邮件短信一起写,呃,短信的东西,非巨型公司都是用第三方的,
第三方的文档支持都十分完整,短信例子的话,我一会也是引用第三方去做一个而已。
主要在于原理,两个都是十分相近的业务,而且都是在TCP/IP的应用层封装,并且设计的重传方案基本相似。
重传方案,为了避免本篇过长,我会在后面一篇文章写出,结合线程或者定时器的重传方案。

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

DEMO在本文最下方。

文章目录:

(1)邮件实现与原理

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

(2)短信实现与原理

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

一、邮件实现与原理:

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

这里写图片描述

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

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

/*	
*	为什么建立在TCP/IP的应用层??原因是??
*	
*	首先确立在现今社会,企业的正式工作都是通过邮件进行。
*	邮件对于可靠性要求非常高,所以就要求一个可靠的传输协议。就把邮件协议建立在TCP/IP的应用层基础上了。IP 协议的主要功能包括无连结数据报传送﹑数据报寻径以及差错处理三部分。IP协议的特点是点到点的,IP对等实体间的通信不经过中间机器,对等实体所在的机器位于同一物理网络,对等机器之间有直接的物理连接。IP层的主要功能是屏蔽下面物理层的差别,向上一层提供一致的数据格式。所有要传输的数据,被按照一定的格式分组封装层IP数据报,数据报单元通过寻径等机制进行传输,在接收方数据报进行重组,得到最初要传送的数据。由于IP协议是不可靠的数据传输协议,由于网络的拥塞而发生的数据丢失等情况是不可避免的,因此Internet 还必须有一定的控制重传机制,这就是差错与控制报文协议(ICMP)。但IP协议还不能解决数据分组在传输过程中可能出现的问题。(透明传输等问题)。因此,还需要TCP协议来提供可靠的并且无差错的通信服务。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收数据以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。IP协议只保证计算机能发送和接收分组数据,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,并且在功能上也是互补的。只有两者的结合,才能保证 Internet 在复杂的环境下正常运行。凡是要连接到 Internet 的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。 TCP/IP 协议除了TCP协议和IP协议,还包含物理接口和IP层之间的ARP/RARP协议,应用层的FTP协议﹑SMTP协议和BOOTP协议等,所用的这些协议构成Intenet 的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邮箱为例,一会封装用网易邮箱(很多坑))

(一)先导入库:

<!-- poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!--zdk add 2017-5-16--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.15</version></dependency><!-- Java邮件操作类--><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.5</version></dependency>

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

这里写图片描述

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

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


import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;
/*** Created by 符柱成 on 2017/6/6.*/
public class JavaMailSendTest {// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)// PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),//     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。public static String myEmailAccount = "751197996@qq.com";//我们申请服务的邮箱public static String myEmailPassword = "";//这个就要填上我们刚刚拿到的授权码// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com;qq邮箱的SMTP服务器地址:smtp.qq.compublic static String myEmailSMTPHost = "smtp.qq.com";// 收件人邮箱(替换为自己知道的有效邮箱)public static String receiveMailAccount = "1433317518@qq.com";public static void main(String[] args) throws Exception {// 1. 创建参数配置, 用于连接邮件服务器的参数配置Properties props = new Properties();                    // 参数配置props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址props.setProperty("mail.smtp.auth", "true");            // 需要请求认证// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),//     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,//     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。/*// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,//                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,//                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)final String smtpPort = "465";props.setProperty("mail.smtp.port", smtpPort);props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");props.setProperty("mail.smtp.socketFactory.fallback", "false");props.setProperty("mail.smtp.socketFactory.port", smtpPort);*/final String smtpPort = "465";props.setProperty("mail.smtp.port", smtpPort);props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");props.setProperty("mail.smtp.socketFactory.fallback", "false");props.setProperty("mail.smtp.socketFactory.port", smtpPort);// 2. 根据配置创建会话对象, 用于和邮件服务器交互Session session = Session.getDefaultInstance(props);session.setDebug(true);                                 // 设置为debug模式, 可以查看详细的发送 log// 3. 创建一封邮件MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount);// 4. 根据 Session 获取邮件传输对象Transport transport = session.getTransport();// 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错////    PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,//           仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误//           类型到对应邮件服务器的帮助网站上查看具体失败原因。////    PS_02: 连接失败的原因通常为以下几点, 仔细检查代码://           (1) 邮箱没有开启 SMTP 服务;//           (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;//           (3) 邮箱服务器要求必须要使用 SSL 安全连接;//           (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;//           (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。////    PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。transport.connect(myEmailAccount, myEmailPassword);// 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人transport.sendMessage(message, message.getAllRecipients());// 7. 关闭连接transport.close();}/*** 创建一封只包含文本的简单邮件** @param session 和服务器交互的会话* @param sendMail 发件人邮箱* @param receiveMail 收件人邮箱* @return* @throws Exception*/public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail) throws Exception {// 1. 创建一封邮件MimeMessage message = new MimeMessage(session);// 2. From: 发件人message.setFrom(new InternetAddress(sendMail, "符柱成主页", "UTF-8"));// 3. To: 收件人(可以增加多个收件人、抄送、密送)message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "XX用户", "UTF-8"));// 4. Subject: 邮件主题message.setSubject("重要通知啊,老哥", "UTF-8");// 5. Content: 邮件正文(可以使用html标签)message.setContent("辅助:打声招呼而已", "text/html;charset=UTF-8");// 6. 设置发件时间message.setSentDate(new Date());// 7. 保存设置message.saveChanges();return message;}
}

这里写图片描述

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

为什么要异步??邮件和短信都要经过复杂的网络通信,这就意味着很可能极其耗时,使用同步方式,很容易导致主线程卡死,导致极差的体验。
所以,我们应该以异步方式去执行此业务,然后直接告诉用户已经发送(发送情况失败毕竟很少见)。

(一)定接口与实现类:

public interface EmailService {/** hisEmail收件人email* subject主题(标题)* content内容(文本)*/void sendEmail(String hisEmail, String subject, String content);}

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

SENDER_MAILBOX=???
MAIL_PASSWPRD=???
MAIL_NAME=BSS\u7CFB\u7EDF\u90AE\u7BB1

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


public class EmailServiceImpl implements EmailService {private static final Log log = LogFactory.getLog(EmailServiceImpl.class);// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)// 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。public static String myEmailAccount = "";public static String myEmailPassword = "";public static String myEmailName = "";// qq邮箱的SMTP服务器地址:smtp.qq.compublic static String myEmailSMTPHost = "smtp.126.com";static {//博主自己封装了一个获取本地文件的配置参数方式,大家可以参考使用。针对config.properties的,想改别的文件请大家自行修改。try {myEmailAccount = Config.getConfigValue("SENDER_MAILBOX");myEmailPassword = Config.getConfigValue("MAIL_PASSWPRD");myEmailName = Config.getConfigValue("MAIL_NAME");System.out.println(myEmailAccount);System.out.println(myEmailPassword);System.out.println(myEmailName);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void sendEmail(String hisEmail, String subject, String content) {System.out.println("myEmailAccount  :" + myEmailAccount);System.out.println("myEmailPassword :" + myEmailPassword);try {// 1. 创建参数配置, 用于连接邮件服务器的参数配置final Properties props = new Properties(); // 参数配置props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.126.com");// 发件人的账号props.put("mail.user", myEmailAccount);// 发件人的密码props.put("mail.password", myEmailPassword);//网易邮箱必须这样,使用Authenticator,进行一系列的验证。不然就是给你504,验证失败或者辣鸡邮件发不出去Authenticator authenticator = new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用环境属性和授权信息,创建邮件会话Session mailSession = Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message = new MimeMessage(mailSession);// 设置发件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 设置收件人InternetAddress to = new InternetAddress(hisEmail);message.setRecipient(RecipientType.TO, to);// 设置邮件标题message.setSubject(subject);// 设置邮件的内容体message.setContent(content, "text/html;charset=UTF-8");// 发送邮件Transport.send(message);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}

(二)采用工厂模式:

public class EmailServiceFactory {public static EmailService getEmailService(){return new EmailServiceImpl();}
}

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

public class EmailTest {//创建一个线程池,可装载大概3个线程任务的private static ExecutorService executorService = Executors.newFixedThreadPool(3);// 收件人邮箱(替换为自己知道的有效邮箱)1433317518public static String receiveMailAccount = "751197996@qq.com";public static void main(String[] args)  {//这种写法详情请去参考lambda表达式executorService.submit(() -> EmailServiceFactory.getEmailService().sendEmail(receiveMailAccount, "BSS系统工单", "<body><p>工单工号GGGGDADA</p></body>"));//调用 shutdown() 方法,ExecutorService 并不会马上关闭,而是不再接收新的任务,一但所有的线程结束执行当前任务,ExecutorServie 才会真的关闭。所有在调用 shutdown() 方法之前提交到 ExecutorService 的任务都会执行。//调用时机由你自己去决定//你希望立即关闭 ExecutorService,你可以调用 shutdownNow() 方法。这個方法会尝试马上关闭所有正在执行的任务,并且跳过所有已经提交但是还没有运行的任务。但是对于正在执行的任务,是否能够成功关闭它是无法保证的,有可能他们真的被关闭掉了,也有可能它会一直执行到任务结束。这是一個最好的尝试。executorService.shutdown();}
}

二、短信实现与原理:

(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)一键实现短信发送:

public class MessageTest {//短信服务提供商。这个就百度吧,很多,真的很多。我随便找的一家提供商。private static String Url = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";public static void main(String[] args) {/*方式二是一键完成短信功能的展示而已*/HttpClient client = new HttpClient();PostMethod method = new PostMethod(Url);client.getParams().setContentCharset("GBK");// 在头文件中设置转码 method.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=GBK");int mobile_code = (int)((Math.random()*9+1)*100000);String content = new String("您的验证码是:" + mobile_code + "。请不要把验证码泄露给其他人。");NameValuePair[] data = {//提交短信new NameValuePair("account", "xxxxxx"),// 注册的用户名  new NameValuePair("password", "xxxxxxx"), //查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY//new NameValuePair("password", util.StringUtil.MD5Encode("密码")),new NameValuePair("mobile", "xxxxx"),//要发的手机new NameValuePair("content", content),//要发的内容};method.setRequestBody(data);try {client.executeMethod(method);//发送短信Header[] headers = method.getResponseHeaders();//短信返回信息int statusCode = method.getStatusCode();//状态码System.out.println("statusCode:" + statusCode);for (Header h : headers) {//响应头的打印System.out.println(h.toString());}String result = null;result = new String(method.getResponseBodyAsString().getBytes("gbk"));//打印响应体System.out.println(result);method.releaseConnection();} catch (IOException e) {e.printStackTrace();}}}}

实现的效果如下:

在这里插入图片描述

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

同样用工厂模式:

public class MessageServiceFactory {public static MessageService getMobileMessageService(){return new MessageServiceSupport(){public String getType() {return MessageServiceSupport.PHONO_MESSAGE_TYPE;}};}
}

接口

public interface MessageService {/*** * @param acceptorName 消息接收者名称* @param acceptor 消息接收者,若是短信为手机号码,若是邮件则是邮箱地址* @param context 消息内容* @return 成功返回true, 内部采用异步机制,这里返回成功只是代表初步校验成功,比如手机号码或邮箱格式校验*/public boolean send(String acceptorName, String acceptor, String context);/*** * @param acceptorName 消息接收者名称* @param acceptor 消息接收者,若是短信为手机号码,若是邮件则是邮箱地址* @param context 消息内容* @return 成功返回true, 内部采用异步机制,这里返回成功只是代表初步校验成功,比如手机号码或邮箱格式校验*/public boolean[] send(String acceptorName, String[] acceptor, String context);public boolean send(String acceptorName, String acceptor, String context, String title);/*** * @param acceptorUserId 接收者的用户ID, cf_user.userid* @param context* @return*/public boolean send(Long acceptorUserId, String context);/*** * @param acceptorLoginId 接收者的登陆ID, cf_user.loginid* @param context* @return*/public boolean send(String acceptorLoginId, String context);}

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

public abstract class MessageServiceSupport implements MessageService {private static String Url = "http://106.ihuyi.cn/webservice/sms.php?method=Submit";public abstract String getType();public static String PHONO_MESSAGE_TYPE = "1";protected boolean checkAcceptor(String acceptor){if(acceptor == null || "".equals(acceptor)){return false;}if(PHONO_MESSAGE_TYPE.equals(getType())){// TODO 验证手机号码}return true;}public boolean send(String acceptorName, String acceptor, String context){return send(acceptorName, acceptor, context, "无标题");}public boolean send(String acceptorName, String acceptor, String context, String title){if(checkAcceptor(acceptor)){try {//如果有业务需求要保存,就用此bean保存。CfMessage message = new CfMessage();message.setType(getType());message.setAcceptor(acceptor);message.setAcceptorname(acceptorName);message.setTitle(title);message.setContext(context);message.setCreatetime(new Date());message.setRecordstatus(1);//前面应该加短信内容状态判断//TODO  短信内容判断,因为一般第三方的API会根据内容去发送//调用发送短信sendMessage(acceptor,context);return true;} catch (Exception e) {e.printStackTrace();}}return false;}public void sendMessage(String acceptor,String content){HttpClient client = new HttpClient();PostMethod method = new PostMethod(Url);client.getParams().setContentCharset("GBK");method.setRequestHeader("ContentType","application/x-www-form-urlencoded;charset=GBK");NameValuePair[] data = {//提交短信new NameValuePair("account", "C65868831"),new NameValuePair("password", "fc422f9380ae002985db316ecce0ab27"), //查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY//new NameValuePair("password", util.StringUtil.MD5Encode("密码")),new NameValuePair("mobile", acceptor),new NameValuePair("content", content),};method.setRequestBody(data);try {client.executeMethod(method);//发送短信Header[] headers = method.getResponseHeaders();//短信返回信息int statusCode = method.getStatusCode();System.out.println("statusCode:" + statusCode);for (Header h : headers) {System.out.println(h.toString());}String result = null;result = new String(method.getResponseBodyAsString().getBytes("gbk"));System.out.println(result);method.releaseConnection();} catch (IOException e) {e.printStackTrace();}}public boolean[] send(String acceptorName, String[] acceptors, String context) {if(acceptors == null || acceptors.length == 0){return null;}boolean[] result = new boolean[acceptors.length];int i = 0;for(String acceptor : acceptors){result[i++] = send(acceptorName, acceptor, context);}return result;}public boolean send(Long acceptorUserId, String context){if(acceptorUserId == null ){return false;}try {List<User> userList=null ;if(userList != null && userList.size() == 1){}} catch (Exception e) {e.printStackTrace();}return false;}public boolean send(String acceptorLoginId, String context){if(acceptorLoginId == null || "".equals(acceptorLoginId)){return false;}try {List<User> userList=null ;if(userList != null && userList.size() == 1){}} catch (Exception e) {e.printStackTrace();}return false;}
}

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


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

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

这是实习时候所负责的一些功能,在这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

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

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 20行代码能干嘛?可以写一条贪吃蛇,你信不信

    这是一个400px*400px的canvas,思路是以20px*20px为一个方格,组成20行20列的方阵,总共400格,然后绿色填充的格子表示蛇身,用黄色表示食物。这400个格子和数字0~399一一对应,对应的方式就是以20作为基数,n / 20再取整表示第几行,n % 20表示第几列。行数和列数都用0~19表示…...

    2024/4/28 0:41:13
  2. Nonpaged Pool(未分页池)占用内存过多分析定位

    问题定位用到三个小工具:RAMMap、Poolmon、Strings.exe 背景:接到项目反馈,应用服务器内存占用达到80%以上,w3wp占400M,剩余的11G内存跑哪里去了呢,任务管理器看不到,但是可以看到Nonpaged Pool(未分页池)占用内存很多。非产品问题本应该由客户管理员去解决,但问题原…...

    2024/4/28 19:29:06
  3. TCP/IP HTTP 三次握手和四次握手

    原文地址:http://www.cnblogs.com/kxdblog/p/4202059.htmlTCP四层模型功能TCP模型特点TCP三次握手过程TCP四次挥手过程一. TCP/IP协议族OSI模型和TCP/IP模型对应关系物理层 --- 数据表示。物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、 功能特性以及过程特…...

    2024/4/28 9:32:21
  4. 浅谈Android开发中内存泄露与优化与框架模式之MVC与MVP

    》浅谈Android开发中内存泄露与优化内存泄露是在Android开发中尤其要重视的一个问题,对开发人员开说,这是一个很容易犯也很常见的错误。优化内存泄露的问题,主要从两方面着手,一是开发人员避免写出有内存泄露的代码,二是通过一些诸如MAT的内存分析工具来找出潜在的内存泄露…...

    2024/4/17 17:10:29
  5. 数据库管理系统的登录名、角色,数据库的用户、角色和架构

    概述之前的一篇博客中写到过关于服务器登录名,服务器角色,数据库用户,数据库角色的关系,理论的一些知识,大家可以看看这篇博客:登录名,服务器角色,用户名和数据库角色。本片博客注重操作。数据库架构在具体的操作时,先普及一下数据库架构的知识,这里需要注意一下,这…...

    2024/4/28 7:15:58
  6. 【游戏算法之贪吃蛇】我想的贪吃蛇算法

    欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 原文地址 很久以前自己写过贪吃蛇游戏。。用的QT。 当时没想太多就写了...现在 把当时写贪吃蛇用到的小蛇的算法大致梳理一遍。 因为时隔一年多之久,当时用QT写的游戏,所以现在只…...

    2024/4/28 9:52:29
  7. Perl中取得字符串长度的函数length

    lenght EXPRlength 返回EXPR代表的字符集的长度。如果没有输入EXPR,则返回$_的长度。注意length不能用于取得数组或hash的元素个数。请使用“scalar @array”和“scalar key %hash”取得各自的元素个数。 注意如果EXPR是Unicode,lenght取得字符集的字符数,而不是字节数。如果…...

    2024/4/28 12:59:26
  8. JAVA五子棋小游戏

    学完Java基础书时总想着要自己编写出小游戏,事情并非如自己所愿,每次鼓起勇气来编写时,总是不知道该怎么写,写到一半就开始放弃。因为自己习惯跟着视屏去看和编写,思路和方法都是老师教,自己根本无法去考虑那么的多,所以一直写不出属于自己的东西。今天通过这篇文章来分…...

    2024/4/28 0:02:49
  9. 贪吃蛇-VGA显示图片

    文章目录说明VGA原理vga模块代码设计rom_start_ctrl模块代码设计C语言产生mif文件显示效果福利 说明 由于最近有很多同学对基于FPGA的贪吃蛇游戏很感兴趣,趁着最近有时间,特将之前贪吃蛇游戏重新设计一遍,并给出详细的设计步骤,方便大家学习!一共分2期,本期教程主要解决V…...

    2024/4/28 17:25:06
  10. TCP 为什么三次握手而不是两次握手(正解版)

    参考文章 Why do we need a 3-way handshake? Why not just 2-way 大部分网络博客的错误解读 首先需要声明的是, 百度搜索到的大部分网络博客关于这个问题的解答都是不清晰或者不准确的。 讨论这个问题的大部分博客都会引用《计算机网络》的内容:防止已失效的连接请求又传送…...

    2024/4/18 9:08:47
  11. flink的内存管理

    在大数据面前,JVM的内存结构和GC机制往往会成为掣肘1. 对象开销:在HotSpot中,每个对象占用的内存空间必须是8的倍数。这就导致每个对象占据的内存空间包含三部分:头信息(header)、类的field所占空间、对齐需要的空间(padding,由于前两个大小不够8导致),所以只有一个b…...

    2024/4/27 21:22:38
  12. AS3.0中文字符串长度的获取

    参考:http://bbs.9ria.com/thread-13254-1-1.html import flash.utils.ByteArray;private function getStringByLength(_str:String , _l:int):String{var _ba:ByteArray = new ByteArray ;_ba.writeMultiByte (_str, "");if (_ba.length <= _l) return _str;_ba…...

    2024/4/28 17:52:09
  13. SqlServer 作业完成后邮件通知

    1、管理 》数据库邮件》创建smtp服务器的邮件,如邮件为abc@126.com,服务器smtp.126.com2、启动“sqlserver代理”,在操作员中新建操作员,如abc_am,并提供邮件地址,如:888@126.com3、配置“sqlserver代理”(右键“属性”),在“警报系统”选项中,选中“启用邮件配置文…...

    2024/4/28 1:57:08
  14. 在web中实现邮件发送功能

    在web站点中也可以集成邮件客户端软件的功能,以便web站点的注册用户可以通过web页面来收发电子邮件,例如,sina和sohu等大型门户网站都会为会员提供了通过web页面来收发电子邮件的功能。对于一些中小型的web站点来说,虽然不需要为其会员提供web页面的电子邮件收发功能,但是…...

    2024/4/18 15:11:36
  15. linux下使用free命令查看实际内存占用(可用内存)

    转:http://blog.is36.com/linux_free_command_for_memory/linux下在终端环境下可以使用free命令看到系统实际使用内存的情况,一般用free-m方式查看内存占用情况(兆为单位)。而系统实际可用内存是不是free部分呢,不是的,系统实际内存占用以及可用内存有如下几个加减法: u…...

    2024/4/20 13:32:08
  16. 通过ftp服务器验证tcp三次握手

    https://blog.csdn.net/codes_first/article/details/78243788...

    2024/4/28 2:17:54
  17. 贪吃蛇的JAVA实现

    最近JAVA和JSwing上手练习了一下贪吃蛇先上代码 https://github.com/rgzhang2018/snake欢迎交流和加入新的内容用到了JSwing,下面是一些具体的思路实现* 蛇:采用单链表记录首尾,整个蛇被分为lattice格子,放在map里* 移动: 我在实现的过程中发现最难得反而是蛇的定义和实现…...

    2024/4/28 16:54:27
  18. 一个简单的C++回合制游戏,游戏完整源码展示

    Visual+C++编写的一个回合制游戏演示源码,源码编译环境为vs2010,希望能和大家一起交流,共同学习,共同进步。请注意,要运行生成的EXE文件,请先将EXE文件从Debug目录中拷出来,放到上一级与图像文件同级的目录下。源码目录:代码展示:效果展示:3d视角,时间设定从石器时代…...

    2024/4/28 15:46:23
  19. Golang 求字符串长度之坑

    golang对字符串的储存是以UTF-8进行储存的 go语言中len()函数可以获取 数组、数组切片,以及ASCII型字符串(如不含汉字)的长度,而字符串因为在go语言中是以utf-8形式储存。所以:str1 := "代码"str2 := "代码使我快乐"//lenfmt.Println(len(str1)) //le…...

    2024/4/28 6:04:17
  20. Wireshark抓包示范:TCP三次握手建立连接和四次握手断开连接

    转载请标注: 披萨大叔的博客 http://blog.csdn.net/qq_27258799/article/details/51379508 如果您觉得这篇文章对您有帮助,请点下文章最下面的赞~以下内容来自网络资源整合,仅供自己记录,日后查看方便。首先介绍Wireshark抓包工具,它长这样:下面我们要设置过滤规则:按如…...

    2024/4/11 18:43:11

最新文章

  1. 栈和队列总结

    文章目录 前言一、栈和队列的实现1.栈的具体实现2.循环顺序队列的具体实现 二、栈和队列总结总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结构 C语言版…...

    2024/4/28 20:06:04
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 数据结构——二叉树——二叉搜索树(Binary Search Tree, BST)

    目录 一、98. 验证二叉搜索树 二、96. 不同的二叉搜索树 三、538. 把二叉搜索树转换为累加树 二叉搜索树&#xff1a;对于二叉搜索树中的每个结点&#xff0c;其左子结点的值小于该结点的值&#xff0c;而右子结点的值大于该结点的值 一、98. 验证二叉搜索树 给你一个二叉树的…...

    2024/4/26 8:24:13
  4. STM32重要参考资料

    stm32f103c8t6 一、引脚定义图 二、时钟树 三、系统结构图 四、启动配置 &#xff08;有时候不小心短接VCC和GND&#xff0c;芯片会锁住&#xff0c;可以BOOT0拉高试试&#xff08;用跳线帽接&#xff09;&#xff09; 五、最小系统原理图 可用于PCB设计 六、常见折腾人bug…...

    2024/4/26 8:20:13
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57