【Javaweb----邮件发送】

【邮件发送】

一、原理与相关类

image-20210901200542467

二、项目搭建

1、需要的依赖

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

2、需要开启相关的POP3/SMTP服务,并获取授权码。

image-20210901201648591

3、代码实现

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 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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送者邮箱","授权码");
            }
        });

        session.setDebug(true);

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

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

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

        //指明邮件的发件人
        message.setFrom(new InternetAddress("123123123@qq.com"));

        //指明邮件的收件人,现在发件人和收件人是一样的,那就是给自己发
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("1123123123@qq.com"));

        //邮件的标题
        message.setSubject("只包含文本的简单邮件");

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

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

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


    }
}

三、邮件发送附件

1、MIME

MimeBodyPart类

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

MimeMultipart类

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

image-20210901205302307

2、带图片的邮件实现

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 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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送者邮箱","授权码");
            }
        });

        session.setDebug(true);

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

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

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

        //指明邮件的发件人
        message.setFrom(new InternetAddress("123123123@qq.com"));

        //指明邮件的收件人,现在发件人和收件人是一样的,那就是给自己发
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("1123123123@qq.com"));

        //邮件的标题
        message.setSubject("只包含文本的简单邮件");

        //邮件的文本内容
       //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理    DataHandler:数据处理
        DataHandler dh = new DataHandler(new FileDataSource("C:\\Users\\darkerg\\Desktop\\JAVA\\JavaWeb2\\mail\\src\\main\\resources\\bz.jpg"));
        image.setDataHandler(dh);//在我们的Body主题中放入处理的图片数据
        image.setContentID("bz.jpg");//给图片设置一个ID,我们在后面可以使用。

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:bz.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());

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


    }
}

3、带附件的邮件实现

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 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() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送者邮箱","授权码");
            }
        });

        session.setDebug(true);

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

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

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

        //指明邮件的发件人
        message.setFrom(new InternetAddress("123123123@qq.com"));

        //指明邮件的收件人,现在发件人和收件人是一样的,那就是给自己发
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("1123123123@qq.com"));

        //邮件的标题
        message.setSubject("只包含文本的简单邮件");

         /*
       编写邮件内容
       图片、附件、文本
         */

        //图片
        MimeBodyPart body1 = new MimeBodyPart();
        body1.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\darkerg\\Desktop\\JAVA\\JavaWeb2\\mail\\src\\main\\resources\\bz.jpg")));
        body1.setContentID("123.jpg");//图片设置id

        //文本
        MimeBodyPart body2 = new MimeBodyPart();
        body2.setContent("你好你好你好!!!<img src='cid:123.jpg'>","text/html;charset=utf-8");

        //附件
        MimeBodyPart body3 = new MimeBodyPart();
        body3.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\darkerg\\Desktop\\JAVA\\JavaWeb2\\mail\\src\\main\\resources\\【MySQL & JDBC】.md")));
        body3.setFileName("Mysql");//附件设置名字

        MimeBodyPart body4 = new MimeBodyPart();
        body4.setDataHandler(new DataHandler(new FileDataSource("C:\\Users\\darkerg\\Desktop\\JAVA\\JavaWeb2\\mail\\src\\main\\resources\\1.txt")));
        body4.setFileName("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消息中
        message.setContent(allFile);
        message.saveChanges();

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

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


    }
}

四、网站注册邮件搭建

1、项目结构

image-20210901223656876

依赖

<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>

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

2、pojo/User实体类

package com.darkerg.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String username;
    private String password;
    private String email;
}

3、RigisterServlet.java

package com.darkerg.servlet;

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

public class RigisterServlet 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);
    }
}

4、util/Sendmail工具类

package com.darkerg.util;

import com.darkerg.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;

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

    //用于给用户发送邮件的邮箱
    private String from = "";
    //邮箱的用户名
    private String username = "";
    //邮箱的授权码
    private String password = "";
    //发送邮件的服务器地址
    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);//设置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() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username,password);
                }
            });

            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.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));

            //邮件的标题
            message.setSubject("用户注册邮件");

            //邮件的文本内容
            String info = "恭喜您注册成功,您的用户名:"+user.getUsername()+"您的密码:"+user.getPassword()+",请妥善保管,如有问题请联系客服";
            message.setContent(info,"text/html;charset=UTF-8");

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

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

    }
}

5、web.xml配置

<servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.darkerg.servlet.RigisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/RegisterServlet.do</url-pattern>
    </servlet-mapping>

6、前端页面

index.jsp

<%@ 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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册成功</title>
</head>
<body>

${message}

</body>
</html>

posted @ 2021-09-02 00:08  DarkerG  阅读(51)  评论(0编辑  收藏  举报