spring boot 整合 mail 发送邮件 【用户注册以及找回密码】

一.在 pox.xml 中 加入 <!--email依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency> 
 
 
 

二。创建一个用户实体

/**
 * .
 */
@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class Member implements Serializable {

    @Id
    @GenericGenerator(name = "sys_uid",strategy = "com.zhaihuilin.util.KeyGeneratorUtils",parameters = {
            @Parameter(name = "k",value = "M")
    })
    @GeneratedValue(generator = "sys_uid")
    private  String  id;

    //用户名
    @NonNull
    private  String  username;

    //昵称
    private  String  nickname;

    @NonNull
    //密码
    private  String  password;

    @NonNull
    //邮箱
    private  String  email;

    //电话号码
    private  String  smscode;

    //用户状态
    private  String  state;


    public Member( String username, String nickname, String password, String email, String smscode, String state) {
        this.username = username;
        this.nickname = nickname;
        this.password = password;
        this.email = email;
        this.smscode = smscode;
        this.state = state;
    }

    public Member(String username, String nickname, String password, String email, String state) {
        this.username = username;
        this.nickname = nickname;
        this.password = password;
        this.email = email;
        this.state = state;
    }
}
三.配置文件 

1.application-dev.yml

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/sms?characterEncoding=UTF-8
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    minIdle: 2
    maxAction: 20
    maxWaitMillis: 8000
  cache:
    type: redis
  redis:
    database: 2
    host: 127.0.0.1
    port: 6379
    timeout: 20000
    pool:
      max-active: 8
      min-idle: 0
      max-idle: 8
      max-wait: -1
2.application-.yml

server:
  tomcat:
    uri-encoding: utf-8
  port: 8087
  context-path: /
spring:
  profiles:
    active: dev
  mail:
    host: smtp.163.com
    username: 邮箱   
    password: 邮箱的登录密码
    port: 25
    default-encoding: UTF-8
    protocol: smtp
    properties:
      mail:
        smth:
          auth: true
          starttls:
            enable: true
            required: true
四。编写相应的 dao  service  [此处省略]

五。编写工具类


//实体类主键生成策略

public class KeyGeneratorUtils extends AbstractUUIDGenerator implements Configurable {

    public String k;

    @Override
    public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException {
        k = properties.getProperty("k");
    }

    @Override
    public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return k + simpleDateFormat.format(new Date());
    }
}
//时间处理类
public class NormalTools {

    public static String getFileType(String fileName) {
        if(fileName!=null && fileName.indexOf(".")>=0) {
            return fileName.substring(fileName.lastIndexOf("."), fileName.length());
        }
        return "";
    }

    /**
     * 判断文件是否为图片文件
     * @param fileName
     * @return
     */
    public static Boolean isImageFile(String fileName) {
        String [] img_type = new String[]{".jpg", ".jpeg", ".png", ".gif", ".bmp"};
        if(fileName==null) {return false;}
        fileName = fileName.toLowerCase();
        for(String type : img_type) {
            if(fileName.endsWith(type)) {return true;}
        }
        return false;
    }

    public static String curDate(String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(new Date());
    }

    public static String curDate() {
        return curDate("yyyy-MM-dd HH:mm:ss");
    }
}
//随机生成6位数
public class RandomTools {

    /** 随机6位数 */
    public static String randomCode() {
        Integer res = (int)(Math.random()*1000000);
        return res+"";
    }
}
//加密 解密
public class SecurityUtil {
	public static String md5(String password) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(password.getBytes());
		return new BigInteger(1,md.digest()).toString(16);
	}
	
	public static String md5(String username,String password) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("MD5");
		md.update(username.getBytes());
		md.update(password.getBytes());
		return new BigInteger(1,md.digest()).toString(16);
	}
}

//非空判断
public class StringUtils {
    public static boolean isNotEmpty(String str){
        if(str != null && str.trim().length() != 0){
            return true;
        }
        return false;
    }
}
//邮件发送工具
@Component
public class SendEmailUtils {

    @Autowired
    private JavaMailSender javaMailSender; //注入 javaMailSender

    @Value("${spring.mail.username}")
    private  String username;     // 发送邮件者 邮箱 【谁发的】

    /**
     * 发送邮件
     * @param title   标题
     * @param titleWithName  是否在标题后添加 名称
     * @param content        内容
     * @param contentWithName   是否在内容后添加 名称
     * @param email     接收者的邮箱【注册人】
     */
    private  void  sendNormalEmail(
            String title,boolean titleWithName,
            String content, boolean contentWithName, String email ){
        String dName="个人博客";
        MimeMessage mimeMessage=null;
        try {
            mimeMessage= javaMailSender.createMimeMessage();//创建要发送的信息
            MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
            helper.setFrom(new InternetAddress(username,dName,"UTF-8")); //设置 谁发送的
            helper.setTo(email);//发给谁 【接收者的邮箱】
            title= titleWithName?title +"-"+dName:title; //标题内容
            helper.setSubject(title);//发送邮件的辩题
            if(contentWithName) {
                content += "<p style='text-align:right'>" +dName+ "</p>";
                content += "<p style='text-align:right'>" + NormalTools.curDate("yyyy-MM-dd HH:mm:ss")+ "</p>";
            }
            helper.setText(content,true);//发送的内容 是否为html
        }catch (Exception e){
            e.printStackTrace();
        }
            javaMailSender.send(mimeMessage);
    }


    /**
     * 发送 注册时的验证码
     * @param email   接收者的邮箱【注册人】
     * @param code    验证码
     */
    public  void  sendRegisterCode(final String email, String code){
          final StringBuffer sb= new StringBuffer();//实例化一个StringBuffer
          sb.append("<h2>"+email+",您好!<h2>")
                  .append("<p style='color:red'>此次注册的验证码是:"+code+"</p>");
          new Thread(new Runnable() {
              @Override
              public void run() {
                  sendNormalEmail("验证码", true, sb.toString(), true, email);
              }
          }).start();
    }


    /**
     * 注册成功时的提示邮件
     * @param email 接收的邮箱地址 【注册人】
     * @param pwd 初始密码
     * @param url 登陆地址
     */
    public void sendRegisterSuc(final String email, String pwd, String url) {
        final StringBuffer sb = new StringBuffer();
        sb.append("<h3>恭喜您,注册成功!</h3>")
                .append("<h2>初始化密码是:<b style='color:#F00'>").append(pwd).append("</b>,请不要告诉任何人!</h2>")
                .append("请及时<a href='").append(url).append("'>登陆网站</a>修改密码。");
        new Thread(new Runnable() {
            @Override
            public void run() {
                sendNormalEmail("注册成功", true, sb.toString(), true, email);
            }
        }).start();
    }

    /**
     * 注册成功时的提示邮件
     * @param email 接收的邮箱地址  【注册人】
     * @param pwd 初始密码
     * @param url 登陆地址
     */
    public void sendFindPwdSuc(final String email, String pwd, String url) {
        final StringBuffer sb = new StringBuffer();
        sb.append("<h3>恭喜您,密码找回成功!</h3>")
                .append("<h2>系统随机密码是:<b style='color:#F00'>").append(pwd).append("</b>,请不要告诉任何人!</h2>")
                .append("请及时<a href='").append(url).append("'>登陆网站</a>修改密码。");

        new Thread(new Runnable() {
            @Override
            public void run() {
                sendNormalEmail("成功找回密码", true, sb.toString(), true, email);
            }
        }).start();
    }

    /**
     * 新用户注册通过
     * @param email 接收邮箱地址(管理员的)
     * @param nickname 注册人姓名
     * @param regEmail 注册人邮箱
     * @param url 地址
     */
    public void sendOnRegister(final String email, String nickname, String regEmail, String url) {
        final StringBuffer sb = new StringBuffer();
        sb.append("<a href='").append(url).append("'><h1>姓名:").append(nickname).append("</h1></a>");
        sb.append("<h3>注册邮箱:").append(regEmail).append("</h3>");
        new Thread(new Runnable() {
            @Override
            public void run() {
                sendNormalEmail("新用户注册通知", true, sb.toString(), true, email);
            }
        }).start();
    }
}
六.编写 配置类
@Configuration
public class EmailConfig {

    @Value("http://localhost:8080/member/updatePwd")
    public String URL;

    //管理员邮箱  此处随便写一个邮箱
    @Value("[email protected]")
    public String MEMEMAIL;
}
 
 
七.编写 controller
@RestController
@Log4j
@RequestMapping(value = "/member")
public class MemberController {

    @Autowired
    private MemberService memberService;

    @Autowired
    private SendEmailUtils sendEmailUtils;

    @Autowired
    private EmailConfig  emailConfig;


    /**
     * 发送邮箱验证码
     * @param email   接收者的邮箱 【注册人】
     * @param request
     * @return
     */
    @RequestMapping(value = "/sendCode")
    public  String sendCode(
            @RequestParam(value = "email",defaultValue = "",required = true) String email,
            HttpServletRequest request ){
        try {
            String code =RandomTools.randomCode();//产生随机的验证码
            request.getSession().setAttribute("registerCode",code);
            //发送邮件开始   发送验证码
            log.info("开始发送邮件验证码------");
            sendEmailUtils.sendRegisterCode(email,code);
        }catch (Exception e){
            e.printStackTrace();
            return  "0";
        }
        return "1";
    }


    @RequestMapping(value = "/register")
    public ReturnMessages register(
            @RequestParam(value = "email",defaultValue = "",required = true) String email,
            @RequestParam(value = "username",defaultValue = "",required = true) String username,
            @RequestParam(value = "nickname",defaultValue = "",required = false) String nickname,
            @RequestParam(value = "smscode",defaultValue = "",required = false) String smscode,
            @RequestParam(value = "code",defaultValue = "",required = true) String code,
            HttpServletRequest request
    ){
            ReturnMessages  returnMessages=null;
            if (!StringUtils.isNotEmpty(email)){
               return   new  ReturnMessages(RequestState.ERROR,"邮箱不能为空!",null);
            }
            if (!StringUtils.isNotEmpty(username)){
                return   new  ReturnMessages(RequestState.ERROR,"用户名不能为空!",null);
            }
            if (memberService.existMemberByemail(email)){
                return   new  ReturnMessages(RequestState.ERROR,"邮箱已存在!",null);
            }
            if (memberService.existMemberByusername(username)){
                return   new  ReturnMessages(RequestState.ERROR,"用户名已存在!",null);
            }
            if (!StringUtils.isNotEmpty(code)){
                return   new  ReturnMessages(RequestState.ERROR,"验证码不能为空!",null);
            }
            // 此处测试的时候 无法获取到 session 值
//            String registerCode = (String) request.getSession().getAttribute("registerCode");
//            if (!registerCode.equals(code)){
//                return   new  ReturnMessages(RequestState.ERROR,"验证码输入不正确!",null);
//            }
            String pwd = RandomTools.randomCode(); //随机密码
            try {
                Member member=new Member();
                member.setEmail(email);
                member.setNickname(nickname);
                member.setState(StateConstant.USER_STATE_CHECK_ING.toString());
                member.setUsername(username);
                member.setPassword(SecurityUtil.md5(email,pwd));
                member=memberService.saveMember(member);
                if (member !=null){
                    //注册成功后 通知注册人
                    sendEmailUtils.sendRegisterSuc(email,pwd, emailConfig.URL+"?username="+username+"&code="+pwd);//注册成功后

                    //注册成功后 通知管理员
                    sendEmailUtils.sendOnRegister(emailConfig.MEMEMAIL,username,email,"#");//注册成功后
                    return   new  ReturnMessages(RequestState.SUCCESS,"注册成功!",member);
                }else{
                    return   new  ReturnMessages(RequestState.ERROR,"注册失败!",null);
                }
            } catch (Exception e) {
                return   new  ReturnMessages(RequestState.ERROR,"注册失败!",null);
            }
    }

    /**
     * 修改密码
     * @param code          初始密码
     * @param newPassword   新密码
     * @param request
     * @return
     */
    @RequestMapping(value = "/updatePwd")
    public  ReturnMessages updatePwd(
            @RequestParam(value = "code",defaultValue = "",required = true) String code,
            @RequestParam(value = "username",defaultValue = "",required = true) String username,
            @RequestParam(value = "newPassword",defaultValue = "",required = true) String newPassword,
            HttpServletRequest request
    ){
            ReturnMessages returnMessages=null;
            if (!StringUtils.isNotEmpty(code)){
                return   new  ReturnMessages(RequestState.ERROR,"初始密码不能为空!",null);
            }
            if (!StringUtils.isNotEmpty(newPassword)){
                return   new  ReturnMessages(RequestState.ERROR,"新密码不能为空!",null);
            }
            Member member = memberService.findMemberByusername(username);
            if (member ==null){
                return   new  ReturnMessages(RequestState.ERROR,"该用户不存在!",null);
            }
            try {
                if ( StringUtils.isNotEmpty(code) && StringUtils.isNotEmpty(newPassword)){
                     member.setPassword(SecurityUtil.md5(member.getEmail(),newPassword));
                     member=memberService.updateMember(member);
                    if (member !=null){
                        return   new  ReturnMessages(RequestState.SUCCESS,"修改密码成功!",member);
                    }else{
                        return   new  ReturnMessages(RequestState.ERROR,"修改密码失败!",null);
                    }
                }else{
                    return   new  ReturnMessages(RequestState.ERROR,"修改密码失败!",null);
                }
            }catch (Exception e){
                return   new  ReturnMessages(RequestState.ERROR,"修改密码失败!",null);
            }
    }

    /**
     * 找回密码
     * @param email     用户邮箱
     * @param request
     * @return
     */
    @RequestMapping(value ="/findPwd")
    public  ReturnMessages findPwd(
            @RequestParam(value = "email",defaultValue = "",required = true) String email,
            HttpServletRequest request
    ){
           ReturnMessages returnMessages=null;
           if (!StringUtils.isNotEmpty(email)){
               return   new  ReturnMessages(RequestState.ERROR,"邮箱不能为空!",null);
           }
           Member member= memberService.findMemeberByemail(email);
           if (member ==null){
                return   new  ReturnMessages(RequestState.ERROR,"该用户不存在!",null);
           }
           try {
               String url="http:192.168.0.17:8080/member/login";
               String randPwd = RandomTools.randomCode();//随机产生一个密码
               member.setPassword(SecurityUtil.md5(email,randPwd));
               member=memberService.updateMember(member);
               //发送邮件通知 用户
               sendEmailUtils.sendFindPwdSuc(email,randPwd,url);
               return   new  ReturnMessages(RequestState.SUCCESS,"找回密码成功!",member);
           }catch (Exception e){
               return   new  ReturnMessages(RequestState.ERROR,"找回密码失败!",null);
           }
    }

    /**
     * 登录
     * @param email      邮箱
     * @param password   密码
     * @param request
     * @return
     */
    @RequestMapping(value = "/login")
    public  ReturnMessages login(
            @RequestParam(value = "email",defaultValue = "",required = true) String email,
            @RequestParam(value = "password",defaultValue = "",required = true) String password,
            HttpServletRequest request
    ){
        ReturnMessages returnMessages=null;
        try {
            if (!StringUtils.isNotEmpty(email)){
                return   new  ReturnMessages(RequestState.ERROR,"邮箱不能为空!",null);
            }
            if (!StringUtils.isNotEmpty(password)){
                return   new  ReturnMessages(RequestState.ERROR,"密码不能为空!",null);
            }
            Member member=memberService.findMemeberByemail(email);
            if (member== null){
                return   new  ReturnMessages(RequestState.ERROR,"用户不存在!",null);
            }
            String pwd=SecurityUtil.md5(email,password);
            if (member.getPassword().equals(pwd)){
                return   new  ReturnMessages(RequestState.SUCCESS,"登录成功!",null);
            }else{
                return   new  ReturnMessages(RequestState.ERROR,"密码错误,登录失败!",null);
            }
        }catch (Exception e){
            e.printStackTrace();
            return   new  ReturnMessages(RequestState.ERROR,"登录失败!",null);
        }
    }

}



 
 

 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/zhaihuilin0986/article/details/78530657
今日推荐