java 阿里云邮箱发送邮件并判断验证码是否过期

一. 发送邮件

链接: java给各个邮箱发邮件,不包括阿里邮箱发送邮件  https://www.cnblogs.com/java-h/p/11344331.html

参考链接:阿里云邮箱发送邮件 https://www.cnblogs.com/lccsdncnblogs/p/15793357.html

总体流程:首先需要一个企业邮箱,及这个邮箱的密码。相当于发送者。由这个邮箱可以给任意邮箱发送邮件。

如使用QQ邮箱当作发送者,则还需要设置鉴权码。具体百度

pom.xml 引入 mail 发送邮件的依赖 jdk使用1.8.0.121 tomcat使用8.5.59

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

注意:更换电脑后,jdk使用1.8.0333,tomcat使用8.5.82

相同的代码以及pom,会报No appropriate protocol (protocol is disabled or cipher suites are inappropriate)这个错误。查了网上很多方法,去掉TLSv1,TLSv1.1配置之类的,更换发送方法等都会报错。

解决办法:经由大神指导,降低了pom中mail的版本,把1.4.7的版本降为了1.4。就可以正常发送邮件了。

代码实现:

package com.systron.utils;

import org.apache.commons.lang.StringUtils;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.security.Security;
import java.util.Properties;

/**
 * 使用阿里云邮箱发送邮件工具类
 * 阿里云邮箱为联想企业邮箱
 */
public class SendMailUtil {

    public static final String ALIDM_SMTP_HOST = "smtp.qiye.aliyun.com";

    public static final String ALIDM_SMTP_PORT = "25";


    /**
     * 发送邮件
     * @param sendAddress  发件人地址
     * @param sendPassword 发件人密码
     * @param host         协议
     * @param port         端口
     * @param subject      标题
     * @param content      内容
     * @param filePath     附件地址
     * @param CC           抄送人
     * @throws Exception
     * @throws AddressException
     */
    public static void sendMail(String sendAddress, String sendPassword, String host, String port, String subject, String content, String internetAddress, String filePath, String CC) throws AddressException, Exception {
        //设置SSL连接、邮件环境
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
        Properties props = System.getProperties();
        props.setProperty("mail.smtp.host", host);
        props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", port);//设置端口
        props.setProperty("mail.debug", "true");//启用调试
        props.setProperty("mail.smtp.socketFactory.port", "465");
        props.setProperty("mail.smtp.auth", "true");
        //建立邮件会话
        Session session = Session.getDefaultInstance(props, new Authenticator() {   //身份认证
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(sendAddress, sendPassword);//发件人账号、密码
            }
        });
        //建立邮件对象
        MimeMessage message = new MimeMessage(session);
        //设置邮件的发件人、收件人、主题
        //附带发件人名字
        //  message.setFrom(new InternetAddress("from_mail@qq.com", "optional-personal"));
        message.setFrom(new InternetAddress(sendAddress));//发件人账号
        message.setRecipients(Message.RecipientType.TO, internetAddress);//收件人账号

        //标题
        message.setSubject(subject);//邮件标题

        //内容
        Multipart multipart = new MimeMultipart();
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(content, "text/html;charset=utf-8");//邮件内容
        multipart.addBodyPart(contentPart);

        //附件部分
        if (StringUtils.isNotEmpty(filePath)) {
            BodyPart attachPart = new MimeBodyPart();
            FileDataSource fileDataSource = new FileDataSource(filePath);//附件地址
            attachPart.setDataHandler(new DataHandler(fileDataSource));
            attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
            multipart.addBodyPart(attachPart);
        }

        message.setContent(multipart);

        //抄送地址
        if (StringUtils.isNotBlank(CC)) {
            InternetAddress[] internetAddressCC = new InternetAddress().parse(CC);
            message.setRecipients(Message.RecipientType.CC, internetAddressCC);
        }

        //发送邮件
        Transport.send(message);
    }

    // 测试
    public static void main(String[] args) {
//        CacheConfigUtil.getProperty("ali.email.name");
//        CacheConfigUtil.getProperty("ali.email.password");

        try {
            sendMail("发送者邮箱", "发送者邮箱密码", ALIDM_SMTP_HOST, ALIDM_SMTP_PORT, "邮件标题",
                    "邮件内容", "接收者邮箱", null, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二. 判断邮件中验证码是否过期

步骤一:给接收人发送邮件,邮件中包含6位验证码。将验证码存入缓存,10分钟过期

步骤二:判断用户输入的验证码和缓存中的验证码是否一致,一致则验证通过,不一致则提示验证码过期

import org.apache.commons.lang.StringUtils;
import org.springframework.ui.Model;
import org.systron.utils.SendMailUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Timer;
import java.util.TimerTask;

public class Test {

    /**
     * 步骤一:给接收人发送邮件,邮件中包含6位验证码。将验证码存入缓存,10分钟过期
     * @param request
     * @param response
     * @param model
     */
    public void sendCode(HttpServletRequest request, HttpServletResponse response, Model model) {
        String userEmail = "XXX@qq.com"; // 接收人邮箱

        String random = "123456"; // 6位验证码
        String title = "邮件标题";
        String content = "邮件内容";
        try {
            SendMailUtil.sendMail(title, content, userEmail, null, null);

            try {
                final HttpSession httpSession = request.getSession();
                httpSession.setAttribute(userEmail, random); // 将接收人邮箱和验证码存入缓存

                final Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        httpSession.removeAttribute(userEmail);
                        timer.cancel();
                    }
                }, 10 * 60 * 1000); // 10分钟后过期  10 * 60 * 1000
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 步骤二:判断用户输入的验证码和缓存中的验证码是否一致,一致则验证通过,不一致则提示验证码过期
     * @param request
     * @param response
     * @param model
     */
    public void validateCodeApi(HttpServletRequest request, HttpServletResponse response, Model model) {
        String userEmail = request.getParameter("userEmail");
        String validateCode = request.getParameter("validateCode");

        String code = (String) request.getSession().getAttribute(userEmail); // 根据用户邮箱取得session中的验证码
        if (StringUtils.isNotEmpty(code)) {
            if (!code.equals(validateCode)) { // 验证用户输入的验证码和缓存中的验证码是否一致
                // 不一致,返回验证码过期信息
                System.out.println("验证码已过期");
            }
        } else {
            System.out.println("验证码已过期");
        }
    }
}

 

posted @ 2022-04-11 17:19  哎哟喂~  阅读(327)  评论(0编辑  收藏  举报