diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java index 8da1a33422..2ee46dbf75 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java @@ -131,52 +131,47 @@ public class MailTemplateServiceImpl implements MailTemplateService { @Override public String formatMailTemplateContent(String content, Map params) { - // 先替换模板变量 + // 1. 先替换模板变量 String formattedContent = StrUtil.format(content, params); - // 反转义HTML特殊字符 + // 关联 Pull Request:https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1461 讨论 + // 2.1 反转义HTML特殊字符 formattedContent = unescapeHtml(formattedContent); - - // 处理代码块(确保
标签格式正确)
+        // 2.2 处理代码块(确保
标签格式正确)
         formattedContent = formatHtmlCodeBlocks(formattedContent);
-
-        // 将最外层的pre标签替换为div标签
+        // 2.3 将最外层的 pre 标签替换为 div 标签
         formattedContent = replaceOuterPreWithDiv(formattedContent);
-
         return formattedContent;
     }
 
     private String replaceOuterPreWithDiv(String content) {
-        if (content == null) {
-            return null;
+        if (StrUtil.isEmpty(content)) {
+            return content;
         }
-
-        // 使用正则表达式匹配所有的
标签,包括嵌套的标签
+        // 使用正则表达式匹配所有的 
 标签,包括嵌套的  标签
         String regex = "(?s)]*>(.*?)
"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(content); - - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (matcher.find()) { - // 提取
标签内的内容
+            // 提取 
 标签内的内容
             String innerContent = matcher.group(1);
-            // 返回div标签包裹的内容
+            // 返回 div 标签包裹的内容
             matcher.appendReplacement(sb, "
" + innerContent + "
"); } matcher.appendTail(sb); - return sb.toString(); } /** - * 反转义HTML特殊字符 + * 反转义 HTML 特殊字符 * * @param input 输入字符串 * @return 反转义后的字符串 */ private String unescapeHtml(String input) { - if (input == null) { - return null; + if (StrUtil.isEmpty(input)) { + return input; } return input .replace("&", "&") @@ -188,27 +183,24 @@ public class MailTemplateServiceImpl implements MailTemplateService { } /** - * 格式化HTML中的代码块 + * 格式化 HTML 中的代码块 * * @param content 邮件内容 * @return 格式化后的邮件内容 */ private String formatHtmlCodeBlocks(String content) { - // 匹配
标签的代码块
+        // 匹配 
 标签的代码块
         Pattern codeBlockPattern = Pattern.compile("(.*?)
", Pattern.DOTALL); Matcher matcher = codeBlockPattern.matcher(content); - - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); while (matcher.find()) { // 获取代码块内容 String codeBlock = matcher.group(1); - // 为代码块添加样式 String replacement = "
" + codeBlock + "
"; matcher.appendReplacement(sb, replacement); } matcher.appendTail(sb); - return sb.toString(); } @@ -216,6 +208,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { public long getMailTemplateCountByAccountId(Long accountId) { return mailTemplateMapper.selectCountByAccountId(accountId); } + /** * 解析标题和内容中的参数 */ @@ -223,7 +216,6 @@ public class MailTemplateServiceImpl implements MailTemplateService { public List parseTemplateTitleAndContentParams(String title, String content) { List titleParams = ReUtil.findAllGroup1(PATTERN_PARAMS, title); List contentParams = ReUtil.findAllGroup1(PATTERN_PARAMS, content); - // 合并参数并去重 List allParams = new ArrayList<>(titleParams); for (String param : contentParams) { diff --git a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java index 9a43e2ddae..fa9b709a71 100755 --- a/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java +++ b/yudao-module-system/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java @@ -221,7 +221,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { // 调用,并断言结果 String result = mailTemplateService.formatMailTemplateContent(content, params); - // 断言pre标签被替换为div标签 + // 断言 pre 标签被替换为 div 标签 assertTrue(result.contains("
public class Test {")); assertTrue(result.contains("System.out.println(\"Hello 测试\"")); assertTrue(result.contains("
")); @@ -233,10 +233,10 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { Map params = new HashMap<>(); params.put("content", "测试内容"); - // 测试pre标签替换为div标签 + // 测试 pre 标签替换为 div 标签 String content = "
{content}
"; String result = mailTemplateService.formatMailTemplateContent(content, params); - // 断言结果中包含div标签,而不包含pre标签 + // 断言结果中包含 div 标签,而不包含 pre 标签 assertTrue(result.contains("
测试内容
")); } @@ -247,7 +247,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { params.put("username", "testuser"); params.put("company", "测试公司"); - // 测试完整的HTML邮件模板 + // 测试完整的 HTML 邮件模板 String content = "\n \n \n \n \n Title\n \n \n
\n \n
\n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n
\n \n \n \n
\n
此邮件由系统发出,请勿直接回复或转发他人
\n

\n
\n \n \n \n \n \n \n \n \n
\n

\n 尊敬的 {username},\n

\n
\n
\n

\n 内容
\n 内容
\n 内容123

\n\n 如果您在使用过程中遇到任何问题或者有任何建议,都可以随时联系我们的客户团队,我们将竭诚为您服务。\n\n\n\n\n
\n
\n {company}
\n 地址:xxxxx
\n 邮箱:lambc77@163.com\n

\n
\n
\n
\n
\n
\n 声明:本邮件含有保密信息,仅限于收件人所用。禁止任何人未经发件人许可,以任何形式(包括但不限于部分的泄露、复制或散发)不当的使用本邮件中的信息。如果您错收了本邮件,请您立即电话或邮件通知发件人并删除本邮件,谢谢!\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n "; // 调用,并断言成功处理 @@ -255,7 +255,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { // 断言结果中包含替换后的变量 assertTrue(result.contains("尊敬的 testuser")); assertTrue(result.contains("测试公司")); - // 断言结果是有效的HTML + // 断言结果是有效的 HTML assertTrue(result.startsWith("")); } @@ -287,7 +287,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { params.put("param1", "value1"); params.put("param2", "value2"); - // 测试多个pre标签的情况 + // 测试多个 pre 标签的情况 String content = "
First code block: {param1}
\n" + "

Some text between code blocks

\n" + "
Second code block: {param2}
"; @@ -302,7 +302,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { // 准备参数 Map params = new HashMap<>(); - // 简化测试,只测试基本的HTML特殊字符 + // 简化测试,只测试基本的 HTML 特殊字符 String content = "<div>测试 & 特殊字符</div>"; String result = mailTemplateService.formatMailTemplateContent(content, params); // 断言特殊字符被正确反转义 @@ -327,7 +327,7 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { @Test public void testDifferenceWithHtmlContent() { - // 准备包含HTML格式的模板内容 + // 准备包含 HTML 格式的模板内容 String content = "
" + "

Welcome, {username}!

" + "

Your account has been created successfully.

" + @@ -347,28 +347,28 @@ public class MailTemplateServiceImplTest extends BaseDbUnitTest { params.put("role", "admin"); params.put("activationLink", "https://example.com/activate?code=12345"); - // 1. 使用parseTemplateContentParams:只提取参数名称,忽略了HTML格式 + // 1. 使用 parseTemplateContentParams:只提取参数名称,忽略了 HTML 格式 List parsedParams = mailTemplateService.parseTemplateContentParams(content); System.out.println("parseTemplateContentParams结果:" + parsedParams); - // 断言:只提取了纯参数名称,没有HTML格式 + // 断言:只提取了纯参数名称,没有 HTML 格式 assertEquals(6, parsedParams.size()); // 检查所有参数类型 - assertTrue(parsedParams.stream().filter("username"::equals).count() == 3); - assertTrue(parsedParams.stream().filter("email"::equals).count() == 1); - assertTrue(parsedParams.stream().filter("role"::equals).count() == 1); - assertTrue(parsedParams.stream().filter("activationLink"::equals).count() == 1); - // 断言:没有包含任何HTML标签 + assertEquals(3, parsedParams.stream().filter("username"::equals).count()); + assertEquals(1, parsedParams.stream().filter("email"::equals).count()); + assertEquals(1, parsedParams.stream().filter("role"::equals).count()); + assertEquals(1, parsedParams.stream().filter("activationLink"::equals).count()); + // 断言:没有包含任何 HTML 标签 for (String param : parsedParams) { assertFalse(param.contains("<")); assertFalse(param.contains(">")); } - // 2. 使用formatMailTemplateContent:处理HTML格式,生成最终内容 + // 2. 使用 formatMailTemplateContent:处理 HTML 格式,生成最终内容 String formattedContent = mailTemplateService.formatMailTemplateContent(content, params); System.out.println("formatMailTemplateContent结果:" + formattedContent); - // 断言:HTML格式被保留并处理 + // 断言:HTML 格式被保留并处理 assertTrue(formattedContent.contains("
")); assertTrue(formattedContent.contains("

Welcome, testuser!

")); assertTrue(formattedContent.contains("here"));