Explorar el Código

fix:修复附件名称报告特殊字符导致名称转码失败问题

wangzaijun hace 2 semanas
padre
commit
5569758213

+ 9 - 9
mo-daq/src/main/java/com/smppw/modaq/application/task/ParseSchedulerTask.java

@@ -29,15 +29,15 @@ public class ParseSchedulerTask {
 
     @PostConstruct
     public void executeOnStartup() {
-        try {
-            // 定期报告从 其他文件夹/报告公告 文件夹获取邮件
-            this.emailParseApiService.parseEmail(
-                    DateUtil.parseDateTime("2025-06-06 18:00:00"),
-                    DateUtil.parseDateTime("2025-06-06 18:10:01"),
-                    ListUtil.of("其他文件夹/报告公告"), EmailTypeConst.REPORT_EMAIL_TYPES);
-        } catch (Exception e) {
-            logger.error(ExceptionUtil.getMessage(e));
-        }
+//        try {
+//            // 定期报告从 其他文件夹/报告公告 文件夹获取邮件
+//            this.emailParseApiService.parseEmail(
+//                    DateUtil.parseDateTime("2025-06-06 18:00:00"),
+//                    DateUtil.parseDateTime("2025-06-06 18:10:01"),
+//                    ListUtil.of("其他文件夹/报告公告"), EmailTypeConst.REPORT_EMAIL_TYPES);
+//        } catch (Exception e) {
+//            logger.error(ExceptionUtil.getMessage(e));
+//        }
 //
 //        try {
 //            // 确认函从 INBOX 文件夹获取邮件

+ 0 - 3
mo-daq/src/main/java/com/smppw/modaq/application/util/EmailUtil.java

@@ -41,7 +41,6 @@ public class EmailUtil {
     // 解码文件名(处理 RFC 2231 和 RFC 2047)
     public static String decodeFileName(Part part) throws UnsupportedEncodingException, MessagingException {
         String filename = part.getFileName();
-        logger.info("0======================= > {}", filename);
 
         // 优先尝试 RFC 2231 的 filename*(如 "filename*=utf-8''%E4%B8%AD%E6%96%87.txt")
         String[] values = part.getHeader("Content-Disposition");
@@ -50,7 +49,6 @@ public class EmailUtil {
                 if (value.startsWith("filename*")) {
                     filename = value.split("'")[2]; // 提取编码后的字符串
                     filename = MimeUtility.decodeText(filename);
-                    logger.info("1=======================+++++++++ > {}", filename);
                     return filename;
                 }
             }
@@ -58,7 +56,6 @@ public class EmailUtil {
 
         // 处理 RFC 2047 的多段编码(如 "=?utf-8?B?5Lit?= =?utf-8?B?5paH?=.txt")
         if (filename != null && filename.contains("=?")) {
-            logger.info("2=======================----------- > {}", MimeUtility.decodeText(filename));
             return MimeUtility.decodeText(filename);
         }
 

+ 8 - 8
mo-daq/src/main/java/com/smppw/modaq/domain/service/EmailParseService.java

@@ -787,18 +787,18 @@ public class EmailParseService {
                     log.warn("{} 邮件{} 没有获取到附件", folderName, emailTitle);
                     continue;
                 }
-
                 emailContentInfoDTOList.forEach(e -> {
                     e.setEmailType(emailType);
                     e.setSenderEmail(senderEmail);
                 });
                 emailMessageMap.put(uuidKey, emailContentInfoDTOList);
+            } catch (Exception e) {
+                log.error("{} 获取邮箱的邮件{} 报错,堆栈信息:{}", folderName, emailTitle, ExceptionUtil.stacktraceToString(e));
+            } finally {
                 if (log.isInfoEnabled()) {
                     log.info("{} 邮件{} 下载完成,总计耗时{} ms,文件内容如下\n {}", folderName,
                             emailTitle, System.currentTimeMillis() - start, emailContentInfoDTOList);
                 }
-            } catch (Exception e) {
-                log.error("{} 获取邮箱的邮件{} 报错,堆栈信息:{}", folderName, emailTitle, ExceptionUtil.stacktraceToString(e));
             }
         }
         if (this.readWriteSeen) {
@@ -815,8 +815,8 @@ public class EmailParseService {
         if (StrUtil.isBlank(fileName)) {
             return;
         }
-        if (fileName.contains("\"")) {
-            fileName = fileName.replaceAll("\"", "");
+        if (fileName.contains("\"") || fileName.contains("\n")) {
+            fileName = fileName.replaceAll("\"", "").replaceAll("\n", "");
         }
         if (fileName.contains("=?")) {
             fileName = MimeUtility.decodeText(fileName);
@@ -824,14 +824,14 @@ public class EmailParseService {
         String disposition = part.getDisposition();
         String contentType = part.getContentType();
 
-        boolean attachmentFlag = StrUtil.endWithAny(fileName, ".zip", ".rar", ".pdf", ".png", ".jpg", ".docx");
+        boolean attachmentFlag = StrUtil.endWithAny(fileName, ".zip", ".rar", ".pdf", ".png", ".jpg", ".docx", ".7z");
         boolean isAttachment = attachmentFlag
                 || Part.ATTACHMENT.equalsIgnoreCase(disposition)
                 || (contentType != null && attachmentMimePrefixes.stream().anyMatch(prefix ->
                 StrUtil.startWithIgnoreCase(contentType, prefix)
         ));
         if (!isAttachment) {
-            log.warn("邮件 {} 未检测到pdf/zip/rar/png/jpg/docx类型的附件 (fileName={}, disposition={}, contentType={})",
+            log.warn("邮件 {} 未检测到pdf/zip/rar/7z/png/jpg/docx类型的附件 (fileName={}, disposition={}, contentType={})",
                     subject, fileName, disposition, contentType);
             return;
         }
@@ -840,7 +840,7 @@ public class EmailParseService {
         String filePath = path + File.separator + account + File.separator + emailDateStr + File.separator;
         // 压缩包重名时的后面的压缩包会覆盖前面压缩包的问题(不考虑普通文件)
         String emailDate = DateUtil.format(sendDate, DateConst.YYYYMMDDHHMMSS24);
-        String realName = (fileName.endsWith(".zip") || fileName.endsWith(".rar")) ? emailDate + fileName : fileName;
+        String realName = (fileName.endsWith(".zip") || fileName.endsWith(".rar") || fileName.endsWith(".7z")) ? emailDate + fileName : fileName;
         File saveFile = FileUtil.file(filePath + realName);
         if (!saveFile.exists()) {
             if (!saveFile.getParentFile().exists()) {