1、前言
最近给学妹做毕设时,涉及到重置密码后,发送新的密码给用户邮箱,使用的简单邮件形式,主旨和内容。
发送邮件应该是网站的必备拓展功能之一,注册验证,忘记密码或者是给用户发送营销信息。正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在springboot提供了一套更简易使用的封装。(此段为摘网路)
2.添加依赖
在pom.xml中添加邮件的依赖
<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
重新加载一下Maven库,加载后,会出现邮件相关的jar。可能有的小伙伴IDEA设置了自动加载pom文件,此时就不需要点刷新键啦。
- 在Properties添加mail配置
此处我用的是QQ邮件,QQ邮箱比较常见
# mail
spring.mail.host=smtp.qq.com //QQ邮箱主机地址 ;136邮箱主机地址:smtp.163.com
spring.mail.port=587 //端口号
spring.mail.username=1512299899@qq.com //发件人QQ邮箱,修改成个人的或者企业邮箱
spring.mail.password=woqybrryawjhieh // 授权码,需要进入QQ邮箱设置中打开权限,获取此授权码
spring.mail.default-encoding=UTF-8 //默认的编码的确是UTF-8
spring.mail.properties.mail.smtp.auth=true
3.获取spring.mail.password授权码
点击设置 --> 账号 --> 开启 POP3/SMTP服务 和 IMAP/SMTP服务(网上有教程说之开启POP3/SMTP服务就行,我管他呢,都开开了) --> 获取授权码
之后复制授权码,到项目中粘贴。
4.项目实战
配置以上就可以使用邮件啦,我是重置密码后发起邮件的,直接从后端控制器讲起吧!直奔主题,简单粗暴,直接上代码!
/**
* @Desc 重置用户密码并发送邮件
* @Param
* @return
* @Date 2020/3/21 17:29
*/
@PostMapping("/sendMail")
@LoginRequired
public JsonData sendMail(@RequestParam(value = "toMail") String toMail,
@RequestParam(value = "userId") Long userId) {
if (StringUtils.isEmpty(toMail)) {
return JsonData.fail("用户邮箱不能为空");
}
//TODO 随机生成密码
String defaultPassword = PasswordCreateUtil.createPassWord(8);
User user = new User();
user.setUserId(userId);
user.setUserPassword(defaultPassword);
int count = userService.updateUser(user);
if (count > 0) {
mailService.sendSimpleMail(toMail, "重置密码", "您的初始密码为:" + defaultPassword);
return JsonData.success(count, "重置密码成功");
} else {
return JsonData.fail("重置密码失败");
}
}
大致说一下逻辑,首先我们在前端页面点击重置密码按钮后,触发到我们后端控制器,传进userId和重置人的邮箱账号两个参数,走到我们这个方法,此方法做了三件事:
1.重新生成个密码。可利用随机数来选取abcd…和数字,重新生成个密码。如图 row:216
2.将生成的密码赋值给新的user,更新数据库user信息。如图row:217-220
3.数据库更新成功后,再去发生邮箱给重置人的邮箱。如图row:222-223
接下来分别介绍一下这三步逻辑
1.重新生成个密码。此处主要使用Random和Math类。
/**
* @param len
* @return : java.lang.String
* @author: zhupeng
* @date: 2020-03-24 21:19
* @description: 指定长度生成随机密码
*/
public static String createPassWord(int len) {
int random = createRandomInt();
return createPassWord(random, len);
}
private static String createPassWord(int random, int len) {
Random rd = new Random(random);
final int maxNum = 62;
StringBuffer sb = new StringBuffer();
int rdGet;//取得随机数
char[] str = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int count = 0;
while (count < len) {
//生成的数最大为62-1
rdGet = Math.abs(rd.nextInt(maxNum));
if (rdGet >= 0 && rdGet < str.length) {
sb.append(str[rdGet]);
count++;
}
}
return sb.toString();
}
private static int createRandomInt() {
//得到0.0到1.0之间的数字,并扩大100000倍
double temp = Math.random() * 100000;
//如果数据等于100000,则减少1
if (temp >= 100000) {
temp = 99999;
}
int tempint = (int) Math.ceil(temp);
return tempint;
}
2.将生成的密码赋值给新的user,更新数据库user信息。
此处在重新赋值密码是,使用了MD5加密了一下,user赋值采用lombok语法,感兴趣可以看看lombok用法,他可以大大的简化代码。
/**
* @Desc 更新用户
* @Param
* @return
* @Date 2020/3/21 17:39
*/
@Override
public int updateUser(User user) {
if (checkUserNameExist(user.getUserName(), user.getUserId())) {
throw new ParamException("用户名已被占用");
}
if (checkUserTrueNameExist(user.getUserTrueName(), user.getUserId())) {
throw new ParamException("真实姓名已经存在");
}
if (checkUserEmailExist(user.getUserEmail(), user.getUserId())) {
throw new ParamException("邮箱已被占用");
}
if (checkUserPhoneExist(user.getUserPhone(), user.getUserId())) {
throw new ParamException("手机号已被占用");
}
User before = userMapper.selectByPrimaryKey(user.getUserId());
Preconditions.checkNotNull(before, "需更新的用户不存在");
User after = User.builder()
.userId(user.getUserId())
.userName(user.getUserName())
.userTrueName(user.getUserTrueName())
.userPassword(Md5Util.md5(user.getUserPassword(), Md5Util.SALT))
.userEmail(user.getUserEmail())
.userPhone(user.getUserPhone())
.userState(user.getUserState())
.build();
int count = userMapper.updateByPrimaryKeySelective(after);
return count;
}
3.数据库更新成功后,再去发生邮箱给重置人的邮箱。
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
/**
* @Desc 发送简单邮件
* @Param
* @return
* @Date 2020/3/21 17:36
*/
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
log.info("简单邮件发送成功!");
} catch (MailException e) {
log.error("发送简单邮件时发生异常!" + e);
}
}
需要将JavaMailSender类注入进来,需要加这个注解@Resource,如上图row:25-26
获取发送的人邮箱,邮箱我们在Properties中维护过,需要加value注解,里面是参数的key,以便于获取信息。如上图row:28-29
写一个发送的方法,我这用的邮件简单方式,传入三个参数,to:收件人邮箱,subject:主旨,即邮件的标题,content:邮件的内容
也是new个新的SimpleMailMessage对象,赋值发送人、收件人、主旨、内容。之后调用JavaMailSender的send方法即可。
下面附上附上复杂邮件代码,相比简单邮件,复杂邮件处理可以发送主旨内容外,也可以发送图片文件等,感兴趣可以自己试试!
//复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom("admin@163.com");
messageHelper.setTo("socks@qq.com");
messageHelper.setSubject("Happy New Year");
messageHelper.setText("新年快乐!");
messageHelper.addInline("doge.gif", new File("xx/xx/doge.gif"));
messageHelper.addAttachment("work.docx", new File("xx/xx/work.docx"));
mailSender.send(mimeMessage);
4.实战效果