经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
SpringBoot发送html邮箱验证码功能
来源:jb51  时间:2021/12/17 14:06:13  对本文有异议

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

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

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


3. 后端核心代码(通用版)

3.1 SendEmailVO实体类

  1. package com.example.han.model.VO;
  2.  
  3. import io.swagger.v3.oas.annotations.media.Schema;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import java.util.Map;
  8.  
  9. @Data
  10. @AllArgsConstructor
  11. @NoArgsConstructor
  12. @Schema(description = "发送邮件VO实体类")
  13. public class SendEmailVO {
  14. @Schema(description = "收件人邮箱")
  15. String toAddress;
  16. @Schema(description = "模板名")
  17. String modelName;
  18. @Schema(description = "邮件标题")
  19. String title;
  20. @Schema(description = "文本里所需要参数")
  21. Map<String,String> parameters;
  22. @Schema(description = "调用者类型(管理员/服务)")
  23. String manageType;
  24. @Schema(description = "(调用者/服务)名称")
  25. String manager;
  26. }
  27.  

3.2 Controller层核心代码

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

3.3 ServiceImpl层核心代码

  1. @Autowired
  2. HtmlEmailServiceImpl htmlEmailService;
  3. /**
  4. * 通过模板名查找html文本
  5. * @param name 模板名
  6. * @return 返回html文本
  7. */
  8. public String getTextByName(String name){
  9. List<MailModelDO> lists = mailRepository.getAllMailModel();
  10. for (MailModelDO list : lists){
  11. if(list.getModelName().equals(name)){
  12. return list.getHtmlText();
  13. }
  14. }
  15. return "NOT FOUND";
  16. }
  17. /**
  18. * 发送邮件的操作
  19. * @param sendEmailVO 发送邮件VO实体类
  20. * @return 收件人邮箱
  21. */
  22. public ResultReturn sendEmailByParam(SendEmailVO sendEmailVO){
  23. String str = getTextByName(sendEmailVO.getModelName());
  24. if(!CheckMail.checkMail(sendEmailVO.getToAddress())){
  25. return ResultReturnUtil.fail(WRONG_EMAIL_ADDRESS);
  26. }
  27. if(sendEmailVO.getTitle().equals("")){
  28. return ResultReturnUtil.fail(EMPTY_TITLE);
  29. }
  30. if(str.equals("NOT FOUND")){
  31. return ResultReturnUtil.fail(FIND_MODEL_FAILED);
  32. }
  33. ReplaceWordUtil replaceWordUtil = new ReplaceWordUtil();
  34. String content = replaceWordUtil.replaceWord(str,sendEmailVO.getParameters());
  35.  
  36. MailInfoTO info = new MailInfoTO();
  37. info.setToAddress(sendEmailVO.getToAddress());
  38. info.setSubject(sendEmailVO.getTitle());
  39. info.setContent(content);
  40. try {
  41. htmlEmailService.sendHtmlMail(info);
  42. } catch (Exception e) {
  43. //System.out.print("'"+sendEmailVO.getTitle()+"'的邮件发送失败!");
  44. e.printStackTrace();
  45. }
  46. MailHistoryDO mailHistoryDO = ToBeMailHistoryDO(sendEmailVO);
  47. mailRepository.saveHistory(mailHistoryDO);
  48. return ResultReturnUtil.success(SEND_EMAIL_SUCCESS,sendEmailVO.getToAddress());
  49. }

3.4 利用正则检查邮箱是否合法工具类

  1. package com.example.han.util;
  2.  
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. public class CheckMail {
  7. public static boolean checkMail(String mail){
  8. Pattern pattern=Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
  9. //\w+@(\w+.)+[a-z]{2,3}
  10. Matcher matcher=pattern.matcher(mail);
  11. return matcher.matches();
  12. }
  13. }

3.5 字符替换工具类

就是为了将模板中的花括号替换成真正需要的东西

  1. package com.example.han.util;
  2.  
  3. import java.util.Iterator;
  4. import java.util.Map;
  5.  
  6. /**
  7. * 将str通过map的key转换成value
  8. */
  9. public class ReplaceWordUtil {
  10. public String replaceWord(String str, Map<String,String> map) {
  11. Iterator iter = map.entrySet().iterator();
  12. while (iter.hasNext()) {
  13. Map.Entry entry = (Map.Entry) iter.next();
  14. Object key = entry.getKey();
  15. Object value = entry.getValue();
  16. str = str.replace("{{"+key+"}}",value+"");
  17. //System.out.println(key+":"+value);
  18. }
  19. //System.out.println(str);
  20. return str;
  21. }
  22. }

3.6 Reposity层 逻辑并不是很好,是找出来所有模版以后,开始遍历出来想要的那一个

  1. package com.example.han.repository;
  2.  
  3. import com.example.han.model.DO.MailHistoryDO;
  4. import com.example.han.model.DO.MailModelDO;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.mongodb.core.MongoTemplate;
  7. import org.springframework.data.mongodb.core.query.Query;
  8. import org.springframework.stereotype.Repository;
  9.  
  10. import java.util.List;
  11.  
  12. @Repository
  13. public class MailRepository {
  14. @Autowired
  15. MongoTemplate mongoTemplate;
  16.  
  17. public List<MailModelDO> getAllMailModel(){
  18. System.out.println(mongoTemplate.findAll(MailModelDO.class));
  19. return mongoTemplate.findAll(MailModelDO.class);
  20. }
  21. }

3.7 发送html邮件的核心配置类

  1. package com.example.han.service.impl;
  2.  
  3. import com.example.han.model.TO.MailInfoTO;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.stereotype.Service;
  6.  
  7. import javax.mail.*;
  8. import javax.mail.internet.InternetAddress;
  9. import javax.mail.internet.MimeBodyPart;
  10. import javax.mail.internet.MimeMessage;
  11. import javax.mail.internet.MimeMultipart;
  12. import java.util.Date;
  13. import java.util.Properties;
  14.  
  15.  
  16. @Service
  17. public class HtmlEmailServiceImpl{
  18. @Value("${spring.mail.host}")
  19. private String host;
  20.  
  21. @Value("${spring.mail.username}")
  22. private String formName;
  23.  
  24. @Value("${spring.mail.password}")
  25. private String password;
  26.  
  27. @Value("${spring.mail.username}")
  28. private String replayAddress;
  29.  
  30. /**
  31. * 发送html邮件
  32. * @param info MailInfo实体类
  33. * @throws Exception 抛出异常
  34. */
  35. public void sendHtmlMail(MailInfoTO info) throws Exception {
  36. System.out.println(host);
  37. System.out.println(formName);
  38. info.setHost(host);
  39. info.setFormName(formName);
  40. info.setFormPassword(password); //网易邮箱的授权码~不一定是密码
  41. info.setReplayAddress(replayAddress);
  42. System.out.println(info.getHost());
  43. System.out.println(info.getContent());
  44.  
  45. Message message = getMessage(info);
  46. // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
  47. Multipart mainPart = new MimeMultipart();
  48. // 创建一个包含HTML内容的MimeBodyPart
  49. BodyPart html = new MimeBodyPart();
  50. // 设置HTML内容
  51. html.setContent(info.getContent(), "text/html; charset=utf-8");
  52. mainPart.addBodyPart(html);
  53. // 将MiniMultipart对象设置为邮件内容
  54. message.setContent(mainPart);
  55. Transport.send(message);
  56. }
  57.  
  58. public Message getMessage(MailInfoTO info) throws Exception{
  59. final Properties p = System.getProperties() ;
  60. p.setProperty("mail.smtp.host", info.getHost());
  61. p.setProperty("mail.smtp.auth", "true");
  62. p.setProperty("mail.smtp.user", info.getFormName());
  63. p.setProperty("mail.smtp.pass", info.getFormPassword());
  64.  
  65. // 根据邮件会话属性和密码验证器构造一个发送邮件的session
  66. Session session = Session.getInstance(p, new Authenticator(){
  67. protected PasswordAuthentication getPasswordAuthentication() {
  68. return new PasswordAuthentication(p.getProperty("mail.smtp.user"),p.getProperty("mail.smtp.pass"));
  69. }
  70. });
  71. session.setDebug(true);
  72. Message message = new MimeMessage(session);
  73. //消息发送的主题
  74. message.setSubject(info.getSubject());
  75. //接受消息的人
  76. message.setReplyTo(InternetAddress.parse(info.getReplayAddress()));
  77. //消息的发送者
  78. message.setFrom(new InternetAddress(p.getProperty("mail.smtp.user"),"这是我的名字"));
  79. // 创建邮件的接收者地址,并设置到邮件消息中
  80. message.setRecipient(Message.RecipientType.TO,new InternetAddress(info.getToAddress()));
  81. // 消息发送的时间
  82. message.setSentDate(new Date());
  83. return message ;
  84. }
  85. }
  86.  

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

4.1 Controller层

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

4.2 ServiceImpl层

  • 这里我都配置到系统里去了,每次就不用管理员手动发送,只要用户发个请求,系统就能自动生成并发送验证码。
  • 里面的工具类还有一些方法,可以查阅上面通用版里面的代码,这里我就不赘述了。
  1. @Override
  2. public ResultReturn sendForgetCode(String email) throws MyException {
  3. if(!CheckMail.checkMail(email)){
  4. throw new MyException(400,WRONG_EMAIL_ADDRESS);
  5. }
  6. String num = ""+RandomUtil.Code();
  7. redisUtil.setRedisKey("forgetCode", num, 60*5); //先存入redis
  8. SendEmailVO sendEmailVO = new SendEmailVO();
  9. sendEmailVO.setManageType("System");
  10. sendEmailVO.setManager("ForgetPasswordSystem");
  11. sendEmailVO.setModelName("forgetCode"); //需要用的模版名字
  12. Map map = new HashMap<String,String>();
  13. map.put("code",num);
  14. sendEmailVO.setParameters(map);
  15. sendEmailVO.setTitle("诗云-忘记密码-验证码");
  16. sendEmailVO.setToAddress(email);
  17. sendEmailService.sendEmailByParam(sendEmailVO);
  18. return ResultReturnUtil.success(SEND_VERIFICATION_CODE_SUCCESS,email);
  19. }

5. html邮件内容

5.1 注册验证码模板

https://www.jb51.net/article/180220.htm

到此这篇关于SpringBoot发送html邮箱验证码的文章就介绍到这了,更多相关SpringBoot发送邮箱验证码内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号