Spring Boot(六) 快速集成 Mail 服务
大家好! 我是慕歌,一只想教你学习 Spring Boot的野生coder! 欢迎来到慕歌的 Sping boot系列教程,希望通过这个教程带大家搭建基础的 Spring Boot项目,该教程所有知识点均来源于本人的真实开发!
前言
在前一节的分享中,慕歌向大家介绍了在开发中我们如何将数据导出为excel,还是通过excel 导入数据。在excel中,我们可以进行更为细致的数据处理,通过Excel提供的优秀数据分析能力,将数据进一步可视化操作。这一节中慕歌将为大家带来mail 邮箱的使用,在我们的spring boot中为mail服务提供了非常好的支持,只需要简单的配置后,就可以通过mail 网络发送短信息。
引入:
spring boot为mail服务进行良好的适配,引入mail 依赖后,我们只需要配置自己的mail邮箱,就可开始使用。
<!-- mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--发送短信-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
这里除了使用spring boot 的mail依赖外,还需要使用阿里云的邮件发送sdk。
开发:
在我们的配置文件中加入mail 服务的配置,这里使用的是@136 邮箱,其它邮箱的使用方法与它类似。
spring:
mail:
# 163邮箱的地址为smtp.163.com,直接填写即可
host: smtp.qq.com
# 你申请的163邮箱
username: 2010550890@qq.com
# 注意密码是在开启smtp/pop3时自动生成的,记得保存一下,不然就找不到了
password: yiyjqqsjtvbdddbc
# 额外的配置,这里我写了两个,只用其中一个就行了,开启ssl加密,保证安全连接
properties:
mail:
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
## ssl:
## enable :true
#设置邮件的编码为utf-8
default-encoding: utf-8
这里是mail 的样例使用场景是验证码服务,需要用到的功能非常简单,可根据自己的需要进行拓展。依旧使用的是sevice 和impl 的方式具体实现邮件服务:
public interface IMailCodeService {
/**
* 获取验证码
* @param key
*/
String getVerifyCode(String key , String mail);
/**
* 验证验证码
* @param key 验证码的uuid
* @param code 验证码
*/
boolean verify(String key,String code);
/**
* 删除验证码
* @param key 待生成uuid
*/
void deleteverifyCode(String key);
}
需要用到的功能包括验证码发送,验证,以及验证码失效
/**
* 验证码服务
*/
@Repository
public class IMemberVerifyCodeRepository {
@Autowired
RedisTemplate<String, Object> redisTemplate;
/**
* 获取验证码
* @param key uuid 的值
* @return 验证码
*/
public String get(String key) {
if(hasKey(key)) {
//redis 获取
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
return (String) valueOperations.get(key);
}
return null;
}
//删除验证码
public void delete(String key) {
if(hasKey(key)) {
redisTemplate.delete(key);
}
}
/**
* 保存到redis 中
* 码证码有效期 20分钟
* @param key session id
* @param verifyCode 码证码
*/
public void save(String key, String verifyCode) {
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, verifyCode, 20L, TimeUnit.MINUTES);
}
//查询验证码是否存在
public boolean hasKey(String key) {
return Optional.ofNullable(redisTemplate.hasKey(key)).orElse(false);
}
}
这里通过redis辅助验证码实现定时过期功能,如不知道如何引入redis 可参考之前的有关redis 集成与使用的文章。
@Service
public class MailService {
//发送者
@Value("${spring.mail.username}")
private String SENDER;
//邮件发送服务
@Autowired
JavaMailSender mailSender;
/**
* 普通邮件
* @param to 接受者
* @param subject 主题
* @param content 内容
*/
public void sendSimpleMailMessage(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(SENDER);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
// 发送html邮件
public void sendMimeMessage(String to, String subject, String content) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();;
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
}
// 发送带附件的邮件
public void sendMimeMessage(String to, String subject, String content, String filePath) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();;
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
mailSender.send(message);
}
// 发送带静态文件的邮件
public void sendMimeMessage(String to, String subject, String content, Map<String,String> rscIdMap) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
// true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(SENDER);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
for (Map.Entry<String, String> entry : rscIdMap.entrySet()) {
FileSystemResource file = new FileSystemResource(new File(entry.getValue()));
helper.addInline(entry.getKey(), file);
}
mailSender.send(message);
}
}
@Slf4j
@Service
public class MailCodeServiceImpl implements IMailCodeService {
private final String subject = "验证码";
private final String precontext = "[智能车] 验证码(20分钟有效)为";
@Autowired
private MailService mailService;
@Autowired
IMemberVerifyCodeRepository iMemberVerifyCodeRepository;
@Override
public String getVerifyCode(String key,String mail) {
if(iMemberVerifyCodeRepository.hasKey(key)){
this.deleteverifyCode(key);
}
String randomVerifyCode = randomVerifyString(6);
try {
String context = precontext+randomVerifyCode;
mailService.sendMimeMessage(mail,subject,context);
} catch (MessagingException e) {
e.printStackTrace();
log.info("信息发送失败!");
}
iMemberVerifyCodeRepository.save(key,randomVerifyCode);
return randomVerifyCode;
}
//随机字符串
private String randomVerifyString(int len) {
StringBuilder verifyString = new StringBuilder();
//随机字段
SecureRandom secureRandom = new SecureRandom();
for (int i = 0; i < len; i++) {
verifyString.append(secureRandom.nextInt(10));
}
return verifyString.toString();
}
@Override
public boolean verify(String key, String code) {
String memberVerfityCode = iMemberVerifyCodeRepository.get(key);
if(!Objects.equals(code,memberVerfityCode)){
log.info("验证码错误,或是验证码已经失效!");
return false;
}
return true;
}
@Override
public void deleteverifyCode(String key) {
iMemberVerifyCodeRepository.delete(key);
}
}
通过以上配置方式,我们即可向指定用户发送邮件,用于验证是否是受信任用户在进行操作。
结语
这一章的分享到这里就结束了,下一节中还将带来spring boot中日志功能的分享!如果您觉得本文不错,欢迎点赞支持,您的关注是我坚持的动力!
转载自:https://juejin.cn/post/7129484131297132558