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

摘抄自狂神笔记

电子邮件

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

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

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

  • 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
传输协议

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

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

邮件收发原理
在这里插入图片描述
1、邮件服务器

​ ①SMTP邮件服务器:替用户发送邮件和接收外面发送给本地用户的邮件

​ ②POP3/IMAP邮件服务器:帮助用户读取SMTP邮件服务器接收进来的邮件

2、邮件传输协议

​ ①电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议

​ ②SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则

​ ③POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则

​ ④IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则

我们说所有的邮件服务器和邮件客户端软件程序都是基于上面的协议编写的

引自:https://www.jb51.net/article/125852.htm

使用Java实现邮件发送需要使用到的类
概述

我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail API 和Java Activation Framework 。得到两个jar包:1.mail.jar2.activation.jarJavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。- 创建包含邮件服务器的网络连接信息的Session对象。- 创建代表邮件内容的Message对象- 创建Transport对象,连接服务器,发送Message,关闭连接主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。

在这里插入图片描述

邮件分类

  • 简单邮件:没有除了文字以外的其他所有文件(包括附件和图片、视频等),即纯文本邮件

  • 复杂邮件:除了传统的文字信息外,还包括了一些非文字数据的邮件

需要发送邮件首先就要我们的邮箱账号支持POP3和SMTP协议,所以我们需要开启邮箱的POP3+SMTP服务,然后我们需要复制下图中的授权码,这个授权码就相当于你的QQ密码,你可以使用你的邮箱账号+授权码来发送邮件,而SMTP服务器也就是使用这个来识别你的身份的

在这里插入图片描述

package com.thhh;import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;//发送一封简单的邮件
public class MailDemo01 {public static void main(String[] args) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置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 session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码return new PasswordAuthentication("XXXX@qq.com", "授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2、通过session得到transport对象Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象//3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码");//4、创建邮件对象MimeMessage——点击网页上的写信//创建一个邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人//邮件的标题——在网页上填写邮件标题message.setSubject("简单邮件发送实现");//设置邮件主题//邮件的文本内容——在网页上填写邮件内容message.setContent("<h2 style='color:red'>你好啊!</h2>", "text/html;charset=UTF-8");//设置邮件的具体内容//5、发送邮件——在网页上点击发送按钮ts.sendMessage(message, message.getAllRecipients());//6、关闭连接对象,即关闭服务器上的连接资源ts.close();}
}

运行测试

在这里插入图片描述
解析以下简单邮件发送的7个固定步骤,如果你要使用,直接复制粘贴代码,并将你的邮箱+授权码填进去就可以用了
1、准备一些参数

 Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置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);

2、获取session对象

  //1、创建定义整个应用程序所需的环境信息的 Session 对象//使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码Session session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码return new PasswordAuthentication("XXXX@qq.com", "授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//不开DEBUG我们在控制台就看不到它是怎么发送的邮件,只能等着程序结束再去邮箱中查看是不是收到了邮件

3、获取传输对象

  //2、通过session得到transport对象Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象

4、登陆授权

  //3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码");

5、写邮件

 //4、创建邮件对象MimeMessage——点击网页上的写信//创建一个邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人//邮件的标题——在网页上填写邮件标题message.setSubject("简单邮件发送实现");//设置邮件主题//邮件的文本内容——在网页上填写邮件内容message.setContent("<h2 style='color:red'>你好啊!</h2>", "text/html;charset=UTF-8");//设置邮件的具体内容

6、发送邮件

 //5、发送邮件——在网页上点击发送按钮ts.sendMessage(message, message.getAllRecipients());

7、关闭服务器资源

  //6、关闭连接对象,即关闭程序中打开的连接资源ts.close();

复杂邮件就是非纯文本的邮件,可能还包含了图片和附件等资源

先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)

  • MimeBodyPart类

​ javax.mail.internet.MimeBodyPart类表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。即一个MIME消息对应一个MimeBodyPart对象,而MimeBodyPart对象就是我们写的邮件内容中的元素
在这里插入图片描述

  • MimeMultipart类

​ javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。即一个MimeMultipart对象表示多个MimeBodyPart的集合,而一个MimeMultipart表示的就是我们一封邮件的内容

在这里插入图片描述
MimeMultipart对象的使用的时候需要设置setSubType()的属性值,一共就下面3种取值

  • alternative:表明这个MimeMultipart对象中的MimeMessage对象的数据是纯文本文件
  • related:表明这个MimeMultipart对象中的MimeMessage对象的数据包含非纯文本文件
  • mixed:表明这个MimeMultipart对象中的MimeMessage对象的数据包含附件

我们在使得的时候如果不知道使用哪一个,直接使用mixed即可,使用这个属性值一定不会报错

在这里插入图片描述
相较于简单邮件,复杂邮件变化的地方只是在于邮件内容本身会发送变化,而其他的步骤都是一样的

​ 1、准备一些参数

​ 2、获取session对象

​ 3、获取传输对象

​ 4、登陆授权

5、写邮件 (和简单邮件相区别)

​ 6、发送邮件

​ 7、关闭服务器资源

1、发送包含图片的复杂邮件

package com.thhh;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.util.Properties;//发送一封简单的邮件
public class MailDemo01 {public static void main(String[] args) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置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 session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码return new PasswordAuthentication("XXXX@qq.com", "授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2、通过session得到transport对象Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象//3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码");//4、创建邮件对象MimeMessage——点击网页上的写信//创建一个邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人//邮件的标题——在网页上填写邮件标题message.setSubject("简单邮件发送实现");//设置邮件主题System.out.println("=============================复杂邮件的邮件内容设置==================================");// 准备邮件数据// 准备图片数据MimeBodyPart image = new MimeBodyPart();//获取一个图片的MimeBodyPart对象DataHandler dh = new DataHandler(new FileDataSource("图片的绝对地址"));//由于图片需要字符化才能传输,所以需要获取一个DataHandler对象image.setDataHandler(dh);//将图片序列化image.setContentID("bz.jpg");//为图片的MimeBodyPart对象设置一个ID,我们在文字中就可以使用它了// 准备正文数据MimeBodyPart text = new MimeBodyPart();//获取一个文本的MimeBodyPart对象text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html;charset=UTF-8");//设置文本内容,注意在里面嵌入了<img src='cid:bz.jpg'>// 描述数据关系MimeMultipart mm = new MimeMultipart();//获取MimeMultipartmm.addBodyPart(text);//将文本MimeBodyPart对象加入MimeMultipart中mm.addBodyPart(image);//将图片MimeBodyPart对象加入MimeMultipart中mm.setSubType("related");//设置MimeMultipart对象的相对熟悉为related,即发送的数据为文本+非附件资源//设置到消息中,保存修改message.setContent(mm);//将MimeMultipart放入消息对象中message.saveChanges();//保存上面的修改System.out.println("===============================================================");//5、发送邮件——在网页上点击发送按钮ts.sendMessage(message, message.getAllRecipients());//6、关闭连接对象,即关闭服务器上的连接资源ts.close();}
}

只改了第5步

	// 准备邮件数据// 准备图片数据	MimeBodyPart image = new MimeBodyPart();//获取一个图片的MimeBodyPart对象DataHandler dh = new DataHandler(new FileDataSource("图片的绝对地址"));//由于图片需要字符化才能传输,所以需要获取一个DataHandler对象image.setDataHandler(dh);//将图片序列化image.setContentID("bz.jpg");//为图片的MimeBodyPart对象设置一个ID,我们在文字中就可以使用它了// 准备正文数据MimeBodyPart text = new MimeBodyPart();//获取一个文本的MimeBodyPart对象text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html;charset=UTF-8");//设置文本内容,注意在里面嵌入了<img src='cid:bz.jpg'>// 描述数据关系MimeMultipart mm = new MimeMultipart();//获取MimeMultipartmm.addBodyPart(text);//将文本MimeBodyPart对象加入MimeMultipart中mm.addBodyPart(image);//将图片MimeBodyPart对象加入MimeMultipart中mm.setSubType("related");//设置MimeMultipart对象的相对熟悉为related,即发送的数据为文本+非附件资源//设置到消息中,保存修改message.setContent(mm);//将MimeMultipart放入消息对象中message.saveChanges();//保存上面的修改

在这里插入图片描述
在这里插入图片描述
2、发送包含附件的复杂邮件

System.out.println("=============================复杂邮件的邮件内容设置==================================");/*
编写邮件内容
1.图片
2.附件
3.文本*///图片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("图片的绝对地址")));
body1.setContentID("yhbxb.png"); //图片设置ID//文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");//附件
MimeBodyPart body3 = new MimeBodyPart();
body3.setDataHandler(new DataHandler(new FileDataSource("附件1的绝对地址")));
body3.setFileName("test.c"); //附件设置名字MimeBodyPart body4 = new MimeBodyPart();
body4.setDataHandler(new DataHandler(new FileDataSource("附件2的绝对地址")));
body4.setFileName("test.txt"); //附件设置名字//拼装邮件正文内容
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related"); //1.文本和图片内嵌成功!//new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
MimeBodyPart contentText =  new MimeBodyPart();
contentText.setContent(multipart1);//拼接附件
MimeMultipart allFile =new MimeMultipart();
allFile.addBodyPart(body3); //附件
allFile.addBodyPart(body4); //附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;//设置到消息中,保存修改
message.setContent(allFile);//将MimeMultipart放入消息对象中
message.saveChanges();//保存上面的修改System.out.println("===============================================================");

在这里插入图片描述
在这里插入图片描述
功能测试通过!

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

分析:在我们注册的时候,前端我们填写的就是一个表单,这个表单提交给后端的servlet,这个servlet就向我们填写的那个邮箱中发送一封邮件

所以我们需要创建一个javaweb项目,因为要使用到前端页面+servlet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拷贝两个前端素材

​ 注册页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--注册填写邮箱的前端页面--%>
<html>
<head><title>注册</title>
</head>
<body><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></body>
</html>

提示成功页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>提示信息</title>
</head>
<body>
<h2>thhh提醒您</h2>${message}
</body>
</html>

编写servlet

package com.thhh.servlet;import com.thhh.pojo.User;
import com.thhh.utils.Sendmail;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RegisterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1、接收用户填写的表单数据String username = req.getParameter("username");String password = req.getParameter("password");String email = req.getParameter("email");
//        System.out.println(username+password+email);//2、向用户邮箱发送邮件,注意发送邮件很耗时,所以我们启动一个子线程去做这件事,而用户则是直接跳转注册成功页面,以免降低用户体验User user = new User(username,password,email);Sendmail sendmail = new Sendmail(user);//获取子线程对象new Thread(sendmail).start();//启动子线程//3、视图跳转req.setAttribute("message","注册成功!我们已经向您的邮箱发送了邮件,请您及时进行查收。由于网络原因,您收到邮件的时间存在延迟,敬请谅解~");req.getRequestDispatcher("info.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

多线程工具类

package com.thhh.utils;//多线程实现邮件发送
//使用多线程的原因就是提高用户的体验,一旦一个页面3s及以上的时间白屏就可能被用户关掉
//所以我们在用户提交表单之后,将费时的邮件发送工作使用一个子线程来完成,而主线程还是去完成它自己的事情
//这么做就可以提高用户体验,不然用户等待邮件发送的时间import com.sun.mail.util.MailSSLSocketFactory;
import com.thhh.pojo.User;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;//多线程这种处理就可以称为异步处理
public class Sendmail implements Runnable{private String from = "XXXX@qq.com";//我们用来向客户发送邮件的邮箱private String username = "XXXX@qq.com";//用于登陆SMTP服务器的用户名private String password = "授权码";//授权码private User user;public Sendmail(User user) {this.user = user;//用于获取用户邮箱地址}@Overridepublic void run() {try {Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置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 session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码return new PasswordAuthentication(username, password);}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//2、通过session得到transport对象Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象//3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆ts.connect("smtp.qq.com", username, password);//4、创建邮件对象MimeMessage——点击网页上的写信//创建一个邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress(username));//设置发件人//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));//设置收件人//邮件的标题——在网页上填写邮件标题message.setSubject("欢迎注册thhh!");//设置邮件主题//邮件的文本内容——在网页上填写邮件内容message.setContent("<p><h2>恭喜注册成功!</h2></p>您的用户名为:<h4>"+user.getUsername()+"</h4>请妥善保管您的密码,如有问题请及时联系网站客服,再次欢迎您的加入!!", "text/html;charset=UTF-8");//设置邮件的具体内容//5、发送邮件——在网页上点击发送按钮ts.sendMessage(message, message.getAllRecipients());//6、关闭连接对象,即关闭服务器上的连接资源ts.close();} catch (MessagingException e) {e.printStackTrace();} catch (GeneralSecurityException e) {e.printStackTrace();}}
}

测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
测试成功了!

感悟

整个邮件发送的实现我们都是依赖的两个jar包:mail.jar、activation.jar

  • 这两个jar包导入之后我们就在按照固定的调用这两个jar包中的功能进行代码编写,其实代码+步骤都是写死的,我们只需要复制粘贴,然后修改一下参数就可以在我们自己的项目上跑起来了,所以对于这个例子,我们只需要掌握使用Java发送邮件的原理/需要哪些步骤,而不用去记住代码怎么实现的,如果真的到了要用的时候,我们可以直接在网上搜索一下,这种例子一大堆,所以重点还是要学习实现原理,在理解原理的基础上那这个项目锻炼一下自己的编码+排错能力+提升对IDE的熟悉度
  • 通过这个例子我们也更进一步的理解了为什么说在Java中万物皆对象:我们对邮件的操作中,获取客户端与SMTP服务器的连接需要一个session对象、进行客户端和SMTP服务器之间的数据传输需要使用Transport 对象、发送纯文本邮件需要使用MimeMessage 对象、发送非纯文本邮件需要使用MimeMultipart对象…

收获
​ 1.在这个项目中我们还可以加深对一个javaweb项目文件结构的熟悉

​ 2.加深我们在IDEA中创建WEB项目的3种方法:直接创建javaweb项目、创建一个干净的maven项目再添加web文件夹和直接使用maven创建一个javaweb项目

​ 3.实践了"小黄鸭调试法"

​ 4.见识了使用注解+框架开发的简便

​ 5.实现了期待的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57996.html

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

相关文章

阿里巴巴国际站获得商品详情 API 调用分享(销量、详情图片、宝贝链接)

item_get-获得商品详情 alibaba.item_get 调用代码分享 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.Charset; imp…

利用用户搜索词生成商品标题信息——阿里巴巴IDST

今天介绍的论文是阿里IDST在2018年AAAI上发表的paper《A Multi-task Learning Approach for Improving Product Title Compression with User Search Log Data》。 其应用背景是&#xff0c;现在越来越多的用户开始习惯于使用手机、PAD等移动端进行网购行为&#xff0c;而这些移…

【阿里巴巴国际站API接口】商品详情接口,代码封装系列

为了进行电商平台 alibaba 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个alibaba应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载 alibaba API的SDK并掌握基本的API基础知识和调用 4&#xf…

通过 Python 封装关键词搜索阿里巴巴商品api接口

以下是使用 Python 封装关键词搜索阿里巴巴商品列表数据的步骤&#xff1a; 使用 requests 库向阿里巴巴搜索接口发送 HTTP 请求&#xff0c;可以使用 GET 或 POST 方法&#xff0c;请求参数中应包含搜索关键词、每页展示数量、当前页码等信息。 解析返回的 response 中的 HTM…

中英文在线语音转文字的方法

今天小编就来给大家分享一个中英文在线翻译的方法&#xff0c;小编这个来给大家分享一个这样很好用的方法&#xff01; 操作方法&#xff1a; 使用工具&#xff1a;录音转文字助手 第一步&#xff1a;如果将手机录音转成文字的话需要使用一个工具&#xff1a;录音转文字助手&a…

实现语音转文字功能

解决方案 最近要实现语音转文字接口&#xff0c;具体需求是录制语音后再聊天室实时显示文字&#xff1a; 目前腾讯有三种解决方案&#xff1a; 实时语音识别使用场景是一边录语音&#xff0c;一遍转文字&#xff0c;实时性较高&#xff1b;一句话识别是对60s内的语音文…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

基于Matlab求解高铁运营公司列车开行优化问题

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

问题 A: 火车站(stack)

问题 A: 火车站(stack) 时间限制: 1 Sec 内存限制: 128 MB 提交: 251 解决: 137 [提交][状态][讨论版] 题目描述 火车站只有一条铁路&#xff0c;所有的火车都停在那里。所以所有的火车都是从一边进站&#xff0c;从另一边出站。如果A列先进入铁路&#xff0c;然后B列在A列离开…

PTA L2-014列车调度

PTAL2-014列车调度&#xff08;二分法/Set集合&#xff09; 两种方法解决该问题 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列…

UVA514 铁轨问题

问题描述 &#xff1a; PopPush城市有一座著名的火车站。这个国家到处都是丘陵。而这个火车站是建于上一个世纪。不幸的是&#xff0c;那时的资金有限。所以只能建立起一条路面铁轨。而且&#xff0c;这导致这个火车站在同一个时刻只能一个轨道投入使用&#xff0c;因为它缺少…

城市轨道交通的GoA

导言 目前轨道系统中最常见的便是基于通信的列车控制系统&#xff08;Communication Based Train Control, CBTC)&#xff0c;其中各集成商各条线路采用了不同级别的自动化技术&#xff0c;本文将针对CBTC的运用&#xff0c;从其系统组成、系统升级改造、系统主要功能、自动化…

铁路轨道不平顺数据分析与预测

铁路轨道不平顺数据分析与预测 1.引言 铁路轨道作为铁行车的基础设施&#xff0c;是铁路线路的重要组成部分。随着经济和交通运输业的发展&#xff0c;我国的铁路运输正朝着高速和重载方向迅速发展&#xff0c;与此同时&#xff0c;轨道结构承受来自列车荷载、运行速度的冲击…

铁轨问题 栈的运用

是这几天学习紫书遇到的一个问题 之前在学校的时候尝试着做过 题目如下 自己大概知道是这么个意思 C就相当于一个栈 进去的车厢只能倒着出来 后进去的就先出来 代码里不精 还是照着书上的打了一遍 花了一个下午理解了 #include<cstdio> #include<stack> usin…

栈的应用:火车调度问题

栈的应用&#xff1a;火车调度 问题概述 输入第一行是一个整数N&#xff0c;表示车厢的数量&#xff1b;第二行是一个由Y于R组成的字符串&#xff0c;表示车厢的排列&#xff0c;其中Y表示硬座&#xff0c;R表示软座。我们的任务&#xff0c;是借助一个栈&#xff0c;使得车厢…

火车进站问题-HDUOJ

火车进站问题 问题描述 假设杭州东火车站只有一条铁路&#xff0c;并且所有火车都从一侧进来&#xff0c;从另一侧出去。那么&#xff0c;如果火车A先进站&#xff0c;然后火车B在火车A离开之前就进站&#xff0c;那么火车A直到火车B离开后才能离开&#xff0c;可参见下图。 现…

深圳大学第三期“飞鹰计划”正式开班|学以致用,扬帆起航!

金秋九月&#xff0c;丹桂飘香&#xff0c;在这个充满着收获的季节里&#xff0c;迎来了期待已久的深圳大学机电与控制工程学院飞鹰计划2022级第三期开班典礼。受疫情影响&#xff0c;虽然典礼只能在线上举行&#xff0c;但是丝毫不影响电巢专家及学生们的热情。9月17日下午&am…

写了10 年的代码,收藏了这 20 个代码生成框架!

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 源码精品专栏 原创 | Java 2020 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…

matlab偏最小二乘截距,matlab代写偏最小二乘回归(PLSR)和主成分回归(PCR)

原标题&#xff1a;matlab代写偏最小二乘回归(PLSR)和主成分回归(PCR) 原文&#xff1a;http://tecdat.cn/?p2655 此示例显示如何在matlab中应用偏最小二乘回归(PLSR)和主成分回归(PCR)&#xff0c;并讨论这两种方法的有效性。当存在大量预测变量时&#xff0c;PLSR和PCR都是对…

水上飞鹰(Z缓存alpha混合)

程序的描述:水上飞鹰(Z缓存alpha混合) 作者:lun 创建日期:2005-10-5 版本:0.1 编译环境:WIN2000 VC6 SP6 DXSDK 驾驶你水上飞艇! 穿越重重危险! 程序下载地址 http://www.wungaonline.com/read.php?tid-100.html