SpringBoot發(fā)送html郵箱驗證碼功能
1. 效果展示(用戶收到的)
2. 郵件推送管理(見以后的博客)
先看看如果管理員手動發(fā)送該如何操作
3. 后端核心代碼(通用版)
3.1 SendEmailVO實體類
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實體類") public class SendEmailVO { @Schema(description = "收件人郵箱") String toAddress; @Schema(description = "模板名") String modelName; @Schema(description = "郵件標題") 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實體類 * @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 字符替換工具類
就是為了將模板中的花括號替換成真正需要的東西
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層 邏輯并不是很好,是找出來所有模版以后,開始遍歷出來想要的那一個
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實體類 * @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類是一個容器類,包含MimeBodyPart類型的對象 Multipart mainPart = new MimeMultipart(); // 創(chuàng)建一個包含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對象設(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ù)郵件會話屬性和密碼驗證器構(gòu)造一個發(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ā)送的時間 message.setSentDate(new Date()); return message ; } }
4. 后端代碼(帶例子版)
4.1 Controller層
@Operation(summary = "設(shè)置并發(fā)送忘記密碼的驗證碼") @PostMapping("/sendForgetPasswordCode") public ResultReturn sendForgetPasswordCode(String email) throws MyException { return userService.sendForgetCode(email); }
4.2 ServiceImpl層
- 這里我都配置到系統(tǒng)里去了,每次就不用管理員手動發(fā)送,只要用戶發(fā)個請求,系統(tǒng)就能自動生成并發(fā)送驗證碼。
- 里面的工具類還有一些方法,可以查閱上面通用版里面的代碼,這里我就不贅述了。
@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("詩云-忘記密碼-驗證碼"); sendEmailVO.setToAddress(email); sendEmailService.sendEmailByParam(sendEmailVO); return ResultReturnUtil.success(SEND_VERIFICATION_CODE_SUCCESS,email); }
5. html郵件內(nèi)容
5.1 注冊驗證碼模板
http://chabaoo.cn/article/180220.htm
到此這篇關(guān)于SpringBoot發(fā)送html郵箱驗證碼的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送郵箱驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?Collection接口中的常用方法總結(jié)
這篇文章將大概用代碼案例簡單總結(jié)一下?Collection?接口中的一些方法,我們會以他的實現(xiàn)類?Arraylist?為例創(chuàng)建對象??煲黄饋砜纯窗?/div> 2022-12-12Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09SpringBoot集成Druid監(jiān)控頁面最小化配置操作
這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁面最小化配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)
Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來完成,下面看一個簡單的示例就明白了2014-01-01最新評論