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

6 篇文章 1 订阅
5 篇文章 0 订阅

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

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

 
 
记录,总结,分享!学习永远在路上!
 
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值