本文介绍下java实现邮件的发送,意在网站用户评论时能够及时通知站长和用户评论被回复后能够及时通知用户。
下文介绍下具体实现。
java实现
首先引入springboot的邮箱依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>
配置邮箱参数,这里以qq邮箱作为示例
spring:mail:host: smtp.qq.com #qq邮箱username:#用户名,填qq邮箱地址。例如[email protected]:#qq邮箱授权码,网上搜索怎么获得
此时就差不多了,接下来实现邮箱工具类
@ComponentpublicclassMailUtil{@Value("${spring.mail.username}")privateString from;//这是发送人@AutowiredJavaMailSender javaMailSender;publicResponseDtosendMail(Stringto,String subject,String content){SimpleMailMessage simpleMailMessage =newSimpleMailMessage();
simpleMailMessage.setFrom(from);
simpleMailMessage.setTo(to);
simpleMailMessage.setSubject(subject);
simpleMailMessage.setText(content);
javaMailSender.send(simpleMailMessage);returnResponseDto.Ok();}}
此时调用MailUtil里的sendMail方法就能实现发送邮件了。
实践中发现每次都需要等待邮件发送成功后接口才会返回,不符合我们的实际需求。故需在发送邮件时开辟一个新线程,即可满足我们的需求。
为了减少大规模请求下创建线程的开销,引入线程池来处理发送邮件事件。
线程池
使用**@Configuration注解保证初始化线程池只有一次,使用@Bean注解在程序启动时就注入到IOC容器**内,这样可以保证程序启动后就会初始化线程池。
@Configuration@Slf4jpublicclassThreadPool{privateInteger maxPoolSize =Runtime.getRuntime().availableProcessors()*5;privateInteger corePoolSize =5;@BeanpublicExecutorServicebuildThreadPool(){
log.info("开始创建线程池");ExecutorService pool =newThreadPoolExecutor(corePoolSize, maxPoolSize,60L,TimeUnit.SECONDS,newArrayBlockingQueue<Runnable>(100));return pool;}}
ThreadPoolExecutor感兴趣的可以自己看,在此不过多介绍。
现在就可以使用线程来发送邮件了。
threadPool.buildThreadPool().submit(newRunnable(){@Overridepublicvoidrun(){Stringto,subject =null;if(comment.getParentId()==-1){to= mail;
subject ="有人在你的博客评论了";}else{to= commentService.getById(comment.getParentId()).getUserEmail();
subject ="有人回复了你的评论";}
mailUtil.sendMail(to,subject,"有人回复了你的评论,点击链接跳转到评论回复页面,https://xiaoliu.life/p/"+comment.getBlogId());}});
最后实现效果:
版权归原作者 爱加班的小刘 所有, 如有侵权,请联系我们删除。