继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringBoot使用配置邮件和实战(超详细)

满脑子代码的祝大朋
关注TA
已关注
手记 2
粉丝 1
获赞 1

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文件,此时就不需要点刷新键啦。

  1. 在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.实战效果

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP