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.dbjr.com.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-12
Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
SpringBoot集成Druid監(jiān)控頁面最小化配置操作
這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁面最小化配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)
Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來完成,下面看一個簡單的示例就明白了2014-01-01最新評論

