六、邮件收发

电子邮件

要在网络上实现邮件功能,必须要有专门的邮件服务器。

这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

SMTP服务器地址:一般是smtp.xxx.com, 比如163邮箱是smtp.163.com, qq邮箱是smtp.qq.com

电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。

传输协议

SMTP协议

发送邮件:

我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议

接收邮件:

我们通常把处理用户POP3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

【注意】有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这个时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试。

Java发送邮件

概述:

我们将用代码完成邮件的发送。这在实际项目中应用的非常广发,比如注册需要发送永健进行账号激活,再比如OA项目中利用邮件进行任务提醒等。

使用java发送E-mail十分简单,但是首先你应该准备JavaMail和Java Activation Framework.

得到两个jar包:

  • mail.jar

    下载地址:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7

  • activation.jar

    下载地址:https://mvnrepository.com/artifact/javax.activation/activation/1.1.1

JavaMail是sun公司(现以被甲骨文收购)为方便java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME。我们在使用JavaMail API编写邮件时,无须考虑邮件的底层实现细节,只调用JavaMail开发包中相应的API类就可以了。

我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。

  • 创建包含邮件服务器的网络连接信息的Session对象。

  • 创建代表邮件内容的Message对象

  • 创建Transport对象,连接服务器,发送Message,关闭连接

主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。

MIME(多用途互联网邮件扩展类型)

简单邮件:没有附件和图片,纯文本邮件
复杂邮件:有附件和图片,不是纯文本邮件

发送简单邮件

使用JavaMail发送邮件五个步骤:

1.创建定义整个应用程序所需的环境信息的Session对象
2.通过Session得到transport对象
3.使用邮箱的用户名和授权码连上邮件服务器
4.创建邮件:写邮件【主体】
5.发送邮件
6.关闭连接

纯文本邮件

注意QQ邮箱SSL加密有两个地方不同于其他邮箱

package com.kuang.servlet;import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;//简单邮件:文本
public class MailDemo01 {public static void main(String[] args) throws GeneralSecurityException, MessagingException {Properties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");prop.setProperty("mail.transport.protocol","smtp"); //邮件发送协议prop.setProperty("mail.smtp.auth","true"); //需要验证用户密码//关于QQ邮箱,还需要设置SSL加密,加上下面代码即可,其他邮箱不需要MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);/*使用JavaMail发送邮件五个步骤1.创建定义整个应用程序所需的环境信息的Session对象2.通过Session得到transport对象3.使用邮箱的用户名和授权码连上邮件服务器4.创建邮件:写邮件【主体】5.发送邮件6.关闭连接*///1.创建定义整个应用程序所需的环境信息的Session对象//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//发件人邮箱用户名,授权码return new PasswordAuthentication("xxxx@qq.com","授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过Session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","xxxx@qq.com","授权码");//4.创建邮件:写邮件//主要专递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("xxxx@qq.com"));//指明邮件收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("18260036612@163.com"));//邮件的主题message.setSubject("简单邮件");//邮件的文本内容message.setContent("<h1 style='color:red'>只有文本的简单邮件<h1>","text/html;charset=utf-8");//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接}
}

带图片和附件的邮件

先认识两个类一个名词:

MIME(多用途互联网邮件扩展类型)

MimeBodyPart类

javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

MimeMultipart类

javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。

文本中嵌入图片的邮件

只有邮件的内容发生了改变

MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次

package com.kuang.servlet;import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties;//文本+嵌入文本的内容
public class MailDemo02 {public static void main(String[] args) throws GeneralSecurityException, MessagingException {Properties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");prop.setProperty("mail.transport.protocol","smtp"); //邮件发送协议prop.setProperty("mail.smtp.auth","true"); //需要验证用户密码//关于QQ邮箱,还需要设置SSL加密,加上下面代码即可,其他邮箱不需要MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);/*使用JavaMail发送邮件五个步骤1.创建定义整个应用程序所需的环境信息的Session对象2.通过Session得到transport对象3.使用邮箱的用户名和授权码连上邮件服务器4.创建邮件:写邮件【主体】5.发送邮件6.关闭连接*///1.创建定义整个应用程序所需的环境信息的Session对象//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//发件人邮箱用户名,授权码return new PasswordAuthentication("xxxx@qq.com","授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过Session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","xxxx@qq.com","授权码");//4.创建邮件:写邮件//主要专递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("xxxx@qq.com"));//指明邮件收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));//邮件的主题message.setSubject("简单邮件");//********************只有邮件的内容发生了改变*******************//邮件的内容:文本+嵌入文本的图片//MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次//1)准备图片,需要经过数据处理MimeBodyPart image=new MimeBodyPart();DataHandler dataHandler=new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\1.png"));image.setDataHandler(dataHandler);image.setContentID("bz.jpg");//2)准备正文数据MimeBodyPart text=new MimeBodyPart();text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");//3)图片和文本封装在一起,描述数据关系MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");//4)设置到消息中,保存修改message.setContent(mm); //把最后编辑好的文件放到消息中去message.saveChanges(); //保存修改//***********************************************************//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接}
}

文本中嵌入图片、带有附件的邮件

邮件内容提取成一个方法

  1. 图片,需要经过数据处理 MimeBodyPart1
  2. 文本 MimeBodyPart2
  3. 附件 MimeBodyPart3
  4. 图片和文本嵌套 MimeBodyPart1+MimeBodyPart2=>MimeMultipart1
  5. MimeMultipart=>multipart1再封装成MimeBodyPart,将imageText和附件组合 >MimeMultipart1=>MimeBodyPart4 MimeBodyPart4+MimeBodyPart3=>MimeMultipart allFile
  6. 放到message消息中
package com.kuang.servlet;import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.security.GeneralSecurityException;
import java.util.Properties;//文本+嵌入文本的内容
public class MailDemo03 {public static void main(String[] args) throws GeneralSecurityException, MessagingException {Properties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");prop.setProperty("mail.transport.protocol","smtp"); //邮件发送协议prop.setProperty("mail.smtp.auth","true"); //需要验证用户密码//关于QQ邮箱,还需要设置SSL加密,加上下面代码即可,其他邮箱不需要MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);/*使用JavaMail发送邮件五个步骤1.创建定义整个应用程序所需的环境信息的Session对象2.通过Session得到transport对象3.使用邮箱的用户名和授权码连上邮件服务器4.创建邮件:写邮件【主体】5.发送邮件6.关闭连接*///1.创建定义整个应用程序所需的环境信息的Session对象//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//发件人邮箱用户名,授权码return new PasswordAuthentication("xxxx@qq.com","授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过Session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","xxxx@qq.com","授权码");//********************只有邮件的内容发生了改变*******************//4.创建邮件:写邮件//邮件的内容:文本+嵌入文本的图片+附件//MimeBodyPart相当于是一层封装,文本、图片、附件各自有封装,最后再封装一次//此处将邮件内容提取成了一个方法MimeMessage message=imageMail(session);//***********************************************************//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接}/*** 邮件内容提取成一个方法* @param session* @return* @throws MessagingException*/public static MimeMessage imageMail(Session session) throws MessagingException {//主要专递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("xxxx@qq.com"));//指明邮件收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));//邮件的主题message.setSubject("简单邮件");//********************只有邮件的内容发生了改变(文本、图片、附件)*******************/*1)图片,需要经过数据处理 MimeBodyPart12)文本 MimeBodyPart23)附件 MimeBodyPart34)图片和文本嵌套 MimeBodyPart1+MimeBodyPart2=>MimeMultipart15)MimeMultipart=>multipart1再封装成MimeBodyPart,将imageText和附件组合 >MimeMultipart1=>MimeBodyPart4 MimeBodyPart4+MimeBodyPart3=>MimeMultipart allFile6)放到message消息中*///1)图片,需要经过数据处理MimeBodyPart image=new MimeBodyPart();DataHandler dataHandler=new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\1.png"));image.setDataHandler(dataHandler);image.setContentID("bz.jpg"); //图片设置ID//2)文本MimeBodyPart text=new MimeBodyPart();text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","text/html;charset=UTF-8");//3)附件MimeBodyPart fujian=new MimeBodyPart();fujian.setDataHandler(new DataHandler(new FileDataSource("E:\\winfile\\桌面\\javaweb\\maven\\mail\\src\\刘杰.pdf")));fujian.setFileName("fujian.pdf"); //附件设置名字【图片设置很相似】//4)图片和文本嵌套MimeMultipart multipart1=new MimeMultipart(); //注意区分MimeBodyPart和MimeMultipartmultipart1.addBodyPart(image);multipart1.addBodyPart(text);multipart1.setSubType("related");//MimeMultipart=>multipart1再封装成MimeBodyPartMimeBodyPart imageText=new MimeBodyPart();imageText.setContent(multipart1);//5)将imageText和附件组合MimeMultipart allFile=new MimeMultipart();allFile.addBodyPart(imageText);allFile.addBodyPart(fujian);allFile.setSubType("mixed");//6)放到message消息中message.setContent(allFile);message.saveChanges(); //保存修改return message;}}

网站注册发送邮件Servlet实现

现在很多的网站都提供用户注册功能,通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现这样一个功能,用户注册成功之后,将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

用户注册页面 index.jsp

<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">用户名:<input type="text" name="username"><br/>密码:<input type="password" name="password"><br/>邮箱:<input type="text" name="email"><br/><input type="submit" value="注册">
</form>

用户注册成功页面 info.jsp

采用线程异步的形式,“邮件发送”和“舔砖用户注册成功页面”并发,因为邮件发送过程较慢,防止用户等待和页面加载时间过长;

<html>
<head><title>Title</title>
</head>
<body><h1>xx网站提示</h1>${message}
</body>
</html>

邮件发送成功结果

结构:

用户通过index.jsp页面注册,交给RegisterServlet处理;

RegisterServlet通过Sendmail发送邮件,并转发到结果页面info.jsp

【易错】注意导包、引用包;

在structure中的Artifact的查看lib的包是否真的在程序运行是导入了,如果没有点击+号导入

pojo包中实体类User

package com.kuang.pojo;//实体类首先实现序列化接口Serializable,以方便进行网络传输
public class User {private String username;private String password;private String email;//构造方法public User(){}public User(String username, String password, String mail) {this.username = username;this.password = password;this.email = mail;}//getter和setterpublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}

utils包中Sendmail

将邮件发送提取成一个工具类

实现thread方法,便于使用线程

package com.kuang.utils;import com.kuang.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;//网站3秒原则:用户体验,网页不能白屏超过3s
//多线程实现用户体验(异步处理)
public class Sendmail extends Thread{//用于给用户发送邮件的邮箱private String from="840493237@qq.com";//邮箱用户名private String username="840493237@qq.com";//邮箱密码,授权码private String password="xdcptgfkrsmzbdjj";private String host="smtp.qq.com";private User user;public Sendmail(User user){this.user=user;}//重写run方法,在run方法中发送邮件给指定的用户public void run(){try {System.out.println(user.toString());Properties prop = new Properties();prop.setProperty("mail.host",host);///设置QQ邮件服务器prop.setProperty("mail.transport.protocol","smtp");///邮件发送协议prop.setProperty("mail.smtp.auth","true");//需要验证用户密码//QQ邮箱需要设置SSL加密MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需的环境信息的Session对象//QQ邮箱才需在初始化Session时,需要授权new Authenticator(),其他邮箱不用Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {//发件人邮箱用户名,授权码return new PasswordAuthentication("840493237@qq.com","ishrfshafzpybeid");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过Session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","840493237@qq.com","ishrfshafzpybeid");//4.创建邮件:写邮件//主要专递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("840493237@qq.com"));//指明邮件收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//邮件的主题message.setSubject("用户注册邮件");//邮件的文本内容String info = "恭喜您注册成功,您的用户名: " + user.getUsername() + ",您的密码" + user.getPassword() + ". 请妥善保管您的密码,如有问题请及时联系网站客服,再次欢迎您的加入!!";message.setContent(info,"text/html;charset=utf-8");//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}catch (Exception e){throw new RuntimeException(e);}}}

servlet包中RegisterServlet

采用线程,异步处理“邮件发送”和“邮件发送成功”页面

package com.kuang.servlet;import com.kuang.pojo.User;
import com.kuang.utils.Sendmail;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username=request.getParameter("username");String password=request.getParameter("password");String email=request.getParameter("email");User user = new User(username, password, email);//用户注册成功之后,给用户放松一封邮件//【关键】我们使用线程来专门发送邮件,防止出现耗时,和网址注册人数过多的情况Sendmail send=new Sendmail(user);//启动线程send.start();//send.run(); //这个不是多线程,它会等到程序结束才会弹出相应结果//注册用户request.setAttribute("message","注册成功,我们已经发了一封带注册信息的电子邮件,请查收!由于网络原因,您收到邮件的时间存在延迟,敬请谅解~");request.getRequestDispatcher("info.jsp").forward(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}

第1天学习打卡(Javaweb 邮件发送:原理、发送简单文本邮件、发送带图片和附件邮件、网站注册发送邮件Servlet实现)相关推荐

  1. html 弹出一个邮件连接,mailto scheme 高级用法, 显示带html样式的邮件文本

    需求: 今天同事问我一个需求,就是如果用html的mailto scheme,能否当其点击后弹出的outlook中,其内容正文部分是一个带有html的样式或格式的? 真是这样的么?因为10年前当刚接触 ...

  2. java 发送邮件 outlook_JavaMail发送带图片正文的邮件,outlook等邮箱不显示的问题 | 学步园...

    //认证 Authenticator authenticator = new Authenticator() { @Override protected PasswordAuthentication ...

  3. 网站注册邮件发送功能实现

    摘抄自狂神笔记 电子邮件 要在网络上实现邮件功能,必须要有专门的邮件服务器. 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服 ...

  4. 【项目实战】springboot+vue舞蹈课程在线学习系统-java舞蹈课程学习打卡系统的设计与实现

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 本文目录 1.开发环境 2 系统设计 2.1 背景意义 2.2 技术路线 2.3 主要研究内容 3 系统页面展示 3.1 学生 3.2 教师页面 ...

  5. 坚持学习打卡的人,将来会变成什么样?

    坚持打卡的人,将来会变成怎么样?让我们拭目以待.我组织了一个打卡活动,希望大家踊跃参加. 有一个励志故事: 在中国的最东边生长着一种竹子,名叫"毛竹".那里的农民到处播种,每天精心 ...

  6. numpy 转存为matlab_Numpy学习打卡task01

    今天带来的是Datawhale自主学习Numpy下学习打卡笔记第一部分-输入输出(为什么没有上,别问,问就是numpy.tan(90)).本文大致介绍了numpy的相关背景知识.本文素材来自网络及da ...

  7. 普中科技开发板使用说明书_百度大脑加持,米尔科技FZ3深度学习计算卡评测

    如果你要问我现在电子产业什么最热,那无疑是AI,而基于大数据训练的深度学习技术可以说是目前AI应用的最广,最成功的产品形态了,覆盖我们生活的方方面面,诸如购物.看病.新闻编辑等,在这高深技术的背后少不 ...

  8. zynq无法识别sd卡_百度米尔携手推出FZ3深度学习计算卡!

    前言:百度大脑是百度 AI 核心技术引擎,包括视觉.语音.自然语言处理.知识图谱.深度学习等AI核心技术和AI开放平台. 基于 Xilinx Zynq UltraScale+ MPSoC 的 Edge ...

  9. cad截图软件_AutoCAD电气制图协会线上CAD学习打卡活动结束

    为了给同学们营造一个良好的学习氛围,让同学们在轻松的氛围下完成自己的CAD学习计划,在6月10日,AutoCAD电气制图协会举办的为时7天的线上CAD学习打卡活动正式结束.此次线上CAD学习打卡活动由 ...

  10. Mathmatica的学习打卡day 16

    Mathmatica的学习打卡day 16 ----太原理工大学机器人团队 今天的学习内容为二维数据作图(学习来自哔哩哔哩) ListPlot函数 ListPlot函数是用来绘制散点图的,ListPl ...

最新文章

  1. 读书人:人机融合中的深度态势感知
  2. Linux安装weblogic方式,Linux下weblogic安装图解
  3. 数据库——环境初建改端口和密码(转)
  4. 获取客户端ip_代理IP工具能否解决反爬?
  5. (JAVA)String类之比较方法(2)
  6. qt 进程打开excel_Python干货:多进程与多线程!
  7. 正能量励志文字手机壁纸
  8. Spring MVC 3.0 RESTful controller
  9. linux下keytool生成证书_Keytool生成https证书步骤0014
  10. [AlwaysOn Availability Groups]健康模型 Part 1——概述
  11. AT2164 AGC006C Rabbit Exercise
  12. 《Excel数据处理与分析实战技巧精粹》扫描版[PDF]
  13. 将MATLAB中不显示个别图例,隐藏图中某些图形对象的MATLAB图例条目
  14. 可以免费测试的短信验证码接口接入
  15. 计算机睡眠和休眠哪个更好,详解电脑睡眠和休眠的区别
  16. 土豆linux,土豆里安装linux是什_土豆发芽图片
  17. 格拉姆矩阵(Gram matrix)详细解读
  18. Serval Project——Android
  19. 消息模板占位符的使用
  20. java获取text plain_request中获取post的json对象数据content-type=“text/plain”

热门文章

  1. 数商云跨境电商平台解决方案 1
  2. 私域流量运营部门员工团队KPI绩效管理考核方案计划表格
  3. 南师大GIS考研数据库2015年第三题
  4. 艾萨克·阿西莫夫《日暮》
  5. win11如何备份系统 Windows11备份系统的设置方法
  6. java中refresh是什么_JavaWeb Refresh响应头代码实例详解
  7. 小区人脸识别门禁系统解决方案
  8. linux打开笔记本摄像头驱动程序,Linux下使用Opencv打开笔记本摄像头
  9. python分号怎么用_go、java已经python中分号的使用
  10. 同学使用计算机存在的问题,计算机应用基础教学问题及应对策略