JavaWeb应用(2)邮件发送

1.准备工作

1.邮件发送需要使用到的协议:

在这里插入图片描述

2.以qq邮箱为例
2.1分析邮件发送的过程:以qq发送邮件去网易的过程为例:
  • 发送者通过Smtp协议连接到Smtp服务器,然后发送一封邮件给qq的邮件服务器
  • qq分析发现需要去网易的邮件服务器,通过Smtp协议将邮件转给网易的Smtp服务器
  • 网易将接收到到邮件存储在接收者邮件账号的空间中
  • 接收者通过pop3协议连接到pop3服务器收取邮件

**注意:**有可能收件人和发件人的地址等信息都是正确的,控制台也打印了正确的信息,但是接收者接收不到信息,这是因为有可能收件箱服务器拒收了你发的邮件(比如认为这个邮件是一个垃圾邮件),可能在垃圾箱里能找到。解决方法:重复的邮件内容不要发送多次,或者更换收件箱试试。

2.需要导入的包
  • mail.jar
  • activation.jar

2.发送一封简单邮件

只传输文本类型

1.分析
  • 确保网络的连接正常
  • 创建包含邮件服务器的网络连接信息的Session对象
  • 创建代表邮件内容的Message对象
  • 创建Transport对象,连接服务器,发送Message,关闭连接

在这里插入图片描述

首先打开qq设置,开启smtp,pop3服务

在这里插入图片描述

在这里插入图片描述

2.java代码及分析
package com.mahui.Mail;

import com.sun.mail.util.MailSSLSocketFactory;

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

public class MailTest01 {
    public static void main(String[] args) throws Exception {

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

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

        //使用JavaMail发送邮件的步骤
        //1.创建整个程序所需环境信息的Session
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件的用户名和授权码
                return  new PasswordAuthentication("1048047318@qq.com","kgvwwleafntybdga");
            }
        });

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

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

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

        //4.创建Message对象
        Message message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("1048047318@qq.com"));
        //指明收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("785280317@qq.com"));
        //邮件的标题
        message.setSubject("你好啊");
        //邮件的文本内容
        message.setContent("你好啊","text/html;charset=UTF-8");

        //5.发送Message对象
        transport.sendMessage(message,message.getAllRecipients());
        //关闭流
        transport.close();
    }
}

3.可以发送文本、图片、附件的邮件

MIME:多用途互联网邮件扩展类型;

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

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

multipart有三个属性:

  1. mixed 附件、内嵌资源、纯文本、超文本正文
  2. related 内嵌资源、纯文本、超文本正文
  3. alternative 纯文本、超文本正文
package com.mahui.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;

public class MailTest02 {

    public static void main(String[] args) throws Exception {

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

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

        //使用JavaMail发送邮件的步骤
        //1.创建整个程序所需环境信息的Session
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件的用户名和授权码
                return  new PasswordAuthentication("1048047318@qq.com","kgvwwleafntybdga");
            }
        });

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

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

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

        //4.创建Message对象
        Message message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("1048047318@qq.com"));
        //指明收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("785280317@qq.com"));
        //邮件的标题
        message.setSubject("你好");
        //========================================================
        //准备照片内容
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理.... DataHandler:数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:\\IntelliJIDEA\\fuxilianxi\\功能实现\\src\\5.jpg"));
        //在body中放入要处理的图片数据
        image.setDataHandler(dataHandler);
        //给图片设置一个ID,我们在后面可以使用
        image.setContentID("image.jsp");

        //准备邮件正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一个有图片的邮件<img src=‘cid:image.jpg’>","text/html;charset=UTF-8");
        
        //准备附件数据
        MimeBodyPart enclosure  = new MimeBodyPart();
        //附件经过数据处理
        DataHandler dataHandler1 = new DataHandler(new FileDataSource("E:\\IntelliJIDEA\\fuxilianxi\\功能实现\\src\\JavaWeb笔记.md"));
        enclosure.setDataHandler(dataHandler1);
        //设置附件的ID
        enclosure.setFileName("JavaWeb笔记.md");


        //描述数据关系
        MimeMultipart mimeMultipart = new MimeMultipart();
        //添加图片
        mimeMultipart.addBodyPart(image);
        //添加文本
        mimeMultipart.addBodyPart(text);
        //添加附件
        mimeMultipart.addBodyPart(enclosure);
        mimeMultipart.setSubType("mixed");
        //========================================================
        //把编辑好的邮件放入message中
        message.setContent(mimeMultipart);
        //设置保存修改
        message.saveChanges();


        //5.发送Message对象
        transport.sendMessage(message,message.getAllRecipients());
        //关闭流
        transport.close();
    }
}

4.网站注册发送邮件

发送邮件使用多线程,为了用户体验。

1.index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/email.do" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    邮箱:<input type="email" name="email"><br>
    <input type="submit" > <input type="reset">
  </form>
  </body>E
</html>
2.User类
package com.mahui.pojo;

import java.io.Serializable;

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;
    }

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

3.sendEmail工具类
package com.mahui.utils;

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

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

public class sendEmail extends Thread {
    //发送邮件的服务器地址
    private String host="smtp.qq.com";
    //发送邮件的地址
    private String sendFrom="1048047318@qq.com";
    //发送邮件的用户名
    private String username="1048047318@qq.com";
    //发送邮件的授权码
    private String password="kgvwwleafntybdga";

    //无参构造实例化user
   private User user;
    public sendEmail(User user){
       this.user=user;
    }

    public void run() {
        System.out.println(user.getEmail()+user.getUsername());

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

        //关于qq邮箱,还要设置SSL加密
        MailSSLSocketFactory mailSSLSocketFactory = null;
        try {
            mailSSLSocketFactory = new MailSSLSocketFactory();
            mailSSLSocketFactory.setTrustAllHosts(true);
            properties.put("mail.host.ssl.enable","true");
            properties.put("mail.smtp.ssl.socketFactory",mailSSLSocketFactory);

            //使用JavaMail发送邮件的步骤
            //1.创建整个程序所需环境信息的Session
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件的用户名和授权码
                    return  new PasswordAuthentication(username,password);
                }
            });

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

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

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

            //4.创建Message对象
            Message message = new MimeMessage(session);
            //指明邮件的发件人
            message.setFrom(new InternetAddress(sendFrom));
            //指明收件人
            message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));
            //邮件的标题
            message.setSubject("网站注册");
            //========================================================
            message.setContent("你的用户名:"+user.getUsername()+"密码:"+user.getPassword()+"邮箱"+user.getEmail(),"text/html;charset=UTF-8");
            //========================================================



            //5.发送Message对象
            transport.sendMessage(message,message.getAllRecipients());
            //关闭流
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

4.emailServlet
package com.mahui.servlet;

import com.mahui.pojo.User;
import com.mahui.utils.sendEmail;

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 emailServlet 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);

        //发送邮件
        sendEmail sendEmail = new sendEmail(user);
        //使用多线程发送邮件
        sendEmail.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);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值