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 = "郵件標(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實體類
* @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://www.dhdzp.com/article/180220.htm
到此這篇關(guān)于SpringBoot發(fā)送html郵箱驗證碼的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送郵箱驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud Gateway的路由,過濾器和限流解讀
這篇文章主要介紹了SpringCloud Gateway的路由,過濾器和限流解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
關(guān)于jdk環(huán)境變量配置以及javac不是內(nèi)部或外部命令的解決
這篇文章主要介紹了關(guān)于jdk環(huán)境變量配置以及javac不是內(nèi)部或外部命令的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
spring boot actuator監(jiān)控超詳細(xì)教程
Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據(jù)的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據(jù),接下來通過本文給大家介紹spring boot actuator監(jiān)控超詳細(xì)教程,感興趣的朋友一起看看吧2021-10-10
java中元素排序Comparable和Comparator的區(qū)別
本文主要介紹了java中元素排序Comparable和Comparator的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
SpringMVC配置javaConfig及StringHttpMessageConverter示例
這篇文章主要介紹了SpringMVC配置javaConfig及StringHttpMessageConverter實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Java char[]數(shù)組轉(zhuǎn)成String類型詳細(xì)介紹
這篇文章詳細(xì)介紹了Java char[]數(shù)組轉(zhuǎn)成String類型(char to String)的方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀2023-04-04

