IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 文件上传和邮件发送 -> 正文阅读

[Java知识库]文件上传和邮件发送

1.文件传输

1.1准备工作

1.项目创建

建立一个空项目:首先要选中JDK,

在这里插入图片描述

然后添加moudle,再配置tomcat,直接运行tomcat确保目前的空项目是没问题的。

2.对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器的。

3.两个jar包

 <dependencies>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

?
跨平台:在这里插入图片描述

?

1.2使用类介绍

文件上传注意事项:

  1. 为了保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放在WEB-INF目录下
  2. 为了防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。1.txt -时间戳 -uuid生成一串随机的不会重复的数字 -md5 -位运算算法
  3. 要限制上传文件的最大值
  4. 可以限制上传文件的类型,有收到上传文件名时,判断后缀名是否合法

?
用到的类详解:

ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个FileItem对象,在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。

所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方式或者setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。

?
前端页面:

在HTML页面input必须有file类型,表单如果包含一个文件上传输入项的话,这个表单的enctype属性就必须为enctype=“multipart/form-data” 。

浏览器表单的类型如果为multipart/form-data ,在服务器端想获取数据就要通过流。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<html>
<body>
<%--
get:上传文件大小有限制
post:上传文件大小没有限制
--%>
<form enctype="multipart/form-data" method="post">
    <p>上传用户:<input type="text" name="username"></p>
    <p>上传文件1:<input type="file" name="filename1"></p>
    <p>上传文件2:<input type="file" name="filename2"></p>
    <p><input type="submit">提交 | <input type="reset">重置</p>
</form>
</body>
</html>

?

【常用方法介绍】

//isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单,还是一个文件表单,如果是普通表单字段则返回true,否则返回false
boolean isFormField();
//getFieldName方法用于返回表单标签name属性的值
String getFieldName();
//getString方法用于将FileItem 对象中保存的数据流内容以一个字符串返回
String getString();
//getName方法用于获得文件上传字段中的文件名
String getName();
//以流的形式返回上传文件的数据内容
InputStream getInputStream();
//delete方法用来清空FileItem类对象中存放的主体内容,如果主题内容被保存在临时文件中,delete方法将删除临时文件
viod delete();

?

1.3ServletFileUpload类

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个Fileltem对象中。使用其parseRequest(HttpServletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装成一个Fileltem对象,然后以List列表的形式返回。使用该方法处理上传文件简单易用。

  • 处理上传的文件,一般都需要通过流来获取,我们可以使用 request.getInputstream(),原生态的文件上传流获取,但十分麻烦。我们都建议使用Apache的文件上传组件来实现,common-fileupload,它需要commons-io组件。
  • UID(唯一识别的通用码),保证文件名唯一
    UUID.randomUUID(),随机生一个唯一识别的通用码
    网络传输中的东西,都需要序列化
    pojo实体类,如果想要在多个电脑运行,传输—>需要把对象都序列化了
    JNI=java Native Interface
    implements Serializable :标记接口,JVM—>java栈,本地方法栈 native–>c++
package moli;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
public class FileServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 判断上传的文件普通表单还是带文件的表单
            if (!ServletFileUpload.isMultipartContent(req)){
                return;//终止方法运行,说明这是一个普通的表单,直接返回
            }

            //创建上传文件的保存路径,建议在WEB-INF路径下,安全,用户无法直接访间上传的文件;
            String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
            File uploadFile = new File(uploadPath);
            if (!uploadFile.exists()){
                uploadFile.mkdir();//创建这个目录
            }
            //缓存,临时文件
            //临时路径,假如文件超过了预期大小,我们就把它放到一个临时文件中,过几天自动删除,或者提示用户转存为永久
            String tmpPath = this.getServletContext().getRealPath("/WEB-INF/upload");
            File tmpFile = new File(tmpPath);
            if (!tmpFile.exists()){
                tmpFile.mkdir();//创建这个目录
            }
            try {
            // 1、创建DiskFileItemFactory对象,处理文件路径或者大小限制
            DiskFileItemFactory factory = getDiskFileItemFactory(tmpFile);
            // 2、获取ServletFileUpload
            ServletFileUpload upload = getServletFileUpload(factory);
            // 3、处理上传文件
            // 把前端请求解析,封装成FileItem对象,需要从ServletFileUpload对象中获取
            String msg = null;
            msg = uploadParseRequest(upload, req, uploadPath);
            // Servlet请求转发消息
            System.out.println(msg);
            // Servlet请求转发消息
            req.setAttribute("msg",msg);
            req.getRequestDispatcher("info.jsp").forward(req, resp);
            } catch (FileUploadException e) {
            e.printStackTrace();
            }
    }

    public static DiskFileItemFactory getDiskFileItemFactory(File file) {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // 通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将他放到临时文件中;
        factory.setSizeThreshold(1024 * 1024);// 缓冲区大小为1M
        factory.setRepository(file);// 临时目录的保存目录,需要一个file
        return factory;
    }

    public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 监听上传进度
        upload.setProgressListener(new ProgressListener() {
            // pBYtesRead:已读取到的文件大小enctype="multipart/form-data"
            // pContextLength:文件大小
            public void update(long pBytesRead, long pContentLength, int pItems) {
                System.out.println("总大小:" + pContentLength + "已上传:" + pBytesRead+",进度:"+((double)pBytesRead/pContentLength)*100+"%");
            }
        });
        // 处理乱码问题
        upload.setHeaderEncoding("UTF-8");
        // 设置单个文件的最大值
        upload.setFileSizeMax(1024 * 1024 * 10);
        // 设置总共能够上传文件的大小
        // 1024 = 1kb * 1024 = 1M * 10 = 10м
        upload.setSizeMax(1024 * 1024 * 10);
        return upload;
    }

    public static String uploadParseRequest(ServletFileUpload upload, HttpServletRequest request, String uploadPath) throws FileUploadException, IOException {
        String msg = "";
        // 把前端请求解析,封装成FileItem对象
        List<FileItem> fileItems = upload.parseRequest(request);
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()) {// 判断上传的文件是普通的表单还是带文件的表单,这里是普通表单
                // getFieldName指的是前端表单控件的name;
                String name = fileItem.getFieldName();
                String value = fileItem.getString("UTF-8"); // 处理乱码
                System.out.println(name + ": " + value);
            } else {// 判断它是上传的文件
                // ============处理文件=======================================================================
                String uploadFileName = fileItem.getName();// 拿到文件名
                System.out.println("上传的文件名: " + uploadFileName);
                if (uploadFileName.trim().equals("") || uploadFileName == null) {
                    continue;
                }
                // 获得上传的文件名/images/girl/paojie.png
                String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                // 获得文件的后缀名
                String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
                //如果文件后缀名fileExtName不是我们所需要的 就直按return不处理,告诉用户文件类型不对。
                System.out.println("文件信息[件名: " + fileName + " ---文件类型" + fileExtName + "]");
                //UUID唯一通识码
                String uuidPath = UUID.randomUUID().toString();
                // ================处理文件完毕================================================================
                // 存到哪? uploadPath,文件真实存在的路径realPath
                String realPath = uploadPath + "/" + uuidPath;
                // 给每个文件创建一个对应的文件夹
                File realPathFile = new File(realPath);
                if (!realPathFile.exists()) {
                    realPathFile.mkdir();
                }
                // ==============存放地址完毕===================================================================
                // 获得文件上传的流
                InputStream inputStream = fileItem.getInputStream();
                // 创建一个文件输出流,realPath =真实的文件夹
                FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);
                // 创建一个缓冲区
                byte[] buffer = new byte[1024 * 1024];
                // 判断是否读取完毕
                int len = 0;
                // 如果大于0说明还存在数据;
                while ((len = inputStream.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                // 关闭流
                fos.close();
                inputStream.close();
                msg = "文件上传成功!";
                fileItem.delete(); //上传成功,清除临时文件
                //=============文件传输完成===================================================================
            }
        }
        return msg;
    }
}

?
?

2.邮件发送

2.1原理图

在这里插入图片描述

  • 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
  • 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。

?

MIME (多用途互联网邮件扩展类型):它是一个互联网标准,扩展了电子邮件标准,使其能够支持:

  • ASCII字符文本
  • 非文本格式附件(二进制、声音、图像等)
  • 由多部分(multiple parts)组成的消息体
  • 包含非ASCII字符的头信息(Header information)

?

2.2准备工作

2.2.1jar包

在这里插入图片描述

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

?

2.2.2对象

  • 创建包含邮件服务器网络连接信息的Session对象。
  • 创建代表邮件内容的Message对象
  • 创建Transport对象,连接服务器,发送Message,关闭连接

?

2.2.3qq邮箱获取对应权限

要发送文件,需要获得协议和支持,开启POP3和SMTP服务:

在这里插入图片描述

?

2.3纯文本邮件

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class mail1 {
    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对象
        Session session=Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("3521945255@qq.com","klzptmndwkfdchbb");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);//可写可不写

        //2.通过session得到transport对象
        Transport ts=session.getTransport();

        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","3521945255@qq.com","klzptmndwkfdchbb");

        //4.创建邮件:写文件
        //注意需要传递session
        MimeMessage message=new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("3521945255@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("3521945255@qq.com"));
        //邮件标题
        message.setSubject("test");
        //邮件的文本内容
        message.setContent("<h1 style='color: red'>111111</h1>","text/html;charset=UTF-8");

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());

        //关闭连接
        ts.close();
    }
    private static class MailSSLSocketFactory {
        public void setTrustAllHosts(boolean b) {
        }
    }
}

运行结果:成功收到邮件在这里插入图片描述

?

2.4复杂邮件发送

两个类:每一个文本、图片、附件可以分为一个MimeBodyPart,由MimeMultipart完成组装。

multipart属性可以都设置为mixed。

在这里插入图片描述
?

2.4.1包含图片的发送

跟纯文本邮件做比较,只改动了第四步

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 mail2 {
    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对象
        Session session=Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("3521945255@qq.com","授权码");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //2.通过session得到transport对象
        Transport ts=session.getTransport();

        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","3521945255@qq.com","klzptmndwkfdchbb");

        //4.创建邮件:写文件
        //注意需要传递session
        MimeMessage message=new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("3521945255@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("3521945255@qq.com"));
        //邮件标题
        message.setSubject("java发出");
        //邮件的文本内容
        //=================================准备图片数据===========================
        MimeBodyPart image=new MimeBodyPart();
        //图片需要经过数据化的处理
        DataHandler dh=new DataHandler(new FileDataSource("D:\\c\\图片\\wallhaven-28o276.jpg"));
        //在part中放入这个处理过图片的数据
        image.setDataHandler(dh);
        //给这个part设置一个ID名字
        image.setContentID("girl.jpg");
        //准备正文的数据
        MimeBodyPart text=new MimeBodyPart();
        text.setContent("这是一张正文<img src='cid:girl.jpg'>","text/html;charset=UTF-8");
        //描述数据关系
        MimeMultipart mm=new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");
        //设置到消息中,保存修改
        message.setContent(mm);
        message.saveChanges();

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());

        //关闭连接
        ts.close();
    }
}

邮件成功发送:在这里插入图片描述

?

2.4.2包含附件的发送

也是只有邮件内容第四步发生了改动

import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class mail3 {
    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对象
        Session session=Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("3521945255@qq.com","klzptmndwkfdchbb");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //2.通过session得到transport对象
        Transport ts=session.getTransport();

        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","3521945255@qq.com","klzptmndwkfdchbb");

        //4.创建邮件:写文件
        //注意需要传递session
        MimeMessage message=new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("3521945255@qq.com"));
        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("3521945255@qq.com"));
        //邮件标题
        message.setSubject("test3");
        //邮件的文本内容
        //=================================准备图片数据===========================
        MimeBodyPart image=new MimeBodyPart();
        //图片需要经过数据化的处理
        DataHandler dh=new DataHandler(new FileDataSource("D:\\c\\图片\\wallhaven-28o276.jpg"));
        //在part中放入这个处理过图片的数据
        image.setDataHandler(dh);
        //给这个part设置一个ID名字
        image.setContentID("girl.jpg");
        //=================================准备正文数据===========================
        MimeBodyPart text=new MimeBodyPart();
        text.setContent("这是一张正文<img src='cid:girl.jpg'>","text/html;charset=UTF-8");
        //=================================准备附件数据===========================
        MimeBodyPart body1= new MimeBodyPart();
        body1.setDataHandler(new DataHandler(new FileDataSource("D:\\c\\功能扩展\\邮件发送\\11.txt")));
        body1.setFileName("11.txt");
        //描述数据关系
        MimeMultipart mm=new MimeMultipart();
        mm.addBodyPart(body1);
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("mixed");
        //设置到消息中,保存修改
        message.setContent(mm);
        message.saveChanges();

        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());

        //关闭连接
        ts.close();
    }
}

邮件发送成功:在这里插入图片描述

?
?
?

3.javaweb发送邮件

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

?
首先创建一个maven项目,配置tomcat,跑一下,确定没问题;然后创建包结构。

3.1前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>注册</title>
  </head>
  <body>
    <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="get">
       用户名:<input type="text" name="username">
       密码:<input type="text" name="pa's's">
       邮箱:<input type="text" name="email">
       <input type="submit" value="注册">
    </form>
  </body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>1</title>
</head>
<body>
<h1>xxx网站提示</h1>
${message}
</body>
</html>

?

3.2实体类(Dao层)

package moli.pojo;
import java.io.Serializable;
public class User implements Serializable {
    private String username;
    private String password;
    private String email;

    public User() {
    }
    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }
    public 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;
    }
    @Override
    public String toString() {
        return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + '}';
    }
    
/*lombok包,通过注解可以直接生成get、set、有参无参等。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
//有参构造;
@AllArgsConstructor
//无参构造;
@NoArgsConstructor
public class User {
    private String name;
    private String password;
    private String email;
}*/
}

?

3.3工具类(业务层)

package moli.utils;
import com.sun.mail.util.MailSSLSocketFactory;
import moli.pojo.User;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
//用户体验感很重要,多线程提高用户体验(异步处理),防止因发送文件时间过长,导致前端响应过久。
public class Sendmail extends Thread{
    //用于给用户发送邮件的邮箱
    private String from = "3521945255@qq.com";
    //邮箱的用户名
    private String username = "3521945255@qq.com";
    //邮箱的密码
    private String password = "tvatktjyckcvciga";
    //发送邮件的服务器地址
    private String host = "smtp.qq.com";

    private User user;
    public Sendmail(User user){
        this.user = user;
    }

    //重写run方法的实现,在run方法中发送邮件给指定的用户
    @Override
    public void run() {
        try{
            Properties prop = new Properties();
            prop.setProperty("mail.host", host);
            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);

            //1、创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication("3521945255@qq.com", "tvatktjyckcvciga");
                }
            });

            //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);

            //2、通过session得到transport对象
            Transport ts = session.getTransport();

            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host, username, password);

            //4、创建邮件
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from)); //发件人
            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");
            message.saveChanges();

            //5.发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

?

3.4servlet(控制层)

package moli.servlet;
import moli.pojo.User;
import moli.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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            //接收用户请求,封装成对象
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String email = req.getParameter("email");
            User user = new User(username,password,email);

            //用户注册成功之后,给用户发送一封邮件
            //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况;
            Sendmail send = new Sendmail(user);
            //启动线程,线程启动之后就会执行run方法来发送邮件
            send.start();

            //注册用户
            req.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
            req.getRequestDispatcher("info.jsp").forward(req, resp);
        } catch (Exception e) {
            e.printStackTrace();
            req.setAttribute("message", "注册失败!!");
            req.getRequestDispatcher("info.jsp").forward(req, resp);
        }
    }
}

依赖:

 <!--导入依赖-->
    <dependencies>
        <!--使用插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>

web.xml

<servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>moli.servlet.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/RegisterServlet.do</url-pattern>
    </servlet-mapping>

?
最终收到邮件:在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-11 23:51:23  更:2022-01-11 23:53:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:19:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码