Java秒杀系统实战系列~开发通用的发送邮件服务
摘要:
本篇博文是“Java秒杀系统实战系列文章”的第九篇,在这篇文章中我们将继续完善秒杀系统中的核心处理逻辑,即“用户秒杀~抢单”的业务逻辑!本文我们将基于JavaMail服务,开发一个通用的发送邮件服务,用于发送邮件通知消息,并与上一篇章中已经实现的RabbitMQ异步发送消息的逻辑进行整合,彻底实现“用户秒杀成功后,异步发送邮件通知消息给到用户邮箱,告知用户尽快进行付款”的功能!
内容:
对于发送邮件服务,相信各位小伙伴并不陌生,本篇博文我们将开发一个通用的发送邮件服务,用于“用户秒杀成功之后异步发送邮件消息给到用户”。
(1)同样的道理,首先我们需要加入发送邮件服务的依赖,其依赖的版本号跟SpringBoot的版本号一直,为1.5.7.RELEASE,如下所示:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>${spring-boot.version}</version> </dependency>
紧接着,我们需要在application.properties配置文件中加入“发送邮件服务”所需要的额外的支持配置信息:
#发送邮件配置 spring.mail.host=smtp.qq.com spring.mail.username=1974544863@qq.com spring.mail.password=cmtvsjvhonkjdaje spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true mail.send.from=1974544863@qq.com mail.kill.item.success.subject=商品抢购成功 mail.kill.item.success.content=您好,您已成功抢购到商品: <strong style="color: red">%s</strong> ,复制该链接并在浏览器采用新的页面打开,即可查看抢购详情:${system.domain.url}/kill/record/detail/%s,并请您在1个小时内完成订单的支付,超时将失效该订单哦!祝你生活愉快!
在本秒杀系统中,发送邮件的服务我们是采用 QQ邮箱 作为主邮箱账号,相应的SMTP服务器也是采用QQ邮箱的!其中,spring.mail.password 指的是在QQ邮箱后台开通POP3/SMTP服务 时腾讯官方给的“密钥”(授权码),在这里,Debug就贡献了上面那个密钥~授权码 给各位使用了,而真正在企业生产环境中,其实是需要去申请一个主邮箱账号的,至于如何申请,在这里就不赘述了!
(2)接下来,我们就可以大显伸手一番了!我们在MailService中开发了两种发送邮件的功能,一种发送简单文本的功能(即纯文字的、很死板、高冷风的那种),另一种是发送带HTML标签的花哨文本的功能(即带样式的、比较俏皮的、有温度的那种),如下所示:
//通用的发送邮件服务 @Service @EnableAsync public class MailService { private static final Logger log= LoggerFactory.getLogger(MailService.class); @Autowired private JavaMailSender mailSender; @Autowired private Environment env; //发送简单文本文件 @Async public void sendSimpleEmail(final MailDto dto){ try { SimpleMailMessage message=new SimpleMailMessage(); message.setFrom(env.getProperty("mail.send.from")); message.setTo(dto.getTos()); message.setSubject(dto.getSubject()); message.setText(dto.getContent()); mailSender.send(message); log.info("发送简单文本文件-发送成功!"); }catch (Exception e){ log.error("发送简单文本文件-发生异常: ",e.fillInStackTrace()); } } //发送花哨邮件 @Async public void sendHTMLMail(final MailDto dto){ try { MimeMessage message=mailSender.createMimeMessage(); MimeMessageHelper messageHelper=new MimeMessageHelper(message,true,"utf-8"); messageHelper.setFrom(env.getProperty("mail.send.from")); messageHelper.setTo(dto.getTos()); messageHelper.setSubject(dto.getSubject()); messageHelper.setText(dto.getContent(),true); mailSender.send(message); log.info("发送花哨邮件-发送成功!"); }catch (Exception e){ log.error("发送花哨邮件-发生异常: ",e.fillInStackTrace()); } } }
其中,MailDto类主要统一封装了在发送邮件时所需要的字段信息,比如接收人、邮件标题、邮件内容等等(提现了面向对象的重要特性)!其源代码如下所示:
/**统一封装了在发送邮件时所需要的字段信息 * @Author:debug (SteadyJack) * @Date: 2019/6/22 10:11 **/ @Data @ToString @AllArgsConstructor @NoArgsConstructor public class MailDto implements Serializable{ //邮件主题 private String subject; //邮件内容 private String content; //接收人 private String[] tos; }
(3)最后是在“RabbitMQ通用的消息接收服务类” RabbitReceiverService 的接收消息逻辑中整合进“发送邮件服务”的逻辑,如下所示:
@Autowired private MailService mailService; @Autowired private Environment env; /** * 秒杀异步邮件通知-接收消息 */ @RabbitListener(queues = {"${mq.kill.item.success.email.queue}"},containerFactory = "singleListenerContainer") public void consumeEmailMsg(KillSuccessUserInfo info){ try { log.info("秒杀异步邮件通知-接收消息:{}",info); //TODO:真正的发送邮件.... //简单文本 //MailDto dto=new MailDto(env.getProperty("mail.kill.item.success.subject"),"这是测试内容",new String[]{info.getEmail()}); //mailService.sendSimpleEmail(dto); //花哨文本 final String content=String.format(env.getProperty("mail.kill.item.success.content"),info.getItemName(),info.getCode()); MailDto dto=new MailDto(env.getProperty("mail.kill.item.success.subject"),content,new String[]{info.getEmail()}); mailService.sendHTMLMail(dto); }catch (Exception e){ log.error("秒杀异步邮件通知-接收消息-发生异常:",e.fillInStackTrace()); } }
(4)至此,关于通用的发送邮件服务的代码实战,我们就介绍到这里了,接下来我们进入测试环节。点击“抢购”,如果用户秒杀成功,系统后端会在数据库录入一笔秒杀成功后的订单,同时user表中“邮箱字段值”对应的邮箱会受到一封邮件,如下图所示:
好了,欢乐的撸码时光总是短暂的,本篇文章我们就介绍到这里了!下篇博文我们将继续我们的“秒杀系统实战”之旅!
补充:
1、由于相应的博客的更新可能并不会很快,故而如果有想要快速入门以及实战整套系统的,可以阅读: Java商城秒杀系统的设计与实战视频教程(SpringBoot版)
2、目前,这一秒杀系统的整体构建与代码实战已经全部完成了,完整的源代码数据库地址可以来这里下载:https://gitee.com/steadyjack/SpringBoot-SecondKill

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
NoSuchMethodError 常见原因及解决方法
导读 『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方式来打造稳定性领域的知识库,欢迎您的加入。 @GitHub :https://github.com/StabilityMan/StabilityGuide @钉钉群: 运行时抛出 NoSuchMethodError 的根本原因是什么? 在实际生产系统中,我们主要关注运行时抛出的 NoSuchMethodError 错误,该错误轻则导致程序异常终止,严重时甚至会产生不可预知的程序结果,比如支付服务执行异常,实际支付已完成,却向用户返回支付失败。 运行时抛出 NoSuchMethodError 错误的根本原因就是: 应用程序直接或间接依赖了同一个类
- 下一篇
[Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard
在之前的18次文章中,我们实现了广告系统的广告投放,广告检索业务功能,中间使用到了 服务发现Eureka,服务调用Feign,网关路由Zuul以及错误熔断Hystrix等Spring Cloud组件。简单调用关系: 但是系统往往都会报错,我们之前定义了一些容错类和方法,但是只是在控制台可以看到错误信息,我们想要统计一些数据,怎么才能更直观的看到我们的服务调用情况呢,接下来,和大家讨论一个新的熔断监控组件Hystrix Dashboard,顾名思义,从名字上我们就能看出来,它是监控的图形化界面。 Hystrix 在服务中的使用 结合openfeign使用 在我们实际的项目当中,使用的最多的就是结合FeignClient#fallback和Hystrix一起来实现熔断,我们看一下我们在mscx-ad-feign-sdk中的实现。 @FeignClient(value = "mscx-ad-sponsor", fallback = SponsorClientHystrix.class) public interface ISponsorFeignClient { @RequestMappin...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池