当前位置:首页>笔记分享>Java笔记>JavaWeb>JavaWeb之邮件发送

JavaWeb之邮件发送

1、邮件发送

1.1、邮件服务器与传输协议

  • 要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

  • SMTP协议

    通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

  • POP3协议

    通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

1.2、Java发送邮件

发送邮件过程

1.3、准备阶段

需要的包

  • mail.jar
  • activation.jar

QQ邮箱需获取相应的权限:

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

授权开启

1.4、纯文本邮件发送

package com.gong;

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 SimpleMail {
    public static void main(String[] args) throws MessagingException, GeneralSecurityException {
        //创建一个配置文件并保存
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");
        properties.setProperty("mail.transport.protocol","smtp");
        properties.setProperty("mail.smtp.auth","true");
        //QQ存在一个特性设置SSL加密(仅QQ需要)
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);
        //1.创建定义整个应用程序所需要的环境信息的Session对象
        // (这个也是QQ需要)
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //授权 发送者的邮箱以及授权码
                return new PasswordAuthentication("334405060@qq.com","bpuefqfkgvzobjcb");
            }
        });
        //开启Session的debug模式(显示发送邮箱的运行状态)
        session.setDebug(true);
        //2.通过session得到对象transport
        Transport transport = session.getTransport();
        //使用邮箱的用户名和授权码连接服务器
        transport.connect("smtp.qq.com","334405060@qq.com","bpuefqfkgvzobjcb");
        //创建邮件对象:写邮箱(注意传递session)
        MimeMessage mimeMessage = new MimeMessage(session);
        //邮件发送人
        mimeMessage.setFrom(new InternetAddress("334405060@qq.com"));
        //邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("529999417@qq.com"));
        //邮件标题
        mimeMessage.setSubject("Hello Mail");
        //邮件内容
        mimeMessage.setContent("<h1 style='color:red'>我嫩爹</h1>","text/html;charset=UTF-8");
        //发送邮件
        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        //关闭连接
        transport.close();
    }
}

1.5、文本图片附件复杂的邮件发送

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

MimeBodyPart类

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

MimeMultipart类

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

package com.gong;

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 ComplexMail {
    public static void main(String[] args) throws MessagingException, GeneralSecurityException {
        //创建一个配置文件并保存
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");
        properties.setProperty("mail.transport.protocol","smtp");
        properties.setProperty("mail.smtp.auth","true");
        //QQ存在一个特性设置SSL加密(仅QQ需要)
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);
        //1.创建定义整个应用程序所需要的环境信息的Session对象
        // (这个也是QQ需要)
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //授权 发送者的邮箱以及授权码
                return new PasswordAuthentication("334405060@qq.com","bpuefqfkgvzobjcb");
            }
        });
        //开启Session的debug模式(显示发送邮箱的运行状态)
        session.setDebug(true);
        //2.通过session得到对象transport
        Transport transport = session.getTransport();
        //3.使用邮箱的用户名和授权码连接服务器
        transport.connect("smtp.qq.com","334405060@qq.com","bpuefqfkgvzobjcb");
        //4.创建邮件对象:写邮箱(注意传递session)
        MimeMessage mimeMessage = complexEmail(session);
        //5.发送邮件
        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        //6.关闭连接
        transport.close();
    }
    public static MimeMessage complexEmail(Session session) throws MessagingException {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);
        //发件人
        mimeMessage.setFrom(new InternetAddress("334405060@qq.com"));
        //收件人
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("529999417@qq.com"));
        //邮件标题
        mimeMessage.setSubject("带图片和附件的邮件");

        //邮件内容之前都是不变的
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过处理...DataHandler:数据处理
        DataHandler handler = new DataHandler(new FileDataSource("/Users/gongjunpeng/Downloads/1.png"));
        image.setDataHandler(handler);//在我们的body中放入这个处理的图片数据
        image.setContentID("test.png"); //设置图片id,我们在后面可以用到

        //准备文本
        MimeBodyPart text = new MimeBodyPart();
        //cid就是ContentID
        text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");

        //附件
        MimeBodyPart appendix = new MimeBodyPart();
        appendix.setDataHandler(new DataHandler(new FileDataSource("/Users/gongjunpeng/Downloads/readme.txt")));
        appendix.setFileName("test.txt");

        //拼装邮件正文
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(image);
        mimeMultipart.addBodyPart(text);
        mimeMultipart.setSubType("related");//文本和图片内嵌成功

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

        //拼接附件
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(appendix);//附件
        allFile.addBodyPart(contentText);//正文
        allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
        //放到Message消息中
        mimeMessage.setContent(allFile);
        mimeMessage.saveChanges();//保存修改
        return mimeMessage;
    }
}

2、JavaWeb发送邮件(网站注册)

注册成功提示邮箱

2.1、User

package com.gong.pojo;

import java.io.Serializable;

public class User implements Serializable {
        private String name;
        private String password;
        private String mail;
        public User() {
        }
        public User(String name, String password, String mail) {
            this.name = name;
            this.password = password;
            this.mail = mail;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        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{" +
                    "name='" + name + '\'' +
                    ", password='" + password + '\'' +
                    ", mail='" + mail + '\'' +
                    '}';
        }

}

2.2、工具类发送邮箱的方法

SendMail

package com.gong.utils;

import com.gong.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.*;
import java.security.GeneralSecurityException;
import java.util.Properties;

public class SendMail extends Thread {
    //发件人信息
    private static String From = "334405060@qq.com";
    //发件人邮箱
    private static String recipient = "334405060@qq.com";
    //邮箱密码
    private static String password = "bpuefqfkgvzobjcb";
    //邮件发送的服务器
    private static String host = "smtp.qq.com";
    //收件人信息
    private User user;
    public SendMail(User user){
        this.user = user;
    }
    @Override
    public void run() {
        try {
            //创建一个配置文件并保存
            Properties properties = new Properties();
            properties.setProperty("mail.host","smtp.qq.com");
            properties.setProperty("mail.transport.protocol","smtp");
            properties.setProperty("mail.smtp.auth","true");
            //QQ存在一个特性设置SSL加密(仅QQ需要)
            MailSSLSocketFactory sf = null;
            try {
                sf = new MailSSLSocketFactory();
            } catch (GeneralSecurityException e) {
                e.printStackTrace();
            }
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);
            ////1.创建定义整个应用程序所需要的环境信息的Session对象
            //        // (这个也是QQ需要)
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(recipient,password);
                }
            });
            //开启Session的debug模式(显示发送邮箱的运行状态)
            session.setDebug(true);
            //2.通过session得到对象transport
            Transport transport = null;
            try {
                transport = session.getTransport();
            } catch (NoSuchProviderException e) {
                e.printStackTrace();
            }
            //3.使用邮箱的用户名和授权码连接服务器
            transport.connect(host,From,password);
            //4.创建邮件对象:写邮箱(注意传递session)
            MimeMessage mimeMessage = new MimeMessage(session);
            //邮件发送人
            mimeMessage.setFrom(new InternetAddress(recipient));
            //邮件接收人
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getMail()));
            //邮件标题
            mimeMessage.setSubject("网站注册成功");
            //邮件内容
            mimeMessage.setContent("亲爱的用户:"+user.getName()+"您好!恭喜您网站注册成功,密码为"+user.getPassword()+",请妥善保管密码","text/html;charset=UTF-8");
            //5.发送邮件
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
            //6.关闭连接
            transport.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

2.3、Servlet

package com.gong.Servlet;

import com.gong.pojo.User;
import com.gong.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 MailServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理前端请求
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        //将信息封装进user对象
        User user = new User(username, password, email);
        SendMail sendMail = new SendMail(user);
        sendMail.start(); //开启线程
        request.setAttribute("msg","发送成功");
        try {
            request.getRequestDispatcher("msg.jsp").forward(request,response);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

2.3、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>注册页面</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/sendMail.do" method="post">
  <p>用户名:<input type="text" name="username" required></p>
  <p>密码:<input type="password" name="password" required></p>
  <p>邮箱:<input type="email" name="email" required></p>
  <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

2.4、msg.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

2.5、web.xml

<?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>MailServlet</servlet-name>
        <servlet-class>com.gong.Servlet.MailServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MailServlet</servlet-name>
        <url-pattern>/sendMail.do</url-pattern>
    </servlet-mapping>
</web-app>

给TA打赏
共{{data.count}}人
人已打赏
JavaWebJava笔记

JavaWeb之文件上传与下载

2021-12-29 18:01:40

JavaWebJava笔记

JavaWeb-SMBMS实战项目

2021-12-30 18:05:27

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
有新私信 私信列表
搜索