JavaWeb(三):java和javaWeb实现邮件发送

JavaWeb-实现邮件发送

学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV12J41137hu?p=1

学习资料笔记:csdn dream_Felix-- https://blog.csdn.net/yalu_123456/article/details/97272941?spm=1001.2014.3001.5501

1、邮件发送原理

在进行邮件发送的时候,我们需要专门邮件服务器。

例如: 张三给李四发送邮件, 张三的是 网易邮箱, 而李四的是QQ邮箱。

在张三给李四发送邮件的过程中, 先把张三发出的邮件存放到 网易的服务器里面; 然后通过后面的名称去区分,去找到QQ邮箱的服务器; QQ服务器再把这个邮件给了李四。

而在每个邮件的服务器中,大家都会遵守着传输协议 SMTP/POP3协议, 用于邮件的接收和传递。

在这里插入图片描述

  • 邮件服务器

    电子邮件的发送, 必须要有专门的邮件服务器。它们的功能是负责接收用户投递发送过来的邮件, 然后把邮件去投递交到接收邮件的电子邮箱中。

    SMTP服务器地址:每种邮箱的服务器地址是不一样的, 地址的形式一般都是: smtp.xxx.com比如163邮箱是smtp.163.comqq邮箱是smtp.qq.com

    当然,邮件收发的前提是要有E-mail,这些需要在邮件服务器进行申请。即 你得开通了邮箱啊。

  • 传输协议

    邮件的传输协议有两种,即SMTP协议和POP3协议

    POP3/SMTP:

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

    发送邮件:采用的是SMTP。

    接收邮件:采用POP3。

  • MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名

    文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

  • 邮件收发原理的详解
    在这里插入图片描述

    大狂神(网易邮箱)发送邮件给小狂神(QQ邮箱):

    • 大狂神准备发送邮件。 那么就要遵循 SMTP协议 去连接到 SMTP服务器,然后把邮件的数据信息发送给网易的邮件服务器。 通过后面的名称找到网易的
    • 在网易服务器中,经过名称区分发现是QQ邮箱, 然后再通过 SMTP协议 再把邮件发给qq的 SMTP服务器
    • QQ将接收到的邮件存储在 xxxxx@qq.com这个邮件账号的空间中
    • 小狂神通过POP3协议连接到POP3服务器收取邮件
    • 从 xxxxx@qq.com这个邮件账号的空间中取出邮件
    • POP3服务器将取出来的邮件送到小狂神手中

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

2、Java发送邮件

概述

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

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

需要导入两个jar包:

  1. JavaMail API (compat)
  2. JavaBeans™ Activation Framework

在这里插入图片描述

JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。

我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

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

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

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

在这里插入图片描述

2.1、发送普通邮件

例子:

简单的邮件发送:纯文本文件。

我们还应该对自己的邮箱设置中的账户 去进行 POP3/SMTP服务器开启

在这里插入图片描述

qq邮箱验证码

Zlfqkymrzdoobabi

网易云的授权码:

ALDEGHIPYNNRZTJL

代码:

package com.AL;

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 {
        // 定义session对象的环境信息
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com"); //设置qq邮件服务器,
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议。接收协议为pop3
        prop.setProperty("mail.stmp.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() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名,授权码
                //return new PasswordAuthentication("1356207897@qq.com", "zlfqkymrzdoobabi");
                return new PasswordAuthentication("lvxinylz@163.com", "ALDEGHIPYNNRZTJL");
            }
        });
        //2、通过session 去得到 transport对象
        Transport ts = session.getTransport();

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

        //3、使用邮件的用户名和授权码 连接邮件服务器
        //ts.connect("smtp.qq.com","1356207897@qq.com","zlfqkymrzdoobabi");
        ts.connect("smtp.163.com","lvxinylz@163.com","ALDEGHIPYNNRZTJL");

        //4、创建邮件,一个Message对象
        // 写邮件。 注意需要传递Session
        MimeMessage message = new MimeMessage(session);
        //指定邮件的发件人
        //message.setFrom(new InternetAddress("1356207897@qq.com"));
        message.setFrom(new InternetAddress("lvxinylz@163.com"));
        // 邮件的收件人。 此时发件人和收件人一样,即自己给自己发
        //message.setRecipient(Message.RecipientType.TO, new InternetAddress("1356207897@qq.com"));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("lvxinylz@163.com"));

        //邮件的标题
        message.setSubject("欢迎来到德莱联盟");
        //邮件的文本内容
        message.setContent("<h1 style='color: blue'> 你好啊,小伙子!<h1>", "text/html; charset=UTF-8");

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

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

结果:
在这里插入图片描述

2.2、发送带图片和附件的邮件

在这种带有附件类型, 邮件扩展类型的时候,需要使用 MIME 协议。

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名

文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

MimeBodyPart类

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

MimeMultipart类

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

在这里插入图片描述

里面的附件、文本内容、图片等就是一个一个MIME消息,属于MimeBodyPart类

外面的最大的这个框,就是一个MimeMultipart类,用来将这些MIME消息组合起来,拼接在一起。

对于MIME消息,如果为纯文本,则将multipart类设置为 alternative;内嵌资源设为related;附件则设为mixed。 而我们把所有的都设置为mixed 也是没有问题的。

2.2.1、创建包含内嵌图片的邮件

前面的例子中是单独的使用HTML或者是纯文本内容,但是有时候我们需要在纯文本中使用内嵌的方式显示一些图片,因此就要将纯文本和内嵌图片单独存放在MimeBodyPart中然后再将其存放在一个Mimemultipart对象中即可。

实际上,只有设置邮件里面的信息改变了,其它的不变。如下:

将纯文本邮件里面的文本内容进行修改:

MimeMultipart mm = new MimeMultipart(); //我们把邮件的数据内容放置在 Mimemultipart对象中
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related"); //对于图片和文本的关系来讲是  related

代码实现例子:

package com.AL;

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 {
        // 定义session对象的环境信息
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com"); //设置qq邮件服务器,
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议。接收协议为pop3
        prop.setProperty("mail.stmp.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() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名,授权码
                return new PasswordAuthentication("1356207897@qq.com", "zlfqkymrzdoobabi");
            }
        });
        //2、通过session 去得到 transport对象
        Transport ts = session.getTransport();

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

        //3、使用邮件的用户名和授权码 连接邮件服务器
        ts.connect("smtp.qq.com","1356207897@qq.com","zlfqkymrzdoobabi");

        //4、创建邮件,一个Message对象
        // 写邮件。 注意需要传递Session
        MimeMessage message = new MimeMessage(session);
        //指定邮件的发件人
        message.setFrom(new InternetAddress("1356207897@qq.com"));
        // 邮件的收件人。 此时发件人和收件人一样,即自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("1356207897@qq.com"));

        //邮件的标题
        message.setSubject("欢迎查看匹诺曹的图片");

        // #################### 带有图片的邮件修改,其实就是改变了邮件的内容,使用 MimeBodyPart类
        /** //邮件的文本内容
         * message.setContent("<h1 style='color: blue'> 你好啊,小伙子!<h1>", "text/html; charset=UTF-8");
         */
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        // 图片需要经过数据处理: DataHandler:数据处理
        DataHandler dh = new DataHandler(new FileDataSource("src/image/girl.jpg"));
        image.setDataHandler(dh);  //在我们的Body中放入这个处理的图片数据
        image.setContentID("girl.jpg"); //给图片设置一个 ID,后面传送的时候使用

        //准备正文数据
        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对象中
        message.saveChanges();

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

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

结果:成功收到邮件:

在这里插入图片描述

2.2.2、发送带图片和附件的复杂邮件

带图片和附件的复杂邮件发送

这里做了多个拼接工作。

  • 图片设置ID:setContentID;

  • 附件设置名字:setFileName。

  • 然后将图片和文本拼接在一起成为一个part;

  • 再将这个part和附件拼接在一起(关系为 mixed),最后形成一个总的MIME结构。

package com.AL;

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 MailDemo03 {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        // 定义session对象的环境信息
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com"); //设置qq邮件服务器,
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议。接收协议为pop3
        prop.setProperty("mail.stmp.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() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名,授权码
                return new PasswordAuthentication("1356207897@qq.com", "zlfqkymrzdoobabi");
            }
        });

        // 2.通过 session 去得到 transport对象.   这个和 JDBC中创建数据库对象 statement对象 用于执行SQL一样。 transport对象去执行发送邮件
        Transport ts = session.getTransport();

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

        //4、创建邮件,一个Message对象
        // 写邮件。 注意需要传递Session
        MimeMessage message = new MimeMessage(session);
        //指定邮件的发件人
        message.setFrom(new InternetAddress("1356207897@qq.com"));

        // 邮件的收件人。 此时发件人和收件人一样,即自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("1356207897@qq.com"));

        //邮件的标题
        message.setSubject("欢迎查看匹诺曹的图片");

        // #################### 带有图片的邮件修改,其实就是改变了邮件的内容,使用 MimeBodyPart类
        /** //邮件的文本内容
         * message.setContent("<h1 style='color: blue'> 你好啊,小伙子!<h1>", "text/html; charset=UTF-8");
         */

        // 准备的图片的数据
        MimeBodyPart image = new MimeBodyPart();
        // 图片需要经过数据处理: DataHandler:数据处理
        DataHandler dh = new DataHandler(new FileDataSource("src/image/girl.jpg"));
        image.setDataHandler(dh);  //在我们的Body中放入这个处理的图片数据
        image.setContentID("girl.jpg"); //给图片设置一个 ID,后面传送的时候使用

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:girl.jpg'>的邮件", "text/html;charset=UTF-8");

        //准备的附件的数据
        MimeBodyPart annex = new MimeBodyPart();
        annex.setDataHandler(new DataHandler(new FileDataSource("src/resources/db.properties")));
        annex.setFileName("db.properties"); //附件设置名字

        // 描述数据关系
        MimeMultipart mm = new MimeMultipart();
        // 拼接邮件的正文内容:
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related"); //将图片和邮件内嵌成功

        // 将拼接好的正文内容设置为主体
        MimeBodyPart contentText =  new MimeBodyPart();
        contentText.setContent(mm);

        // 拼接附件
        MimeMultipart allFile =new MimeMultipart();
        allFile.addBodyPart(annex); //附件
        allFile.addBodyPart(contentText); //正文
        allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;

        //设置到消息中,保存修改
        message.setContent(allFile);  //把编辑好的邮件内容去放到 message对象中
        message.saveChanges();

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

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

结果:成功的将图片和附件的复杂邮件进行发送。

在这里插入图片描述

2.3、总结

JDBC程序:

  1. 数据库配置信息,加载驱动
  2. 连接数据库,
  3. 创建能够代表数据库去执行SQL的对象 Statement:CRUD
  4. 编写 SQL语句
  5. 执行SQL
  6. 关闭连接。

我们使用 java发送邮件的步骤: 其实和 JDBC的步骤十分类似。

  • 设置邮件服务器的网络连接信息。如设置为QQ邮件服务器、接受发协议等环境信息
  1. 创建邮件服务器的网络连接信息 等 环境信息的 Session对象
  2. 创建代表邮件内容的 Message对象
  3. 创建 Transport对象,连接邮件服务器,让其去执行发送邮件的Message。 Transport ts = session.getTransport();
  4. 关闭连接。

创建了Session(里面包含了邮件的发送和接收协议),并利用Session去创建 Transport对象,能够代表Session去进行连接到服务器,然后把 Message对象(即具体的邮件内容数据) 去发送到邮件服务器中。

Store对象会用于从邮件服务器去接收邮件,去创建Message表示具体的邮件内容;创建的Seesion对象,定义了邮件收发协议、端口号等环境信息。

3、JavaWeb发送邮件

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。

今天我们也来实现一个这样的功能:

用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于==JavaMail==了。

总体思路

  • 我们创建前端进行注册的页面。当进行 submit动作时,进行请求路径 /RegisterServlet.do
  • 创建Servlet类,并在web.xml配置文件中进行注册和映射。
  • 在Servlet类中,获取前端的参数信息,将参数信息封装到 pojo实体类 User 中,去调用 Sendmail工具类进行邮件发送。 采用多线程去进行异步处理, 对用户进行响应,请求转发完成页面跳转。 req.getRequestDispatcher(“info.jsp”).forward(req,resp);
  • pojo实体类User 保存用户信息
  • utils工具类,用于邮件发送。

具体步骤:

  1. 前端注册页面:表单

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$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>
    
  2. 编写对应的用户实体类: 无参,有参,toString,get set创建公共属性。

    package com.AL.pojo;
    
    public class User {
        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 + '\'' +
                    '}';
        }
    }
    
  3. 邮件发送工具类:网站3秒原则,多线程实现用户体验

    我们使用多线程去实现用户体验,进行异步处理。

    package com.AL.utils;
    
    import com.AL.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秒原则: 用户体验
    // 多线程实现用户体验: (异步处理)
    public class Sendmail extends Thread {
    
        // 用于给用户发送邮件的邮箱
        private String from = "1356207897@qq.com";
        //邮箱的用户名
        private String username = "1356207897@qq.com";
        //邮箱的密码
        private String password = "zlfqkymrzdoobabi";
        //发送邮件的服务器地址
        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 javax.mail.PasswordAuthentication getPasswordAuthentication() {
                        //发件人邮件用户名,授权码
                        return new PasswordAuthentication("1356207897@qq.com", "zlfqkymrzdoobabi");
                    }
                });
    
                //开启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();
    
                //发送邮件
                ts.sendMessage(message, message.getAllRecipients());
                ts.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
    
  4. servlet处理类:

    package com.AL.servlet;
    
    
    import com.AL.pojo.User;
    import com.AL.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);
                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);
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
  5. web.xml配置文件:

        <servlet>
            <servlet-name>register</servlet-name>
            <servlet-class>com.AL.servlet.RegisterServlet</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>register</servlet-name>
            <url-pattern>/RegisterServlet.do</url-pattern>
        </servlet-mapping>
    
  6. pom.xml配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>AL</groupId>
        <artifactId>WebMail</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.0</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.3.3</version>
            </dependency>
        </dependencies>
    
        <!--在build中配置resource,为了防止资源导出时的失败-->
        <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    
    </project>
    

    7.启动Tomcat,进行测试: 注册信息,显示注册成功页面后,等一会才收到注册的信息。
    在这里插入图片描述
    注意:在进行测试的时候,发现出现错误:java.lang.NoClassDefFoundError: javax/mail/Authenticator

这是因为缺少activation.jar包和mail.jar包。但是我们已经将这两个包导入了IDEA中lib 库作为 jar包。 这是因为我们需要把这两个包放在TOMCAT_HOME/lib目录下,TOMCAT_HOME是tomcat的安装目录,然后重启tomcat即可

activation.jar下载地址:

https://mvnrepository.com/artifact/javax.activation/activation

mail.jar包下载地址:

https://mvnrepository.com/artifact/javax.mail/mail

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值