目录

  • 1. 效果展示(用户收到的)
  • 2. 邮件推送管理(见以后的博客)
  • 3. 后端核心代码(通用版)
    • 3.1 SendEmailVO实体类
    • 3.2 Controller层核心代码
    • 3.3 ServiceImpl层核心代码
    • 3.4 利用正则检查邮箱是否合法工具类
    • 3.5 字符替换工具类
    • 3.6 Reposity层
    • 3.7 发送html邮件的核心配置类
  • 4. 后端代码(带例子版)
    • 4.1 Controller层
    • 4.2 ServiceImpl层
  • 5. html邮件内容
    • 5.1 注册验证码模板
    • 5.2 注册验证码模板

1. 效果展示(用户收到的)

2. 邮件推送管理(见以后的博客)

  • 先看看如果管理员手动发送该如何操作

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 = "发送邮件VO实体类")
public class SendEmailVO {@Schema(description = "收件人邮箱")String toAddress;@Schema(description = "模板名")String modelName;@Schema(description = "邮件标题")String title;@Schema(description = "文本里所需要参数")Map<String,String> parameters;@Schema(description = "调用者类型(管理员/服务)")String manageType;@Schema(description = "(调用者/服务)名称")String manager;
}

3.2 Controller层核心代码

   @Operation(summary = "发送html邮件")@PutMapping("/sendemail")public ResultReturn sendEmail(@RequestBody SendEmailVO sendEmailVO){return (sendModelService.sendEmailByParam(sendEmailVO));}

3.3 ServiceImpl层核心代码

@AutowiredHtmlEmailServiceImpl 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";}/*** 发送邮件的操作* @param sendEmailVO 发送邮件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()+"'的邮件发送失败!");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转换成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 {@AutowiredMongoTemplate mongoTemplate;public List<MailModelDO> getAllMailModel(){System.out.println(mongoTemplate.findAll(MailModelDO.class));return mongoTemplate.findAll(MailModelDO.class);}
}

3.7 发送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;/*** 发送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);   //网易邮箱的授权码~不一定是密码info.setReplayAddress(replayAddress);System.out.println(info.getHost());System.out.println(info.getContent());Message message = getMessage(info);// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象Multipart mainPart = new MimeMultipart();// 创建一个包含HTML内容的MimeBodyPartBodyPart html = new MimeBodyPart();// 设置HTML内容html.setContent(info.getContent(), "text/html; charset=utf-8");mainPart.addBodyPart(html);// 将MiniMultipart对象设置为邮件内容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());// 根据邮件会话属性和密码验证器构造一个发送邮件的sessionSession 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);//消息发送的主题message.setSubject(info.getSubject());//接受消息的人message.setReplyTo(InternetAddress.parse(info.getReplayAddress()));//消息的发送者message.setFrom(new InternetAddress(p.getProperty("mail.smtp.user"),"这是我的名字"));// 创建邮件的接收者地址,并设置到邮件消息中message.setRecipient(Message.RecipientType.TO,new InternetAddress(info.getToAddress()));// 消息发送的时间message.setSentDate(new Date());return message ;}
}

4. 后端代码(带例子版)

4.1 Controller层

    @Operation(summary = "设置并发送忘记密码的验证码")@PostMapping("/sendForgetPasswordCode")public ResultReturn sendForgetPasswordCode(String email) throws MyException {return userService.sendForgetCode(email);}

4.2 ServiceImpl层

  • 这里我都配置到系统里去了,每次就不用管理员手动发送,只要用户发个请求,系统就能自动生成并发送验证码。
  • 里面的工具类还有一些方法,可以查阅上面通用版里面的代码,这里我就不赘述了。
    @Overridepublic 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);    //先存入redisSendEmailVO 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邮件内容

5.1 注册验证码模板

见之后的一篇博客,先让我摸鱼会儿~~~

5.2 注册验证码模板

见之后的一篇博客,先让我摸鱼会儿~~~

SpringBoot发送html邮箱验证码相关推荐

  1. SpringBoot实现发送QQ邮箱验证码

    SpringBoot实现发送QQ邮箱验证码 打开qq邮箱官网 点击设置 找到开启服务:POP3/SMTP 然后复制给的密授权码(记住) 导入maven依赖坐标 <!--qq邮箱--> &l ...

  2. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章目录 前言 功能实现步骤 一.获取QQ邮箱授权码 二.功能界面 三.创建发送邮箱验证码的类 四.在From1中调用类中的函数,实现功能 前言   在程序设计中,发送验证码是常见的一个功能,用户在注 ...

  3. springboot发送QQ邮箱

    springboot发送电子邮箱 1.开启qq邮箱开启IMAP/SMTP服务* 首先进入qq邮箱 点击设置 点击账户,然后往下拉 开启IMAP/SMTP服务 开启成功得到授权密码,这个要记住,一会用 ...

  4. java发送QQ邮箱验证码实现登录注册、邮箱验证码防刷校验

    文章目录 一:前台功能实现 1.1 页面编写 1.2 发送验证码--sendEmailCode 1.2.1 远程调用发送接口 1.2.1 接口防刷校验--60s内只能发送一次 二:获取QQ邮箱授权码 ...

  5. java实现发送qq邮箱验证码

    1.登录qq邮箱,开启POP3/SMTP服务 路径:qq邮箱--->设置---->选择账户----> 打开 按照要求发送短信后得到授权码 得到授权码后要记得点击确定,页面拉到最下方点 ...

  6. spring boot 使用javaMailSender 发送qq邮箱验证码

    一 qq邮箱设置 1登录邮箱打开设置 2点击账号 3开启 POP3/SMTP服务 4保存密钥(这个一定要保存后面在java里面要调用) 二. spring boot代码设置 1.maven导入jar包 ...

  7. SpringBoot发送短信验证码实现

    前言 短信验证码是通过发送验证码到手机的一种有效的验证码系统.主要用于验证用户手机的合法性及敏感操作的身份验证.常见的使用场景有:登录注册.信息修改.异常登录.找回密码等操作. 此篇文章记录后台框架S ...

  8. 登录系统-发送QQ邮箱验证码(2)

    在网上找了很久的QT基于smtp的发送邮件,最后找到了一个别人写的,可以用.下面是链接: https://download.csdn.net/download/weixin_39566101/1063 ...

  9. SpringBoot整合qq邮箱验证码使用

    目录 准备工作 依赖 yml配置 Config Service层接口 ServiceImpl实现 Controller层 准备工作 依赖 <dependency><groupId&g ...

最新文章

  1. new 数组_编程-遍历数组元素N次/填充数组至指定长度
  2. ueditor与七牛云存储结合
  3. ピエタ~幸せの青い鳥~相关
  4. 中date转为string_股票数据获取篇(持续更新中...)
  5. python切片操作例题_Python之切片操作
  6. mybatis映射器${}和#{}的区别
  7. php 函数静态变量,php 函数中静态变量使用的问题实例分析
  8. 家里的所有网线都集中到了弱电箱怎么组网?
  9. 一文看尽深度学习这半年
  10. 保险公司信息系统审计刍议
  11. 精进 Quartz—Quartz大致介绍(一)
  12. 拼音模糊搜索 php,基于 XunSearch(迅搜)SDK 的全文搜索 Laravel 5.* 软件包,支持全拼、拼音简写、模糊搜索、热门搜索、搜索提示...
  13. xml文件的概述与应用场景
  14. 项目开发的完整流程(详解版)
  15. 你也可以找到好工作(二)
  16. 日记侠:写文章快速赚钱的方法就3个字
  17. Codeforces 417 D. Cunning Gena
  18. Axure 如何在页面加载时,设置文本框的内容为当前日期
  19. 天涯明月刀最新服务器,天涯明月刀手游手游开服表_天涯明月刀手游手游开服时间表_新服新区预告_第一手游网...
  20. STEP标准描述方法-EXPRESS语言

热门文章

  1. 基于部标1078视频协议和苏标Adas协议构建主动平台
  2. JDK1.8版本linux、Windows64下载
  3. JVM元数据空间增长分析
  4. 数据分析、数据挖掘、数据运营有啥区别?【通俗版】
  5. MyCAT XA分布式事务
  6. 点宽与江苏大学建设量化金融实训平台项目
  7. source insight 4.0 闪退问题
  8. 资产配置记录20210814
  9. android-刷机-filezilla-不要跟着做
  10. 解决pygame中按键连续按下的问题