JAVAweb-邮件发送

本文详细介绍了使用JavaMail API在JavaWeb环境中发送邮件的完整过程,包括开启QQ邮箱的SMTP服务、创建session、设置邮件内容、发送附件和图片,以及实际的注册通知邮件的实现。此外,还展示了如何通过多线程提升用户体验,确保注册成功后异步发送邮件。
摘要由CSDN通过智能技术生成

JAVAweb-邮件发送

一、简单邮件发送(只包含纯文字)
1、 新建一个maven项目
2、导入依赖
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.6.2</version>
</dependency>
3、qq邮箱中设置->账户->开启POP3/SMTP服务,拿到授权码

在这里插入图片描述

  • 邮件发送的步骤

1.创建session对象

2.创建Transport对象

3.使用邮箱的用户名和授权码连上邮件服务器

4.创建一个Message对象(需要传递session),message需要指明发件人、收件人以及文件内容

5.发送邮件

6.关闭连接

  • 代码
//使用qq邮箱给网易邮箱发送普通邮件
public class SendMail {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器
        properties.setProperty("mail.transport.protocol","smtp");//邮件发送的协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户密码

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

        //使用javaMail发送邮件:
        //1、创建定义整个应用程序所需要的环境信息的session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送人邮箱","授权码");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

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

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

        //4、创建邮件内容,注意需要传递session
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱"));
        //指明邮件的收件人
        mimeMessage.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress("接收人邮箱"));
        //邮件标题
        mimeMessage.setSubject("第一次发送的邮件");
        //邮件的内容
        mimeMessage.setContent("你好,网易邮箱,我是qq邮箱","text/html;charset=utf-8");

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

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

    }
}
4、复杂文件的发送
  • 除了邮件内容部分,其他的部分代码与简单邮件发送都差不多,邮件内容被分为很多个部分,由文件、图片、附件等构成;文本内容一般为HTML的格式发送。

在这里插入图片描述

  • 包含图片的邮件发送
//使用qq邮箱给网易邮箱发送带有图片的邮件
public class SendMail {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器
        properties.setProperty("mail.transport.protocol","smtp");//邮件发送的协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户密码

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

        //使用javaMail发送邮件:
        //1、创建定义整个应用程序所需要的环境信息的session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送人邮箱","授权码");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

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

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

        //4、创建邮件内容,注意需要传递session
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱"));
        //指明邮件的收件人
        mimeMessage.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress("接收人邮箱"));
        //邮件标题
        mimeMessage.setSubject("这是一封带有图片的邮件");
        //邮件的内容

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理,DataHandler:数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:\\java\\MYworkspace\\mail\\src\\main\\resources\\images\\img.jpg"));
        image.setDataHandler(dataHandler);//在body中放入处理图片的数据
        image.setContentID("img.jpg");//给图片设置一个ID

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("你好,网易邮箱,我是qq邮箱,我带图片<img src='cid=img.jsp'>来看你了","text/html;charset=utf-8");

        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        //设置到消息中,保存修改
        mimeMessage.setContent(mm);
        mimeMessage.saveChanges();

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

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

    }
}

  • 包含附件的邮件发送
//使用qq邮箱给网易邮箱发送带有图片的邮件
public class SendMail {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        Properties properties = new Properties();
        properties.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器
        properties.setProperty("mail.transport.protocol","smtp");//邮件发送的协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户密码

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

        //使用javaMail发送邮件:
        //1、创建定义整个应用程序所需要的环境信息的session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送人邮箱","授权码");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

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

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

        //4、创建邮件内容,注意需要传递session
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱"));
        //指明邮件的收件人
        mimeMessage.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress("接收人邮箱"));
        //邮件标题
        mimeMessage.setSubject("这是一封带有图片的邮件");
        //邮件的内容

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理,DataHandler:数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:\\java\\MYworkspace\\mail\\src\\main\\resources\\images\\img.jpg"));
        image.setDataHandler(dataHandler);//在body中放入处理图片的数据
        image.setContentID("img.jpg");//给图片设置一个ID

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("你好,网易邮箱,我是qq邮箱,我带图片<img src='cid=img.jsp'>来看你了","text/html;charset=utf-8");

        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        //设置到消息中,保存修改
        mimeMessage.setContent(mm);
        mimeMessage.saveChanges();

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

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

    }
}

  • 包含附件和文件的邮件发送
public class SendMailDemo03 {
    //使用qq邮箱给网易邮箱发送带有附件的邮件
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        Properties properties = new Properties();
        properties.setProperty("mail.host", "smtp.qq.com");//设置qq邮件服务器
        properties.setProperty("mail.transport.protocol", "smtp");//邮件发送的协议
        properties.setProperty("mail.smtp.auth", "true");//需要验证用户密码

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

        //使用javaMail发送邮件:
        //1、创建定义整个应用程序所需要的环境信息的session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("发送人邮箱","授权码");
            }
        });
        //开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

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

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

        //4、创建邮件内容,注意需要传递session
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱"));
        //指明邮件的收件人
        mimeMessage.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress("接收人邮箱"));
        //邮件标题
        mimeMessage.setSubject("这是一封带有附件的邮件");
        //邮件的内容

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理,DataHandler:数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:\\java\\MYworkspace\\mail\\src\\main\\resources\\images\\img.jpg"));
        image.setDataHandler(dataHandler);//在body中放入处理图片的数据
        image.setContentID("img.jpg");//给图片设置一个ID

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("你好,网易邮箱,我是qq邮箱,我带图片<img src='cid=img.jsp'>和附件来看你了", "text/html;charset=utf-8");
        
        //附件
        MimeBodyPart enclosure = new MimeBodyPart();
        enclosure.setDataHandler(new DataHandler(new FileDataSource("E:\\java\\MYworkspace\\mail\\src\\main\\resources\\enclosure\\附件.docx")));
        enclosure.setFileName("1.doc");//设置附件的名字

        //描述数据关系,拼接邮件正文内容
        MimeMultipart mm1 = new MimeMultipart();
        mm1.addBodyPart(text);
        mm1.addBodyPart(image);
        mm1.setSubType("related");

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

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


        //设置到消息中,保存修改
        mimeMessage.setContent(totalFile);
        mimeMessage.saveChanges();

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

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

    }
}
5、实战:注册通知邮件
  • 新建一个maven项目

  • 导入所需要的依赖

  • 前端注册页面

<html>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
    用户名:<input type="text" name="username">
    密码:<input type="text" name="password">
    邮箱:<input type="text" name="email">
    <input type="submit" value="注册">

</form>
</body>
</html>
  • 创建一个实体类
public class User {
    private String username;
    private String password;
    private String email;

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

    public User() {
    }

    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 + '\'' +
                '}';
    }
}
  • 使用多线程封装发送邮件
//使用多线程提升用户体验(异步处理)
public class SendMail implements Runnable {
    //用于给用户发邮件的邮箱
    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;
    }

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

            //qq邮箱需要设置SSL加密
            MailSSLSocketFactory sf = null;
            sf = new MailSSLSocketFactory();

            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);

            //使用javaMail发送邮件:
            //1、创建定义整个应用程序所需要的环境信息的session对象
            Session session = Session.getDefaultInstance(properties, 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, from, password);

            //4、创建邮件内容,注意需要传递session
            MimeMessage mimeMessage = new MimeMessage(session);
            //指明邮件的发件人
            mimeMessage.setFrom(new InternetAddress(from));
            //指明邮件的收件人
            mimeMessage.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail()));
            //邮件标题
            mimeMessage.setSubject("注册成功");
            //邮件的内容
            mimeMessage.setContent("你好,恭喜你注册成功!!你的用户名是:"+user.getUsername()+"你的用户密码是:"+user.getPassword(), "text/html;charset=utf-8");

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

            //6、关闭连接
            ts.close();
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
  • Servlet调用多线程实现注册发送短信
@WebServlet("/RegisterServlet.do")
public class RegisterServlet extends HttpServlet {
    @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 sendMail = new SendMail(user);
        Thread thread = new Thread(sendMail);
        thread.start();

        //注册成功跳转
        req.setAttribute("message","注册成功,请查收包含用户名和密码的电子邮件");
        req.getRequestDispatcher("/successful.jsp").forward(req,resp);


    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值