SpringBoot發(fā)送html郵箱驗(yàn)證碼功能
1. 效果展示(用戶收到的)
2. 郵件推送管理(見以后的博客)
先看看如果管理員手動(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; /** * 通過模板名查找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通過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層 邏輯并不是很好,是找出來所有模版以后,開始遍歷出來想要的那一個(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("詩云-忘記密碼-驗(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://www.dbjr.com.cn/article/180220.htm
到此這篇關(guān)于SpringBoot發(fā)送html郵箱驗(yàn)證碼的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送郵箱驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot發(fā)送短信驗(yàn)證碼的實(shí)例
- SpringBoot使用榛子云實(shí)現(xiàn)手機(jī)短信發(fā)送驗(yàn)證碼
- SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過期
- SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能
- SpringBoot發(fā)送郵箱驗(yàn)證碼功能
- SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)
- Springboot實(shí)現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗(yàn)證碼的發(fā)送功能
- SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)
相關(guān)文章
Java?Collection接口中的常用方法總結(jié)
這篇文章將大概用代碼案例簡(jiǎn)單總結(jié)一下?Collection?接口中的一些方法,我們會(huì)以他的實(shí)現(xiàn)類?Arraylist?為例創(chuàng)建對(duì)象??煲黄饋砜纯窗?/div> 2022-12-12Java操作透明圖片并保持背景透明的實(shí)現(xiàn)
這篇文章主要介紹了Java操作透明圖片并保持背景透明的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09SpringBoot集成Druid監(jiān)控頁面最小化配置操作
這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁面最小化配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊
這篇文章主要介紹了springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot配置線程池的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot配置線程池的實(shí)現(xiàn)示例,主要包括在Spring Boot中創(chuàng)建和配置線程池,包括設(shè)置線程池的大小、隊(duì)列容量、線程名稱等參數(shù),感興趣的可以了解一下2023-09-09java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)
Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來完成,下面看一個(gè)簡(jiǎn)單的示例就明白了2014-01-01最新評(píng)論