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;
/**
* 通過(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)所有模版以后,開始遍歷出來(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://chabaoo.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分鐘過(guò)期
- 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ì)象??煲黄饋?lái)看看吧2022-12-12
Java操作透明圖片并保持背景透明的實(shí)現(xiàn)
這篇文章主要介紹了Java操作透明圖片并保持背景透明的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解
這篇文章主要介紹了Springboot?配置線程池創(chuàng)建線程及配置?@Async?異步操作線程池詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
SpringBoot集成Druid監(jiān)控頁(yè)面最小化配置操作
這篇文章主要介紹了SpringBoot集成Druid監(jiān)控頁(yè)面最小化配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊
這篇文章主要介紹了springboot實(shí)現(xiàn)多模塊項(xiàng)目添加一新模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot配置線程池的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot配置線程池的實(shí)現(xiàn)示例,主要包括在Spring Boot中創(chuàng)建和配置線程池,包括設(shè)置線程池的大小、隊(duì)列容量、線程名稱等參數(shù),感興趣的可以了解一下2023-09-09
java使用randomaccessfile在文件任意位置寫入數(shù)據(jù)
Java在文件任意位置寫入數(shù)據(jù)可以使用RandomAccessFile方法來(lái)完成,下面看一個(gè)簡(jiǎn)單的示例就明白了2014-01-01

