前言:

推荐免费JavaWeb入门到实战视频:【狂神说Java】JavaWeb入门到实战_哔哩哔哩_bilibili

JavaWeb笔记代码下载地址:

蓝奏云:下载地址 密码:joker

百度云:下载地址 提取码:uhm2

邮件发送原理及实现

发送邮件简单理解

image-20220422111110784

Java中实现邮件发送准备

使用Java发送E-mail,需要准备JavaMail APIJava Activation Framework

下载需要的jar包:

  • mail.jar
  • activation.jar

Java处理邮件的四个核心类

image-20220422112003199

QQ邮箱授权码获取(设置–>账户)

image-20220422121408263

邮件发送实现

  1. 导包

    image-20220422121149931

  2. 实现简单(纯文本)邮件发送

    MailDemo01.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    package com.jokerdig.mail;

    import com.sun.mail.util.MailSSLSocketFactory;

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

    /**
    * @author Joker大雄
    * @data 2022/4/22 - 11:35
    **/
    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 mssl = new MailSSLSocketFactory();
    mssl.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable","true");
    prop.put("mail.smtp.ssl.socketFactory",mssl);

    // 使用 JavaMail 发送邮件5个步骤

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

    // 开启Session的debug模式 方便查看email运行状态
    session.setDebug(true);

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

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

    // 4.创建邮件
    // 注意需要传递session
    MimeMessage message = new MimeMessage(session);
    // 指明发件人
    message.setFrom(new InternetAddress("xxxxxx@qq.com"));
    // 指明收件人 Message.RecipientType.TO 防止邮件被拦截到垃圾箱
    message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxxxx@163.com"));

    // 邮件的标题
    message.setSubject("Java发送了一封邮件");
    // 邮件的文本内容 和编码
    message.setContent("使用Java实现一封邮件发送 --来自:<a href='https://jokerdig.com'>Hey,Joker</a>","text/html;charset=UTF-8");

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

    System.out.println("发送结束");
    // 6.关闭连接
    ts.close();
    }
    }
  3. 邮件发送成功

    image-20220422120646902

网站注册发送邮件实现

带附件的邮件发送

  • MIME(多用途互联网邮件扩展类型)

  • MimeBodyPart类

    javax.mail.internet.MimeBodyPart类,是一个MIME消息,它和MImeMessage类一样从Part接口继承过来

  • MimeMultipart类

    javax.mail.internet.MimeMultipart是抽象类Multipart的子类,用来组合多个MIME消息

嵌套关系

image-20220422122713403

创建包含内嵌图片的邮件

  1. 实现带图邮件发送

    MailDemo02.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    package com.jokerdig.mail;

    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;

    /**
    * @author Joker大雄
    * @data 2022/4/22 - 12:29
    **/
    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("mail.smtp.auth","true");// 验证用户名密码

    // QQ邮箱 需要设置SSL加密
    MailSSLSocketFactory mssl = new MailSSLSocketFactory();
    mssl.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable","true");
    prop.put("mail.smtp.ssl.socketFactory",mssl);

    // 使用 JavaMail 发送邮件5个步骤

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

    // 开启Session的debug模式 方便查看email运行状态
    session.setDebug(true);

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

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

    // 4.创建邮件
    // 注意需要传递session
    MimeMessage message = new MimeMessage(session);
    // 指明发件人
    message.setFrom(new InternetAddress("xxxxx@qq.com"));
    // 指明收件人 Message.RecipientType.TO 防止邮件被拦截到垃圾箱
    message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxxx@163.com"));

    // 邮件的标题
    message.setSubject("Java发送了一封带图片的邮件");

    // 准备图片素材
    MimeBodyPart image = new MimeBodyPart();
    // 处理图片 DataHandler
    DataHandler dh = new DataHandler(new FileDataSource("D:\\Project\\project3\\JavaWeb\\功能拓展\\mail\\src\\resource\\va-11.png"));
    image.setDataHandler(dh);
    image.setContentID("va.png");

    // 邮件的文本内容 和编码
    MimeBodyPart text = new MimeBodyPart();
    text.setContent("使用Java实现一封带图片邮件的发送<img src='cid:va.png'/> --来自:<a href='https://jokerdig.com'>Hey,Joker</a>","text/html;charset=UTF-8");

    // 描述数据关系 连接图片和文字
    MimeMultipart mime = new MimeMultipart();
    mime.addBodyPart(text);
    mime.addBodyPart(image);
    mime.setSubType("related");

    // 设置消息 保存
    message.setContent(mime);
    message.saveChanges();

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

    System.out.println("发送结束");
    // 6.关闭连接
    ts.close();
    }
    }
  2. 发送成功

    image-20220422130150113

Java实现网站邮箱注册

  1. 引入jar包

    pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <!--        servlet-->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    </dependency>
    <!-- mail-->
    <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
    </dependency>
    <!-- activation -->
    <dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
    </dependency>

  2. 项目构建完毕

    image-20220422150806904

  3. 编写相关代码

    RegisterServlet.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.jokerdig.servlet;

    import com.jokerdig.pojo.User;
    import com.jokerdig.util.SendMail;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;

    /**
    * @author Joker大雄
    * @data 2022/4/22 - 13:47
    **/
    public class RegisterServlet extends HttpServlet {

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

    @Override
    protected void doPost(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);
    // 启动线程
    send.start();
    // 开始注册
    req.setAttribute("msg","注册成功,我们已向您的邮箱发送了一封带有注册信息的电子邮件,请查收!");
    req.getRequestDispatcher("info.jsp").forward(req,resp);
    }
    }

    SendMail.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    package com.jokerdig.util;

    import com.jokerdig.pojo.User;
    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;

    /**
    * @author Joker大雄
    * @data 2022/4/22 - 14:09
    **/
    public class SendMail extends Thread{
    // 发送的邮箱
    private String from = "jokerdaxiong@qq.com";
    // 接收者邮箱
    private String username = "jokerdaxiong@qq.com";
    // 授权码
    private String password = "授权码";
    // 发送邮件服务器
    private String host = "smtp.qq.com";

    private User user;

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

    @Override
    public void run() {
    try {
    // 设置服务器 发送协议 用户名密码
    Properties prop = new Properties();
    prop.setProperty("mail.host",host);// 设置qq邮箱服务器
    prop.setProperty("mail.transport.protocol","smtp");// 邮箱发送协议
    prop.setProperty("mail.smtp.auth","true");// 验证用户名密码

    // QQ邮箱 需要设置SSL加密
    MailSSLSocketFactory mssl = new MailSSLSocketFactory();
    mssl.setTrustAllHosts(true);
    prop.put("mail.smtp.ssl.enable","true");
    prop.put("mail.smtp.ssl.socketFactory",mssl);

    // 使用 JavaMail 发送邮件5个步骤

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

    // 开启Session的debug模式 方便查看email运行状态
    session.setDebug(true);

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

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

    // 4.创建邮件
    // 注意需要传递session
    MimeMessage message = new MimeMessage(session);
    // 指明发件人
    message.setFrom(new InternetAddress(from));
    // 指明收件人 Message.RecipientType.TO 防止邮件被拦截到垃圾箱
    message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));

    // 邮件的标题
    message.setSubject("Hey,Joker用户注册");
    // 邮件的文本内容 和编码
    String info = "恭喜注册成功,您的账号:<b>"+user.getUsername()+"</b> 密码:<b>"+user.getPassword()+"</b>,请妥善保管。 --来自:<a href='https://jokerdig.com'>Hey,Joker</a>";
    message.setContent(info,"text/html;charset=UTF-8");

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

    System.out.println("发送结束");
    // 6.关闭连接
    ts.close();
    } catch (GeneralSecurityException e) {
    e.printStackTrace();
    } catch (MessagingException e) {
    e.printStackTrace();
    }

    }
    }

    User.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    package com.jokerdig.pojo;

    import java.io.Serializable;

    /**
    * @author Joker大雄
    * @data 2022/4/22 - 14:00
    **/
    // 序列化
    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;
    }
    }

    index.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <%@ 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>

    info.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>注册成功</title>
    </head>
    <body>
    <h1>Hey,Joker温馨提示:</h1>
    ${msg}<br>
    <a href="index.jsp">返回注册页</a>
    </body>
    </html>

    web.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!--    RegisterServlet-->
    <servlet>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.jokerdig.servlet.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <url-pattern>/registerServlet.do</url-pattern>
    </servlet-mapping>
  4. 实现邮件注册

    image-20220422150833032

    image-20220422150848695

之后的学习方向

SSM框架部分

SSM框架