Java实现邮箱验证码(以QQ邮箱为例)

前期准备:

1.登录需要发送邮件的QQ邮箱,找到设置项

2.然后在账户栏下,找到(POP3/SMTP)服务协议

3.点击开启这个服务,就会得到一个授权码,这个需要保存好,相当于在程序运行过程中登录发件人邮箱的一个动态密码。

简述POP3与SMTP是什么和其有什么区别?

POP3:(Post Office Protocol 3),邮局协议的第三版本,规定了用户从个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。特点是接收邮件的协议

SMTP:(Simple Mail Transfer Protocol),简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地。特点是发送邮件的协议

代码实现QQ邮箱发送验证码

先看一下这个图片,了解一下邮件发送的架构(本篇文章只说明发送文件)

主要使用到的类

Properties类:作用是创建Session对象,需要封装邮件传输使用的协议(mail.transport.protocol = smtp),发件人的SMTP服务器地址(mail,smtp.host =  smtp.qq.com ),传输的请求认证(mail.smtp.auth = true )

Session类:

  • 创建:通过Session类的静态方法 public static Session getDefaultInstance(java.util.Properties props)(还有其他的几个方法,想了解查看JavaEE的API文档即可)
  • 获取Transport对象:public Transport getTransport()
  • 利用Session对象创建邮件对象:public MimeMessage(Session session)(MimeMessage的构造器)
  • public void setDebug(boolean debug) 查看debug信息

MimeMessage(Message子类):

  • 创建:上面已说,利用Session对象创建
  • 设置发件人:public void setFrom(Address address)
  • 设置收件人:public void setRecipient(Message.RecipientType type, Address address)
  • 设置邮件主题:public void setSubject(String subject, String charset)
  • 设置邮件正文:public void setContent(Object o, String type)
  • 设置发送时间:public void setSentDate(java.util.Date d)
  • 设置保存:public void saveChanges()

(当然API里面还封装了邮件的正文容器,但本文章不详细说明了。)

InternetAddress(Address子类):

  • public InternetAddress(String address)  创建对象
  • public InternetAddress(String address, String personal, String charset)  创建对象

首先给大家理清一下思路。

1.导入相关的jar包,主要的jar包为mail.jar 和 activation.jar

链接:https://pan.baidu.com/s/1wfPxmAVr2_a_k6kcY7KOFA 
提取码:hglr 

2.代码实现如下,包含步骤:

package com.chengxi.mail;


import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;

public class MailUtils {

    public static void sendMassage(String from, String to) {
        //加载Properties配置文件
        InputStream inputStream = MailUtils.class.getClassLoader().getResourceAsStream("mail.properties");
        Properties properties = new Properties();

        try {
            //把配置文件的内容加载到内存
            properties.load(inputStream);

            //获取Session对象
            Session session = Session.getDefaultInstance(properties);
            session.setDebug(true);

            //创建邮件对象
            MimeMessage message = MailUtils.createMessage(session, from, to, CheckCode.getCheckCode());

            //创建Transport对象
            Transport transport = session.getTransport();

            //获取连接到邮件服务器
            transport.connect("[email protected]" , "授权码");

            //发送信息
            transport.sendMessage(message, message.getAllRecipients());

            //关闭连接
            transport.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }


    }


    /**
     * 单独封装邮件对象
     * @param session 利用Session对象创建邮件对象
     * @param from 发件人的邮箱地址
     * @param to 收件人的邮箱地址
     * @param checkCode 验证码
     * @return 邮件对象
     */
    public static MimeMessage createMessage(Session session, String from, String to, String checkCode) {
        //创建邮件对象
        MimeMessage mimeMessage = new MimeMessage(session);

        try {
            //设置发件人
            mimeMessage.setFrom(new InternetAddress(from));

            //设置收件人
            //这个邮件可以发给多个收件人,因此有关get收件人的方法可以在发送时调用
            mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));

            //设置邮件主题
            mimeMessage.setSubject("验证码检验", "utf-8");

            //设置正文
            mimeMessage.setContent(" 验证码为" + checkCode, "text/html;charset=utf-8");

            //设置发送时间
            mimeMessage.setSentDate(new Date());

            //保存改变
            mimeMessage.saveChanges();

            return mimeMessage;
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return  null ;
    }

}

其mail.properties文件如下

#设置邮箱服务器
mail.smtp.host=smtp.qq.com
#设置传输协议
mail.transport.protocol=smtp
#设置传输请求认知
mail.smtp.auth=true

生产验证码

package com.chengxi.mail;

import java.util.Random;

public class CheckCode {

    public static String getCheckCode() {
        Random random = new Random();

        String checkCode = "";

        for (int i = 0; i < 6; i++) {
            checkCode += random.nextInt(10) ;
        }
        return  checkCode ;
    }
}

发布了55 篇原创文章 · 获赞 4 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/weixin_45062761/article/details/104789017