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

news/2024/5/10 3:46:28/文章来源:https://blog.csdn.net/qq_43605227/article/details/116177175

摘抄自狂神笔记

电子邮件

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

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

  • 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.luyixian.cn/news_show_846583.aspx

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

相关文章

《时代》评出50个最酷网站 25个网站非上不可

从2003年开始&#xff0c;《时代》周刊每年都会评选出一系列最受欢迎的网站&#xff0c;在这些网站身上我们不难看出互联网的变革与发展&#xff0c;同时清楚的认识到什么样的网站能够引领潮流。北京时间7月10日&#xff0c;美国《时代》周刊近日公布了2007年50个最受欢迎的网站…

转载:LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框 架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者Python编程语言&#xff0c;所有组成产品均是开源软 件…

高并发网站的演变和优化

一&#xff0c;什么是高并发 高并发是互联网分布式系统架构设计中必须考虑的因素之一&#xff0c;通常指&#xff1a;通过设计保证能够同时并行处理很多请求。 高并发指标&#xff1a; 响应时间&#xff1a;系统对请求做出响应时间。例如系统处理一个HTTP请求需要200ms,这个200…

iis网站报错:您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序...

本人使用WIN2003 INTERNET信息服务&#xff08;IIS&#xff09;管理器建立一个网站虚拟目录&#xff0c;结果浏览网页时出现错误&#xff0c;错误提示信息大体如此&#xff1a; 该页无法显示 您试图从目录中执行 CGI、ISAPI 或其他可执行程序&#xff0c;但该目录不允许执行程…

值得收藏!最佳26个国外 CSS 酷站推荐网站

这个列表收集的最佳26个国外 CSS 酷站推荐网站对于网页设计师和 Web 开发人员都非常有用。设计师可以从下面列出的这些网站获取优秀的设计理念和流行的设计趋势&#xff0c;获取大量的创作灵感&#xff0c;进而设计出更有创意的作品。如果你有收藏这个列表中遗漏的网站&#xf…

网站统计中的数据收集原理及实现(转)

本文转自codinglabs&#xff0c;原文地址&#xff1a;http://www.codinglabs.org/html/how-web-analytics-data-collection-system-work.html 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具&#xff0c;比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些…

数据获取网站分享

内容来自悟空智能科技公众号&#xff0c;侵权删。 1公开的数据库 &#xff0d; 国家数据 &#xff0d; http://data.stats.gov.cn/index.htm 数据来源于中国国家统计局&#xff0c;包含了我国经济民生等多个方面的数据&#xff0c;并且在月度、季度、年度都有覆盖&#xff0…

浅谈前端中的onmouseover 事件

修改别人的模板遇到一个问题&#xff0c;分类图的切换默认是五个&#xff0c;我想增加四个&#xff0c;一直没有增加成功。它使用的onmouseover 事件。 去查了一下&#xff1a; 定义和用法 onmouseover 事件会在鼠标指针移动到指定的对象上时发生。 语法 οnmοuseοver"…

Docker系列器十:docker-compose和网站的负载均衡

Docker应用中&#xff0c;为了达到高可用&#xff0c;可以做很多的web服务&#xff0c;保持服务的稳定性&#xff0c;在web的出口处是haproxy等负载应用。 命令&#xff1a; 在和yml文件的同文件下&#xff0c;执行任何的docker-pose的命令&#xff0c;否则是提示找不到文件的…

大型网站系统架构的演化

http://www.cnblogs.com/leefreeman/p/3993449.html 前言 一个成熟的大型网站&#xff08;如淘宝、京东等&#xff09;的系统架构并不是开始设计就具备完整的高性能、高可用、安全等特性&#xff0c;它总是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0…

软件体系结构---优酷网站架构分析

1.web环境下架构特性 可扩展、可靠、简单核心、模块化 2.优酷网站分析 1)前端框架 模块分离、前端可扩展、分层UI分离 2&#xff09;存储结构 在体系结构上&#xff0c;优酷网采用分布式的结构&#xff0c;服务器和存储设备分布在全国各地&#xff0c;用户就近访问&#xff0c;…

大型网站架构系列:分布式消息队列(一)

以下是消息队列以下的大纲&#xff0c;本文主要介绍消息队列概述&#xff0c;消息队列应用场景和消息中间件示例&#xff08;电商&#xff0c;日志系统&#xff09;。本次分享大纲消息队列概述消息队列应用场景消息中间件示例JMS消息服务&#xff08;见第二篇&#xff1a;大型网…

JS基础17-网站效果

一、鼠标移入触发显示框和更改属性 要实现的效果 window.οnlοadfunction(){ //获取到div框里的li数组var oToplistdocument.getElementById(top-list);var oToplistlioToplist.getElementsByTagName(li);var oPulldocument.getElementById(pull-down);//鼠标移入时&#xff0…

Python_记一次网站数据定向爬取实现

记一次网站数据定向爬取实现 by:授客 QQ&#xff1a;1033553122 测试环境&#xff1a; Python版本&#xff1a;Python 3.4 Win7 请勿用于商业及非法用途&#xff0c;仅供学习研究用&#xff0c;否则后果自负 数据爬取场景 如下&#xff0c;打开网站查询页面&#xff0c;输入关…

大型网站架构演变和知识体系

之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感觉有不少同学都很难明白为什么…

v2013调试无法访问此网站 localhost 拒绝了我们的连接请求

问题描述&#xff1a; 别人给的服务器代码&#xff0c;在本地部署以后调试的&#xff0c;localhost&#xff1a;8080 可以访问&#xff0c;localhost:2524访问不了需要改什么配置吗 解决思路&#xff1a; 这种只能在服务器上访问&#xff0c;可能端口号2524…

如何优化您的网站以提高速度

大家好&#xff01; 今天&#xff0c;我们有一个来宾帖子&#xff0c;介绍有关如何加快网站速度的一些提示&#xff01; 他目前正在一家电子商务网站上工作&#xff0c;他的任务之一是使网站快速加载。 因此&#xff0c;请在下面阅读&#xff01; 〜迈克 网站速度已成为诸如Go…

如何优化程序提高运行速度_如何优化您的网站以提高速度

如何优化程序提高运行速度大家好&#xff01; 今天&#xff0c;我们有一个来宾帖子&#xff0c;介绍有关如何加快网站速度的一些提示&#xff01; 他目前正在一家电子商务网站上工作&#xff0c;他的任务之一是使网站快速加载。 因此&#xff0c;喜欢在下面阅读&#xff01; 〜…

网站托管平台_托管Kubernetes平台综述

网站托管平台在容器协调器的竞争中&#xff0c;Kubernetes不断前进。 但是&#xff0c;就像我在Docker主机上撰写我的文章时一样&#xff0c;人们经常被困在将基础架构投入生产的步骤上。 与我最初写这篇文章时不同&#xff0c;该行业取得了长足的发展&#xff0c;正如您将看到…

PHP的网站主要攻击方式有哪些?

1、命令注入(Command Injection) 2、eval注入(Eval Injection) 3、客户端脚本攻击(Script Insertion) 4、跨网站脚本攻击(Cross Site Scripting, XSS) 5、SQL注入攻击(SQL injection) 6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF) 7、Session 会话劫持(Session …