SpringBoot使用配置郵件和實戰(超詳細)

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            //端口號
[email protected]        //發件人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("[email protected]");
        messageHelper.setTo("[email protected]");
        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.實戰效果

 
 
記錄,總結,分享!學習永遠在路上!
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章