最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot發(fā)送html郵箱驗(yàn)證碼功能

 更新時(shí)間:2021年12月17日 10:54:16   作者:建橋之魂  
這篇文章主要介紹了SpringBoot發(fā)送html郵箱驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1. 效果展示(用戶收到的)

2. 郵件推送管理(見(jiàn)以后的博客)

先看看如果管理員手動(dòng)發(fā)送該如何操作


3. 后端核心代碼(通用版)

3.1 SendEmailVO實(shí)體類

package com.example.han.model.VO;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Schema(description = "發(fā)送郵件VO實(shí)體類")
public class SendEmailVO {
    @Schema(description = "收件人郵箱")
    String toAddress;
    @Schema(description = "模板名")
    String modelName;
    @Schema(description = "郵件標(biāo)題")
    String title;
    @Schema(description = "文本里所需要參數(shù)")
    Map<String,String> parameters;
    @Schema(description = "調(diào)用者類型(管理員/服務(wù))")
    String manageType;
    @Schema(description = "(調(diào)用者/服務(wù))名稱")
    String manager;
}

3.2 Controller層核心代碼

   @Operation(summary = "發(fā)送html郵件")
   @PutMapping("/sendemail")
   public ResultReturn sendEmail(@RequestBody SendEmailVO sendEmailVO){
       return (sendModelService.sendEmailByParam(sendEmailVO));
   }

3.3 ServiceImpl層核心代碼

    @Autowired
    HtmlEmailServiceImpl htmlEmailService;
    
    /**
     * 通過(guò)模板名查找html文本
     * @param name 模板名
     * @return 返回html文本
     */
    public String getTextByName(String name){
        List<MailModelDO> lists = mailRepository.getAllMailModel();
        for (MailModelDO list : lists){
            if(list.getModelName().equals(name)){
                return list.getHtmlText();
            }
        }
        return "NOT FOUND";
    }
    /**
     * 發(fā)送郵件的操作
     * @param sendEmailVO 發(fā)送郵件VO實(shí)體類
     * @return 收件人郵箱
     */
    public ResultReturn sendEmailByParam(SendEmailVO sendEmailVO){
        String str = getTextByName(sendEmailVO.getModelName());
        if(!CheckMail.checkMail(sendEmailVO.getToAddress())){
            return ResultReturnUtil.fail(WRONG_EMAIL_ADDRESS);
        }
        if(sendEmailVO.getTitle().equals("")){
            return ResultReturnUtil.fail(EMPTY_TITLE);
        }
        if(str.equals("NOT FOUND")){
            return ResultReturnUtil.fail(FIND_MODEL_FAILED);
        }
        ReplaceWordUtil replaceWordUtil = new ReplaceWordUtil();
        String content = replaceWordUtil.replaceWord(str,sendEmailVO.getParameters());

        MailInfoTO info = new MailInfoTO();
        info.setToAddress(sendEmailVO.getToAddress());
        info.setSubject(sendEmailVO.getTitle());
        info.setContent(content);
        try {
            htmlEmailService.sendHtmlMail(info);
        } catch (Exception e) {
            //System.out.print("'"+sendEmailVO.getTitle()+"'的郵件發(fā)送失??!");
            e.printStackTrace();
        }
        MailHistoryDO mailHistoryDO = ToBeMailHistoryDO(sendEmailVO);
        mailRepository.saveHistory(mailHistoryDO);
        return ResultReturnUtil.success(SEND_EMAIL_SUCCESS,sendEmailVO.getToAddress());
    }

3.4 利用正則檢查郵箱是否合法工具類

package com.example.han.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CheckMail {
    public static boolean checkMail(String mail){
        Pattern pattern=Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
        //\w+@(\w+.)+[a-z]{2,3}
        Matcher matcher=pattern.matcher(mail);
        return matcher.matches();
    }
}

3.5 字符替換工具類

就是為了將模板中的花括號(hào)替換成真正需要的東西

package com.example.han.util;

import java.util.Iterator;
import java.util.Map;

/**
 * 將str通過(guò)map的key轉(zhuǎn)換成value
 */
public class ReplaceWordUtil {
    public String replaceWord(String str, Map<String,String> map) {
        Iterator iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry entry = (Map.Entry) iter.next();
            Object key = entry.getKey();
            Object value = entry.getValue();
            str = str.replace("{{"+key+"}}",value+"");
            //System.out.println(key+":"+value);
        }
        //System.out.println(str);
        return str;
    }
}

3.6 Reposity層 邏輯并不是很好,是找出來(lái)所有模版以后,開(kāi)始遍歷出來(lái)想要的那一個(gè)

package com.example.han.repository;

import com.example.han.model.DO.MailHistoryDO;
import com.example.han.model.DO.MailModelDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class MailRepository {
    @Autowired
    MongoTemplate mongoTemplate;

    public List<MailModelDO> getAllMailModel(){
        System.out.println(mongoTemplate.findAll(MailModelDO.class));
        return mongoTemplate.findAll(MailModelDO.class);
    }
}

3.7 發(fā)送html郵件的核心配置類

package com.example.han.service.impl;

import com.example.han.model.TO.MailInfoTO;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;


@Service
public class HtmlEmailServiceImpl{
    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.username}")
    private String formName;

    @Value("${spring.mail.password}")
    private String password;

    @Value("${spring.mail.username}")
    private String replayAddress;

    /**
     * 發(fā)送html郵件
     * @param info MailInfo實(shí)體類
     * @throws Exception 拋出異常
     */
    public void sendHtmlMail(MailInfoTO info) throws Exception {
        System.out.println(host);
        System.out.println(formName);
        info.setHost(host);
        info.setFormName(formName);
        info.setFormPassword(password);   //網(wǎng)易郵箱的授權(quán)碼~不一定是密碼
        info.setReplayAddress(replayAddress);
        System.out.println(info.getHost());
        System.out.println(info.getContent());

        Message message = getMessage(info);
        // MiniMultipart類是一個(gè)容器類,包含MimeBodyPart類型的對(duì)象
        Multipart mainPart = new MimeMultipart();
        // 創(chuàng)建一個(gè)包含HTML內(nèi)容的MimeBodyPart
        BodyPart html = new MimeBodyPart();
        // 設(shè)置HTML內(nèi)容
        html.setContent(info.getContent(), "text/html; charset=utf-8");
        mainPart.addBodyPart(html);
        // 將MiniMultipart對(duì)象設(shè)置為郵件內(nèi)容
        message.setContent(mainPart);
        Transport.send(message);
    }

    public Message getMessage(MailInfoTO info) throws Exception{
        final Properties p = System.getProperties() ;
        p.setProperty("mail.smtp.host", info.getHost());
        p.setProperty("mail.smtp.auth", "true");
        p.setProperty("mail.smtp.user", info.getFormName());
        p.setProperty("mail.smtp.pass", info.getFormPassword());

        // 根據(jù)郵件會(huì)話屬性和密碼驗(yàn)證器構(gòu)造一個(gè)發(fā)送郵件的session
        Session session = Session.getInstance(p, new Authenticator(){
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(p.getProperty("mail.smtp.user"),p.getProperty("mail.smtp.pass"));
            }
        });
        session.setDebug(true);
        Message message = new MimeMessage(session);
        //消息發(fā)送的主題
        message.setSubject(info.getSubject());
        //接受消息的人
        message.setReplyTo(InternetAddress.parse(info.getReplayAddress()));
        //消息的發(fā)送者
        message.setFrom(new InternetAddress(p.getProperty("mail.smtp.user"),"這是我的名字"));
        // 創(chuàng)建郵件的接收者地址,并設(shè)置到郵件消息中
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(info.getToAddress()));
        // 消息發(fā)送的時(shí)間
        message.setSentDate(new Date());
        return message ;
    }
}

4. 后端代碼(帶例子版)

4.1 Controller層

    @Operation(summary = "設(shè)置并發(fā)送忘記密碼的驗(yàn)證碼")
    @PostMapping("/sendForgetPasswordCode")
    public ResultReturn sendForgetPasswordCode(String email) throws MyException {
        return userService.sendForgetCode(email);
    }

4.2 ServiceImpl層

  • 這里我都配置到系統(tǒng)里去了,每次就不用管理員手動(dòng)發(fā)送,只要用戶發(fā)個(gè)請(qǐng)求,系統(tǒng)就能自動(dòng)生成并發(fā)送驗(yàn)證碼。
  • 里面的工具類還有一些方法,可以查閱上面通用版里面的代碼,這里我就不贅述了。
    @Override
    public ResultReturn sendForgetCode(String email) throws MyException {
        if(!CheckMail.checkMail(email)){
            throw new MyException(400,WRONG_EMAIL_ADDRESS);
        }
        String num = ""+RandomUtil.Code();
        redisUtil.setRedisKey("forgetCode", num, 60*5);    //先存入redis
        SendEmailVO sendEmailVO = new SendEmailVO();
        sendEmailVO.setManageType("System");
        sendEmailVO.setManager("ForgetPasswordSystem");
        sendEmailVO.setModelName("forgetCode");     //需要用的模版名字
        Map map = new HashMap<String,String>();
        map.put("code",num);
        sendEmailVO.setParameters(map);
        sendEmailVO.setTitle("詩(shī)云-忘記密碼-驗(yàn)證碼");
        sendEmailVO.setToAddress(email);
        sendEmailService.sendEmailByParam(sendEmailVO);
        return ResultReturnUtil.success(SEND_VERIFICATION_CODE_SUCCESS,email);
    }

5. html郵件內(nèi)容

5.1 注冊(cè)驗(yàn)證碼模板

http://m.fzitv.net/article/180220.htm

到此這篇關(guān)于SpringBoot發(fā)送html郵箱驗(yàn)證碼的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送郵箱驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringCloud Gateway的路由,過(guò)濾器和限流解讀

    SpringCloud Gateway的路由,過(guò)濾器和限流解讀

    這篇文章主要介紹了SpringCloud Gateway的路由,過(guò)濾器和限流解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 關(guān)于jdk環(huán)境變量配置以及javac不是內(nèi)部或外部命令的解決

    關(guān)于jdk環(huán)境變量配置以及javac不是內(nèi)部或外部命令的解決

    這篇文章主要介紹了關(guān)于jdk環(huán)境變量配置以及javac不是內(nèi)部或外部命令的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • spring boot actuator監(jiān)控超詳細(xì)教程

    spring boot actuator監(jiān)控超詳細(xì)教程

    Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據(jù)的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據(jù),接下來(lái)通過(guò)本文給大家介紹spring boot actuator監(jiān)控超詳細(xì)教程,感興趣的朋友一起看看吧
    2021-10-10
  • java 算法二分查找和折半查找

    java 算法二分查找和折半查找

    這篇文章主要介紹了java 算法二分查找與折半查找的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java 解析user-agent 信息

    java 解析user-agent 信息

    這篇文章主要介紹了java 解析http user-agent的信息的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 新版SpringSecurity安全配置說(shuō)明

    新版SpringSecurity安全配置說(shuō)明

    這篇文章主要介紹了新版SpringSecurity安全配置說(shuō)明,在 Spring Security 5.7.0-M2 中,我們棄用了WebSecurityConfigurerAdapter,因?yàn)槲覀児膭?lì)用戶轉(zhuǎn)向基于組件的安全配置,需要的朋友可以參考下
    2023-07-07
  • java中元素排序Comparable和Comparator的區(qū)別

    java中元素排序Comparable和Comparator的區(qū)別

    本文主要介紹了java中元素排序Comparable和Comparator的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 如何利用泛型封裝通用的service層

    如何利用泛型封裝通用的service層

    這篇文章主要介紹了如何利用泛型封裝通用的service層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringMVC配置javaConfig及StringHttpMessageConverter示例

    SpringMVC配置javaConfig及StringHttpMessageConverter示例

    這篇文章主要介紹了SpringMVC配置javaConfig及StringHttpMessageConverter實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java char[]數(shù)組轉(zhuǎn)成String類型詳細(xì)介紹

    Java char[]數(shù)組轉(zhuǎn)成String類型詳細(xì)介紹

    這篇文章詳細(xì)介紹了Java char[]數(shù)組轉(zhuǎn)成String類型(char to String)的方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀
    2023-04-04

最新評(píng)論

龙陵县| 革吉县| 类乌齐县| 广饶县| 天津市| 吕梁市| 睢宁县| 阿拉善左旗| 安陆市| 平原县| 巴塘县| 宜丰县| 泰安市| 德格县| 江西省| 宁都县| 建湖县| 湘西| 凤翔县| 集安市| 台中市| 聂拉木县| 德阳市| 鄂伦春自治旗| 胶南市| 大城县| 华池县| 壤塘县| 太原市| 上林县| 乌拉特前旗| 方城县| 石家庄市| 元阳县| 晋江市| 门源| 广元市| 新和县| 宁化县| 桃江县| 英吉沙县|