前言

基于 springboot3 + mybatis-plus + lombok + nacos配置中心 完成企业微信给别人发邮箱验证码 或 发邮箱 案例

一、微信企业邮箱

添加以下依赖:

<!-- Spring Boot 邮件支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

nacos 配置

# 企业微信邮箱SMTP服务器
wechat:
  email:
    host: smtp.exmail.qq.com  
    port: 465
    username: zhuguangbo@xxx.cn
    password: your-auth-code
    from: zhuguangbo@xxx.cn
    timeout: 5000
    ssl-enable: true

配置类

package com.zgb.app.core.config.email;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * 邮箱配置类,读取Nacos中的配置
 * @author zhuguanbo
 * @version 1.0.0
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "wechat.email")
public class EmailConfig {

    /** 企业微信邮箱服务器地址 */
    private String host;

    /** 企业微信邮箱服务器端口 */
    private Integer port;

    /** 企业微信邮箱账号 */
    private String username;

    /** 企业微信邮箱密码/授权码 */
    private String password;

    /** 邮箱发送者 */
    private String from;

    /** 邮箱发送超时时间(毫秒) */
    private Integer timeout;

    /** 是否启用SSL */
    private Boolean sslEnable;
}

接口层

package com.zgb.app.bese.service;

import java.util.concurrent.TimeUnit;

/**
 * 邮箱服务接口
 */
public interface EmailService {

    /**
     * 发送验证码到指定邮箱
     * @param email 目标邮箱地址
     * @param expire 过期时间
     * @param timeUnit 时间单位
     * @return 发送结果
     */
    boolean sendCaptcha(String email , long expire, TimeUnit timeUnit);

}

接口实现层

package com.zgb.app.bese.service.impl;

import com.zgb.app.bese.service.EmailService;
import com.zgb.app.core.config.email.EmailConfig;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Properties;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * 邮箱服务实现类
 */
@Service
public class EmailServiceImpl implements EmailService {

    @Resource
    private EmailConfig emailConfig;

    /**
     * 生成一个5位数的随机整数
     * @return 生成的5位随机整数
     */
    public static String generateCaptcha() {
        Random random = new Random();
        int min = 10000;
        int max = 99999;
        return min + random.nextInt(max - min + 1) + "";
    }

    /**
     * 创建JavaMailSender实例
     */
    private JavaMailSender createMailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost(emailConfig.getHost());
        sender.setPort(emailConfig.getPort());
        sender.setUsername(emailConfig.getUsername());
        sender.setPassword(emailConfig.getPassword());
        sender.setDefaultEncoding("UTF-8");

        Properties props = sender.getJavaMailProperties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.timeout", String.valueOf(emailConfig.getTimeout()));
        props.setProperty("mail.smtp.ssl.enable", String.valueOf(emailConfig.getSslEnable()));

        // 补充SSL配置(针对465端口)
        if (emailConfig.getSslEnable()) {
            props.setProperty("mail.smtp.ssl.enable", "true");
            props.setProperty("mail.smtp.ssl.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.ssl.checkserveridentity", "true");
        }

        // 开启调试模式,打印与服务器的交互细节
        sender.setJavaMailProperties(props);
        props.setProperty("mail.debug", "true"); // 关键:开启调试日志

        return sender;
    }


    /**
     * 发送验证码到指定邮箱
     * @param email 目标邮箱地址
     * @param expire 过期时间
     * @param timeUnit 时间单位
     * @return 发送结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean sendCaptcha(String email,  long expire, TimeUnit timeUnit) {
        // 生成验证码
        String code = generateCaptcha();
        // 发送邮件
        try {
            JavaMailSender mailSender = createMailSender();

            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(emailConfig.getFrom());
            message.setTo(email);
            message.setSubject("【深圳xxxxx有限公司】验证码");
            message.setText(String.format("您的验证码是: %s,有效期为1分钟。请勿向他人泄露。",code));

            mailSender.send(message);
            return true;
        } catch (Exception e) {
            // 记录日志
            e.printStackTrace();
            return false;
        }
    }

}

企业微信邮箱授权码的获取步骤:

  1. 登录企业微信邮箱
    访问企业微信邮箱官网(https://exmail.qq.com/),使用你的企业邮箱账号和密码登录。

在这里插入图片描述

终极测试:用最小代码单独验证

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

public class MailTest {
    public static void main(String[] args) {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost("smtp.exmail.qq.com");
        sender.setPort(465);
        sender.setUsername("zhuguangbo@sztyai.cn"); // 你的邮箱
        sender.setPassword("这里填新生成的授权码"); // 务必重新生成
        sender.setDefaultEncoding("UTF-8");

        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.timeout", "5000");
        props.setProperty("mail.smtp.ssl.enable", "true");
        props.setProperty("mail.smtp.ssl.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.debug", "true"); // 开启调试
        sender.setJavaMailProperties(props);

        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("zhuguangbo@sztyai.cn"); // 必须与username一致
        message.setTo("你的个人邮箱@qq.com"); // 接收测试的邮箱
        message.setSubject("测试邮件");
        message.setText("测试内容");

        try {
            sender.send(message);
            System.out.println("发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二、QQ邮箱

最小代码测试示例

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

public class QQMailTest {
    public static void main(String[] args) {
        // 1. 配置邮件发送器
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        sender.setHost("smtp.qq.com"); // QQ邮箱SMTP服务器
        sender.setPort(465); // SSL端口
        sender.setUsername("你的QQ邮箱@qq.com"); // 例如:123456@qq.com
        sender.setPassword("你的授权码"); // 不是QQ密码,是SMTP授权码
        sender.setDefaultEncoding("UTF-8");

        // 2. 配置SSL和邮件属性
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtps"); // QQ邮箱推荐用smtps协议
        props.setProperty("mail.smtps.auth", "true"); // 开启认证
        props.setProperty("mail.smtps.ssl.enable", "true"); // 开启SSL
        props.setProperty("mail.smtps.ssl.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.debug", "true"); // 开启调试日志
        sender.setJavaMailProperties(props);

        // 3. 创建邮件消息
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("你的QQ邮箱@qq.com"); // 必须与username一致
        message.setTo("接收邮箱@example.com"); // 接收测试的邮箱
        message.setSubject("QQ邮箱SMTP测试");
        message.setText("这是一封通过SMTP发送的测试邮件");

        // 4. 发送邮件
        try {
            sender.send(message);
            System.out.println("邮件发送成功!");
        } catch (Exception e) {
            System.err.println("发送失败:" + e.getMessage());
            e.printStackTrace();
        }
    }
}

nacos 配置

# QQ邮箱配置
spring:
  mail:
    # SMTP服务器地址(QQ邮箱固定为smtp.qq.com)
    host: smtp.qq.com
    # 端口(SSL加密端口465,非加密25,推荐465)
    port: 465
    # 发送者邮箱(你的QQ邮箱)
    username: 123456@qq.com
    # SMTP授权码(非QQ密码)
    password: xxxxxxxxxxxxxxxx
    # 发件人地址(必须与username一致)
    from: 123456@qq.com
    # 编码格式
    default-encoding: UTF-8
    # 超时设置
    properties:
      mail:
        smtp:
          timeout: 5000
          auth: true
          starttls:
            enable: false
        # SSL配置(针对465端口)
        smtps:
          ssl:
            enable: true
            socketFactory:
              class: javax.net.ssl.SSLSocketFactory
        # 调试模式(生产环境关闭)
        debug: false

授权码获取方式

在这里插入图片描述
在这里插入图片描述


如果文章对你有一点点帮助,欢迎【点赞、留言、+ 关注】
您的关注是我持续创作的重要动力!有问题欢迎随时交流!多一个朋友多一条路!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐