厚积薄发打卡Day89: Springboot整合JavaMailSender实例

本文介绍了如何在Spring Boot应用中利用JavaMailSender实现异步发送告警邮件。背景是在签到业务中,当员工位于中高风险地区时,系统需要向人事发送邮件通知。为避免发送邮件影响签到执行时间,采用了异步执行。详细内容包括邮件配置、依赖添加、SMTP服务器设置、线程池配置以及告警邮件的业务实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

在某个业务执行签到时,会根据疫情风险等级判断是否发送告警邮件:如果员工的签到地点为中高风险地区则需要发送邮件给对应人事进行告警。

在签到过程中的业务逻辑相对耗时,且需要保存数据同步执行;如果发送邮件再做成同步执行的,势必导致签到执行时间过长,影响用户体验。

而发送邮件跟保存签到数据没有直接关联,所以使用异步执行能提高用户体验。

参考:

  1. spring-boot @Async 的使用、自定义Executor的配置方法
  2. SpringBoot整合JavaMailSender实现邮件发送

整合:

  1. 官方文档: Interface JavaMailSender

  2. maven依赖:编辑pom.xml文件,添加依赖库

    <dependency>
    	<groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    
  3. 设置SMTP服务器信息

    发送邮件是通过SMTP服务器来完成的,所以我们要配置一下SMTP服务器的连接信息,以163邮箱为例:

    spring:
    	……
    	mail:
        	default-encoding: UTF-8
        	host: smtp.163.com
        	username: *************@163.com
        	password: 此处是密码
    
  4. 接下来我们把系统内的常用邮箱声明一下,以后会用到这些邮箱往外发送邮件,或者给这些邮箱发送内部邮件。例如,员工签到地点是疫情高风险地区,那么就应该向HR邮箱发送邮件,告知人事总监有员工需要隔离。

    	email:
        	system: *********@163.com
        	hr: **********@qq.com
    

实例:

  1. 开启异步多线程执行:

    在主类上面开启@EnableAsync注解

  2. 创建ThreadPoolConfig类,声明Java线程池(看具体服务器配置)

    @Configuration
    public class ThreadPoolConfig {
        @Bean("AsyncTaskExecutor")
        public AsyncTaskExecutor taskExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // 设置核心线程数
            executor.setCorePoolSize(8);
            // 设置最大线程数
            executor.setMaxPoolSize(16);
            // 设置队列容量
            executor.setQueueCapacity(32);
            // 设置线程活跃时间(秒)
            executor.setKeepAliveSeconds(60);
            // 设置默认线程名称
            executor.setThreadNamePrefix("task-");
            // 设置拒绝策略
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            executor.initialize();
            return executor;
        }
    }
    
  3. 创建EmailTask类,定义线程任务

    @Component
    @Scope("prototype")
    public class EmailTask implements Serializable {
        @Autowired
        private JavaMailSender javaMailSender;
    
        @Value("${emos.email.system}")
        private String mailbox;
    
        @Async
        public void sendAsync(SimpleMailMessage message){
            message.setFrom(mailbox);
            javaMailSender.send(message);
        }
    }
    
  4. 在业务层中实现发送告警邮件:

    @Value("${emos.email.hr}")
    private String hrEmail;
    
    @Autowired
    private EmailTask emailTask;
    
    HashMap<String, String> map = userDao.searchNameAndDept(userId);
    String name = map.get("name");
    String deptName = map.get("dept_name");
    deptName = deptName != null ? deptName : "";
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo(hrEmail);
    message.setSubject("员工" + name + "身处高风险疫情地区警告");
    message.setText(deptName + "员工" + name + "," + DateUtil.format(new Date(), "yyyy年MM月dd日") + "处于" + address + ",属于新冠疫情高风险地区,请及时与该员工联系,核实情况!");
    emailTask.sendAsync(message);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值