JavaMail

本文详细介绍了使用JavaMail发送邮件的步骤,包括依赖配置、获取授权码、不同类型的邮件(普通文本、内嵌资源、混合邮件)的创建与发送。此外,还展示了如何在Web环境中集成JavaMail,通过Tomcat配置、Servlet和实体类实现用户注册邮件的发送。

JavaMail 知识点

需要用到依赖包

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

获取QQ邮箱的 客户端授权码

QQ邮箱开启服务 获取客户端授权码(设置->账户->开启服务)

获取QQ邮箱授权码

JavaMail发送邮件的步骤

注意QQ邮箱需要SSL秘钥验证

  1. 创建定义整个应用程序所需的环境信息的Session对象

    JavaMail中的Session类

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

  3. 使用邮箱的用户名和授权码连上邮件服务器
    ts.connect("smtp.qq.com","邮箱地址","邮箱授权码(QQ邮箱必须要获取指定的授权码)");

  4. 创建邮件

    1. 通过session获取MimeMessage消息实例
      MimeMessage msg = new MimeMessage(session);
    2. 指定邮件发件人
      msg.setFrom(new InternetAddress("邮箱地址"));
    3. 指定邮件接收人(可以设置多个接收人)
      msg.setRecipient(Message.RecipientType.TO,new InternetAddress("邮箱地址"));
    4. 指定邮件标题
      msg.setSubject("邮件标题");
    5. 邮件的内容(文本、图片、附件)
      msg.setContent(邮件内容实例);
  5. 发送邮件
    ts.sendMessage(msg,msg.getAllRecipients());

  6. 关闭连接
    ts.close();

邮件类型

  1. alternative 普通文本邮件
  2. related 内嵌资源邮件
  3. mixed 混合模式,可以携带附件(默认)

邮件打包类型

普通文本邮件

普通HTML文本邮件设置方式:

msg.setContent("HTML文本","text/html;charset=UTF-8");

代码:
package com.kun;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
 * 简单文本邮件 alternative
 */
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("main.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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
            }
        });

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

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

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

        //4.创建邮件
        //注意需要传递session
        MimeMessage msg = new MimeMessage(session);

        //邮件发件人
        msg.setFrom(new InternetAddress("317557750@qq.com"));
        //邮件接收人
        msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
        //邮件标题
        msg.setSubject("简单文本邮件");

        //邮件的文本内容
        msg.setContent("<h1 style='color:red'>冲冲冲!</h1>","text/html;charset=UTF-8");

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

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

}

控制台输出

DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszc6.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25

EHLO guokun.mshome.net
250-newxmesmtplogicsvrszc6.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <1020391880.0.1629456485728.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?566A5Y2V5paH5pys6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<h1 style=3D'color:red'>=E5=86=B2=E5=86=B2=E5=86=B2=EF=BC=81</h1>
.
250 OK: queued as.
QUIT
221 Bye.

Process finished with exit code 0

收到的邮件

收到的普通文本邮件

内嵌资源邮件

  • 嵌入的图片等资源需要先通过DataHandler类进行解析

  • MimeBodyPart是每一个邮件具体项目的最小单位,可以存放文本、图片等资源

    • setDataHandler()将解析后的资源放到MimeBodyPart中
    • setContentID()指定该MimeBodyPart中的资源ID值(字符串),调用方式:src = ‘cid:xxxx’
    • setContent()将文本或资源放入MimeBodyPart中
  • MimeMultipart用于将指定一组MimeBodyPart实例一起组合打包

    • addBodyPart()添加要打包的MimeBodyPart实例
    • setSubType()设置打包好的邮件邮件类型

嵌入打包邮件内容

代码

package com.kun;

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;

/**
 * 内嵌图片邮件 related
 */
public class MailDemo02 {

    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("main.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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
            }
        });

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

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

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

        //4.创建邮件
        //注意需要传递session
        MimeMessage msg = new MimeMessage(session);

        //邮件发件人
        msg.setFrom(new InternetAddress("317557750@qq.com"));
        //邮件接收人
        msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
        //邮件标题
        msg.setSubject("带有图片资源的邮件");

        //=============================================================

        //准备图片数据
        MimeBodyPart img = new MimeBodyPart();
        //图片要经过数据处理... DataHandler:数据处理
        DataHandler imgDh = new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\link.jpg"));
        img.setDataHandler(imgDh);//在Body主体中放入处理后的图片数据
        img.setContentID("link.jpg");//给图片设置一个ID  后续可以使用(HTML中通过src='cid:...'调用)

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("太阳系的行星分布图:<img src='cid:link.jpg'>","text/html;charset=UTF-8");

        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(img);
        mm.setSubType("related");//默认是 mixed

        //设置到消息中,保存修改
        msg.setContent(mm);//把最终编辑好的邮件放在消息当中
        msg.saveChanges();//保存修改

        //===================================================

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

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

}

控制台输出


DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszb6.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25

EHLO guokun.mshome.net
250-newxmesmtplogicsvrszb6.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <5592464.1.1629456729052.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?566A5Y2V5paH5pys6YKu5Lu2?=
MIME-Version: 1.0
Content-Type: multipart/related; 
	boundary="----=_Part_0_1837543557.1629456729042"

------=_Part_0_1837543557.1629456729042
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base64

5aSq6Ziz57O755qE6KGM5pif5YiG5biD5Zu+77yaPGltZyBzcmM9J2NpZDpsaW5rLmpwZyc+
------=_Part_0_1837543557.1629456729042
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: link.jpg

//这里省略解码后的图片代码信息
------=_Part_0_1837543557.1629456729042--
.
250 OK: queued as.
QUIT
221 Bye.

Process finished with exit code 0

收到的邮件

嵌入了图片的邮件

混合邮件

  • 实际上就是用MimeBodyPartMimeMultipart一层套一层达到混合目的

混合打包邮件内容

  • 创建的附件MimeBodyPart可以通过调用setFileName(字符串)设置附件的名称,使用MimeUtility.encodeText(字符串)可以解决中文显示乱码问题

代码

package com.kun;

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;

/**
 * 混合邮件 mixed
 */
public class MailDemo03 {

    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("main.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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("317557750@qq.com", "misxauephvtfcaij");
            }
        });

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

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

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

        //4.创建邮件
        MimeMessage msg = getMimeMessage(session);

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

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

    private static MimeMessage getMimeMessage(Session session) throws Exception {
        //注意需要传递session
        MimeMessage msg = new MimeMessage(session);

        //邮件发件人
        msg.setFrom(new InternetAddress("317557750@qq.com"));
        //邮件接收人
        msg.setRecipient(Message.RecipientType.TO,new InternetAddress("317557750@qq.com"));
        //邮件标题
        msg.setSubject("文本、图片、附件我都有,无敌混合邮件在此");

        //=============================================================
        /*
        编写邮件内容
        1.图片
        2.附件
        3.文本
         */

        //准备图片数据
        MimeBodyPart img = new MimeBodyPart();
        //图片要经过数据处理... DataHandler:数据处理
        DataHandler imgDh = new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\link.jpg"));
        img.setDataHandler(imgDh);//在Body主体中放入处理后的图片数据
        img.setContentID("link.jpg");//给图片设置一个ID  后续可以使用(HTML中通过src='cid:...'调用)

        //准备文本数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("太阳系的行星分布图:<img src='cid:link.jpg'>","text/html;charset=UTF-8");

        //准备附件数据E:\Users\31755\Desktop\code\JAVA\javaweb_learn\功能扩展\Mail\src\main\resources\javaWeb文件上传与下载.md
        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setDataHandler(new DataHandler(new FileDataSource("E:\\Users\\31755\\Desktop\\code\\JAVA\\javaweb_learn\\功能扩展\\Mail\\src\\main\\resources\\javaWeb文件上传与下载.md")));
        attachment.setFileName(MimeUtility.encodeText("javaWeb文件上传与下载.md"));//给附件设置名字,MimeUtility.encodeText()解决中文乱码问题

        //拼装邮件正文内容 文本和图片打包
        MimeMultipart textAndImgMM = new MimeMultipart();
        textAndImgMM.addBodyPart(text);
        textAndImgMM.addBodyPart(img);
        textAndImgMM.setSubType("related");
        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(textAndImgMM);

        //将正文与附件打包
        MimeMultipart mailMM = new MimeMultipart();
        mailMM.addBodyPart(contentText);//正文
        mailMM.addBodyPart(attachment);//附件
        mailMM.setSubType("mixed");//混合型-->默认的可以不手动设置

        //===================================================

        //设置到消息中,保存修改
        msg.setContent(mailMM);//把最终编辑好的邮件放在消息当中
        msg.saveChanges();//保存修改

        return msg;
    }

}

控制台输出


DEBUG: setDebug: JavaMail version 1.5.0-b01
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 25, isSSL false
220 newxmesmtplogicsvrszc9.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 25

EHLO guokun.mshome.net
250-newxmesmtplogicsvrszc9.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<317557750@qq.com>
250 OK.
RCPT TO:<317557750@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   317557750@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 317557750@qq.com
To: 317557750@qq.com
Message-ID: <142638629.2.1629462749975.JavaMail.31755@smtp.qq.com>
Subject: =?UTF-8?B?5paH5pys44CB5Zu+54mH44CB6ZmE5Lu25oiR6YO9?=
 =?UTF-8?B?5pyJ77yM5peg5pWM5re35ZCI6YKu5Lu25Zyo5q2k?=
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_1_668849042.1629462749968"

------=_Part_1_668849042.1629462749968
Content-Type: multipart/related; 
	boundary="----=_Part_0_1450821318.1629462749968"

------=_Part_0_1450821318.1629462749968
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base64

5aSq6Ziz57O755qE6KGM5pif5YiG5biD5Zu+77yaPGltZyBzcmM9J2NpZDpsaW5rLmpwZyc+
------=_Part_0_1450821318.1629462749968
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: link.jpg

//此处省略资源解析的输出
------=_Part_1_668849042.1629462749968--
.
250 OK: queued as.
QUIT
221 Bye.

Process finished with exit code 0

收到的邮件

文本、图片、附件混合邮件

JavaMail Web实战

创建web项目配置Tomcat

配置Tomcat

导入依赖

<?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>com.kun</groupId>
    <artifactId>Mail</artifactId>
    <version>1.0-SNAPSHOT</version>


    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.5.0-b01</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

Tomcat导包

如果在代码没有问题的情况下 网页出现500错误 没有找到某一个类,有可能就是因为这个类在Tomcat中没有,所以需要进行导包,把该类所在的包手动导入到Tomcat中
Tomcat缺少依赖时的保持信息

手动导入jar包

前端页面

  1. index.jsp 邮箱注册页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>注册</title>
      </head>
      <body>
    
      <form action="${pageContext.request.contextPath}/RegisterServlet" 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. info.jsp 注册结果页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>提示页面</title>
    </head>
    <body>
        <h1>温馨提示</h1>
        ${message}
    </body>
    </html>
    

实体类 User

User主要就是用来存储注册的用户信息,这样就可以运行工具类SendMail引用User中的邮箱地址。

实现Serializable接口,使得该实体类可以被序列化。

package com.kun.entity;


import java.io.Serializable;

public class User implements Serializable {

    private String username;
    private String password;
    private String mail;

    public User() {
    }

    public User(String username, String password, String mail) {
        this.username = username;
        this.password = password;
        this.mail = mail;
    }

    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 getMail() {
        return mail;
    }

    public void setMail(String mail) {
        this.mail = mail;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", mail='" + mail + '\'' +
                '}';
    }
}

工具类 SendMail

这个工具类就只是简单的用来向指定用户的邮箱发送他的注册信息。

继承Thread实现run()方法,由于发送邮件需要连接服务器可能会耗时比较多,因此通过多线程的方式避免空白等待时间,提升用户体验。

package com.kun.utils;

import com.kun.entity.User;
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;

//网站3秒原则:用户体验
//多线程实现用户体验!(异步处理)
public class SendMail extends Thread{

    //发送方邮箱
    private String fromMail = "317557750@qq.com";
    //邮箱用户名
    private String username = "317557750@qq.com";
    //邮箱密码(授权码)
    private String password = "misxauephvtfcaij";
    //服务器地址
    private String serverHost = "smtp.qq.com";

    private User user;

    public SendMail(User user) {
        this.user = user;
    }

    public void run() {
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host",serverHost);//设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
            prop.setProperty("main.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() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });

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

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

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

            //4.创建邮件
            //注意需要传递session
            MimeMessage msg = new MimeMessage(session);

            //邮件发件人
            msg.setFrom(new InternetAddress(fromMail));
            //邮件接收人
            msg.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
            //邮件标题
            msg.setSubject("注册信息");

            //邮件的文本内容
            msg.setContent("<h1 style='color:red'>"+user+"</h1>","text/html;charset=UTF-8");

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

            //6.关闭连接
            ts.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

Servlet RegisterServlet

这里通过调用start()方法启动线程,如果使用run()方法则会在当前线程中执行。

package com.kun.servlet;

import com.kun.entity.User;
import com.kun.utils.SendMail;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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 {
        //接收用户请求 封装成对象
        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);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

注册Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.kun.servlet.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/RegisterServlet</url-pattern>
    </servlet-mapping>

</web-app>

运行

注册页面
注册结果提示页面
收到了发送过来的邮件
收到的邮件内容

本博客参考 B站 狂神说Java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值