java邮件服务系统开发的_Java秒杀系统实战系列~开发通用的发送邮件服务

news/2023/9/22 20:22:32

摘要:

本篇博文是“Java秒杀系统实战系列文章”的第九篇,在这篇文章中我们将继续完善秒杀系统中的核心处理逻辑,即“用户秒杀~抢单”的业务逻辑!本文我们将基于JavaMail服务,开发一个通用的发送邮件服务,用于发送邮件通知消息,并与上一篇章中已经实现的RabbitMQ异步发送消息的逻辑进行整合,彻底实现“用户秒杀成功后,异步发送邮件通知消息给到用户邮箱,告知用户尽快进行付款”的功能!

内容:

对于发送邮件服务,相信各位小伙伴并不陌生,本篇博文我们将开发一个通用的发送邮件服务,用于“用户秒杀成功之后异步发送邮件消息给到用户”。

(1)同样的道理,首先我们需要加入发送邮件服务的依赖,其依赖的版本号跟SpringBoot的版本号一直,为1.5.7.RELEASE,如下所示:

org.springframework.boot

spring-boot-starter-mail

${spring-boot.version}

紧接着,我们需要在application.properties配置文件中加入“发送邮件服务”所需要的额外的支持配置信息:

#发送邮件配置

spring.mail.host=smtp.qq.com

spring.mail.username=1974544863@qq.com

spring.mail.password=cmtvsjvhonkjdaje

spring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=truemail.send.from=1974544863@qq.com

mail.kill.item.success.subject=商品抢购成功

mail.kill.item.success.content=您好,您已成功抢购到商品: %s ,复制该链接并在浏览器采用新的页面打开,即可查看抢购详情:${system.domain.url}/kill/record/detail/%s,并请您在1个小时内完成订单的支付,超时将失效该订单哦!祝你生活愉快!

在本秒杀系统中,发送邮件的服务我们是采用 QQ邮箱 作为主邮箱账号,相应的SMTP服务器也是采用QQ邮箱的!其中,spring.mail.password 指的是在QQ邮箱后台开通POP3/SMTP服务 时腾讯官方给的“密钥”(授权码),在这里,Debug就贡献了上面那个密钥~授权码 给各位使用了,而真正在企业生产环境中,其实是需要去申请一个主邮箱账号的,至于如何申请,在这里就不赘述了!

(2)接下来,我们就可以大显伸手一番了!我们在MailService中开发了两种发送邮件的功能,一种发送简单文本的功能(即纯文字的、很死板、高冷风的那种),另一种是发送带HTML标签的花哨文本的功能(即带样式的、比较俏皮的、有温度的那种),如下所示:

//通用的发送邮件服务

@Service

@EnableAsyncpublic classMailService {private static final Logger log= LoggerFactory.getLogger(MailService.class);

@AutowiredprivateJavaMailSender mailSender;

@AutowiredprivateEnvironment env;//发送简单文本文件

@Asyncpublic void sendSimpleEmail(finalMailDto dto){try{

SimpleMailMessage message=newSimpleMailMessage();

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());

}

}//发送花哨邮件

@Asyncpublic void sendHTMLMail(finalMailDto 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

@NoArgsConstructorpublic class MailDto implementsSerializable{//邮件主题

privateString subject;//邮件内容

privateString content;//接收人

privateString[] tos;

}

(3)最后是在“RabbitMQ通用的消息接收服务类” RabbitReceiverService 的接收消息逻辑中整合进“发送邮件服务”的逻辑,如下所示:

@AutowiredprivateMailService mailService;

@AutowiredprivateEnvironment env;/*** 秒杀异步邮件通知-接收消息*/@RabbitListener(queues= {"${mq.kill.item.success.email.queue}"},containerFactory = "singleListenerContainer")public voidconsumeEmailMsg(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,newString[]{info.getEmail()});

mailService.sendHTMLMail(dto);

}catch(Exception e){

log.error("秒杀异步邮件通知-接收消息-发生异常:",e.fillInStackTrace());

}

}

(4)至此,关于通用的发送邮件服务的代码实战,我们就介绍到这里了,接下来我们进入测试环节。点击“抢购”,如果用户秒杀成功,系统后端会在数据库录入一笔秒杀成功后的订单,同时user表中“邮箱字段值”对应的邮箱会受到一封邮件,如下图所示:

a3af487d5845c67acbe89eea40d8e2a8.png

好了,欢乐的撸码时光总是短暂的,本篇文章我们就介绍到这里了!下篇博文我们将继续我们的“秒杀系统实战”之旅!

补充:

1、目前,这一秒杀系统的整体构建与代码实战已经全部完成了,完整的源代码数据库地址可以来这里下载:gitee.com/steadyjack/… 记得Fork跟Star啊!!

2、最后,不要忘记了关注一下Debug的技术微信公众号:


https://dhexx.cn/news/show-16904.html

相关文章

Android 自定义控件——自定义属性

本文介绍在 Android 当中自定义控件使用自定义属性 本文以下图为例进行讲解 如图: 一个圆,我们自定义一个View ,以画一个圆为例,以圆的半径、颜色、透明值 作为自定义属性来进行讲解 先定义自定义的View,继承View&am…

3904三极管是什么功能_什么是分立器件?芯片、半导体、集成电路的关系

昨天,我们在文章中讲到,医药概念个股目前已经调整了将近20%,今天再给个大跌10%左右就可以打短,投机一把。目前从收盘上来看,还可以。前期强势的医药概念个股出现了反弹,好几只从跌停大幅拉红,即…

几个字节的数据怎么加密好?_塑料盆圆滑没有边,怎么做好卫生间收纳?教你几个好方法...

塑料盆圆滑没有边,怎么做好卫生间收纳?教你几个好方法哈喽大家好,前两天有朋友说到这个收纳的问题,一个朋友说对于塑料盆的收纳他有妙招,当时我有点好奇,就问了朋友这个问题,朋友说就是在塑料盆…

(转载) css实现小三角(尖角)

在各种网站里面,我们会经常看到类似于这样的尖角:(示例:新浪微博) 它实现的方式有多种,哪种才是最简单的?哪种才是最优秀的?首先我声明一下,我还不清楚这个东西具体叫什么…

pdf python 合同_是程序员,就用python导出pdf

这两天一直在做课件,我个人一直不太喜欢PPT这个东西……能不用就不用,我个人特别崇尚极简风。谁让我们是程序员呢,所以就爱上了Jupyter写课件,讲道理markdown也是个非常不错的写书格式啊。安装Jupyter其实非常简单,你会…

wordpress建站流程_国内类似WordPress的建站系统

事实上,外贸企业早已开始通过外贸独立网站的方式进行交易,毕竟拥有自己的网站,就有了企业品牌及网络营销的主阵地。据了解但凡初具规模的公司一般都有自己的网站,在展示企业产品的同时,网站还能为他们带来以下优势&…

php和mysql处理树状_分级_无限分类_分层数据的方法_PHP和MySQL处理树状、分级、无限分类、分层数据的方法...

文章标题中的多个词语表达的其实是一个意思,就是递归分类数据,分级数据非常类似数据结构中的树状结构,即每个节点有自己的孩子节点,孩子结点本身也是父亲节点。这是一个递归、分层形式。可以称之为树形层级数据。层级数据结构是编…

PS长图快速切片_PS最常用的100多个快捷键

PS最常用的100多个快捷键这些快捷键都是比较常用的,一些比较生僻的快捷键我就不发出来了。这些快捷键大家可以抄下来,但是,完全没有必要刻意的想去记住它,因为你越是想刻意的记住它,越是记不住。下面这一百多个快捷键全…

UVa 294 (因数的个数) Divisors

题意&#xff1a; 求区间[L, U]的正因数的个数。 分析&#xff1a; 有这样一条公式&#xff0c;将n分解为&#xff0c;则n的正因数的个数为 事先打好素数表&#xff0c;按照上面的公式统计出最大值即可。 1 #include <cstdio>2 #include <cmath>3 4 const int maxn…

uft自动化测试工具安装步骤_2020年十大最佳自动化测试工具

Best Automation Testing Tools for 2020对更快交付高质量软件(或"快速质量")的需求要求组织以敏捷&#xff0c;持续集成(CI)和DevOps方法论来寻找解决方案。测试自动化是这些方面的重要组成部分。最新的《 2018-2019年世界质量报告》表明&#xff0c;测试自动化是实…