|
@@ -18,9 +18,7 @@ import com.simuwang.base.pojo.dos.*;
|
|
|
import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
|
|
|
import com.simuwang.base.pojo.dto.EmailFundNavDTO;
|
|
|
import com.simuwang.base.pojo.dto.MailboxInfoDTO;
|
|
|
-import jakarta.mail.Folder;
|
|
|
-import jakarta.mail.Message;
|
|
|
-import jakarta.mail.Store;
|
|
|
+import jakarta.mail.*;
|
|
|
import jakarta.mail.internet.MimeMultipart;
|
|
|
import jakarta.mail.search.ComparisonTerm;
|
|
|
import jakarta.mail.search.ReceivedDateTerm;
|
|
@@ -33,6 +31,8 @@ import org.springframework.stereotype.Service;
|
|
|
import java.io.File;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -89,6 +89,7 @@ public class EmailParseService {
|
|
|
* @param endDate 邮件截止日期(yyyy-MM-dd HH:mm:ss, 为null,将解析邮件日期小于等于startDate的当天邮件)
|
|
|
*/
|
|
|
public void parseEmail(MailboxInfoDTO mailboxInfoDTO, Date startDate, Date endDate) {
|
|
|
+ log.info("开始邮件解析 -> 邮箱信息:{},开始时间:{},结束时间:{}", mailboxInfoDTO, DateUtil.format(startDate, DateConst.YYYY_MM_DD_HH_MM_SS), DateUtil.format(endDate, DateConst.YYYY_MM_DD_HH_MM_SS));
|
|
|
// 邮件类型配置
|
|
|
Map<Integer, List<String>> emailTypeMap = getEmailType();
|
|
|
// 邮件字段识别映射表
|
|
@@ -120,6 +121,7 @@ public class EmailParseService {
|
|
|
}
|
|
|
// 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
|
|
|
saveRelatedTable(mailboxInfoDTO.getAccount(), emailContentInfoDTOList, fileNameNavMap);
|
|
|
+ log.info("结束邮件解析 -> 邮箱信息:{},开始时间:{},结束时间:{}", mailboxInfoDTO, DateUtil.format(startDate, DateConst.YYYY_MM_DD_HH_MM_SS), DateUtil.format(endDate, DateConst.YYYY_MM_DD_HH_MM_SS));
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -388,7 +390,20 @@ public class EmailParseService {
|
|
|
}
|
|
|
|
|
|
private void saveFundAlias(String fundName, String registerNumber) {
|
|
|
- List<FundAliasDO> fundAliasDOList = fundAliasMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
|
|
|
+ // 未识别到基金名称和备案编码的数据不写入别名管理
|
|
|
+ if (StrUtil.isBlank(fundName) && StrUtil.isBlank(registerNumber)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<FundAliasDO> fundAliasDOList = CollUtil.newArrayList();
|
|
|
+ if (StrUtil.isNotBlank(fundName) && StrUtil.isNotBlank(registerNumber)) {
|
|
|
+ fundAliasDOList = fundAliasMapper.queryFundByNameAndRegisterNumber(fundName, registerNumber);
|
|
|
+ }
|
|
|
+ if (StrUtil.isBlank(fundName) && StrUtil.isNotBlank(registerNumber)) {
|
|
|
+ fundAliasDOList = fundAliasMapper.queryFundByRegisterNumber(registerNumber);
|
|
|
+ }
|
|
|
+ if (StrUtil.isNotBlank(fundName) && StrUtil.isBlank(registerNumber)) {
|
|
|
+ fundAliasDOList = fundAliasMapper.queryFundByName(fundName);
|
|
|
+ }
|
|
|
if (CollUtil.isNotEmpty(fundAliasDOList)) {
|
|
|
return;
|
|
|
}
|
|
@@ -435,14 +450,14 @@ public class EmailParseService {
|
|
|
}
|
|
|
|
|
|
public Map<Integer, List<String>> getEmailType() {
|
|
|
- Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap(3);
|
|
|
+ Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap(3, true);
|
|
|
EmailTypeRuleDO emailTypeRuleDO = emailTypeRuleMapper.getEmailTypeRule();
|
|
|
String nav = emailTypeRuleDO != null && StrUtil.isNotBlank(emailTypeRuleDO.getNav()) ? emailTypeRuleDO.getNav() : emailRuleConfig.getNav();
|
|
|
String valuation = emailTypeRuleDO != null && StrUtil.isNotBlank(emailTypeRuleDO.getValuation()) ? emailTypeRuleDO.getValuation() : emailRuleConfig.getValuation();
|
|
|
String report = emailTypeRuleDO != null && StrUtil.isNotBlank(emailTypeRuleDO.getReport()) ? emailTypeRuleDO.getReport() : emailRuleConfig.getReport();
|
|
|
- emailTypeMap.put(EmailTypeConst.NAV_EMAIL_TYPE, Arrays.stream(nav.split(",")).toList());
|
|
|
emailTypeMap.put(EmailTypeConst.VALUATION_EMAIL_TYPE, Arrays.stream(valuation.split(",")).toList());
|
|
|
emailTypeMap.put(EmailTypeConst.REPORT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
|
|
|
+ emailTypeMap.put(EmailTypeConst.NAV_EMAIL_TYPE, Arrays.stream(nav.split(",")).toList());
|
|
|
return emailTypeMap;
|
|
|
}
|
|
|
|
|
@@ -464,10 +479,11 @@ public class EmailParseService {
|
|
|
// 默认读取收件箱的邮件
|
|
|
Folder folder = store.getFolder("INBOX");
|
|
|
folder.open(Folder.READ_ONLY);
|
|
|
- // 获取邮件日期大于等于startDate的邮件(搜索条件只支持按天)
|
|
|
-// SearchTerm startDateTerm = new ReceivedDateTerm(ComparisonTerm.GE, startDate);
|
|
|
-// Message[] messages = folder.search(startDateTerm);
|
|
|
- Message[] messages = folder.getMessages();
|
|
|
+ Message[] messages = getEmailMessage(folder, mailboxInfoDTO.getProtocol(), startDate);
|
|
|
+ if (messages == null || messages.length == 0) {
|
|
|
+ log.info("获取不到邮件 -> 邮箱信息:{},开始时间:{},结束时间:{}", mailboxInfoDTO, startDate, endDate);
|
|
|
+ return MapUtil.newHashMap();
|
|
|
+ }
|
|
|
Map<String, List<EmailContentInfoDTO>> emailMessageMap = MapUtil.newHashMap();
|
|
|
for (Message message : messages) {
|
|
|
List<EmailContentInfoDTO> emailContentInfoDTOList = CollUtil.newArrayList();
|
|
@@ -476,11 +492,11 @@ public class EmailParseService {
|
|
|
String senderEmail;
|
|
|
try {
|
|
|
Date emailDate = message.getSentDate();
|
|
|
- boolean isNotParseConditionSatisfied = emailDate == null || (endDate == null && emailDate.compareTo(startDate) > 0) || (startDate != null && emailDate.compareTo(startDate) < 0);
|
|
|
+ boolean isNotParseConditionSatisfied = emailDate == null || (endDate != null && emailDate.compareTo(endDate) > 0) || (startDate != null && emailDate.compareTo(startDate) < 0);
|
|
|
if (isNotParseConditionSatisfied) {
|
|
|
continue;
|
|
|
}
|
|
|
- senderEmail = message.getFrom()[0].toString();
|
|
|
+ senderEmail = getSenderEmail(message.getFrom());
|
|
|
emailType = EmailUtil.getEmailTypeBySubject(message.getSubject(), emailTypeMap);
|
|
|
String emailDateStr = DateUtil.format(emailDate, DateConst.YYYY_MM_DD_HH_MM_SS);
|
|
|
if (emailType == null) {
|
|
@@ -528,4 +544,34 @@ public class EmailParseService {
|
|
|
return emailMessageMap;
|
|
|
}
|
|
|
|
|
|
+ private String getSenderEmail(Address[] senderAddress) {
|
|
|
+ if (senderAddress == null || senderAddress.length == 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ // 此时的address是含有编码(MIME编码方式)后的文本和实际的邮件地址
|
|
|
+ String address = senderAddress[0].toString();
|
|
|
+
|
|
|
+ // 正则表达式匹配邮件地址
|
|
|
+ Pattern pattern = Pattern.compile("<(\\S+)>");
|
|
|
+ Matcher matcher = pattern.matcher(address);
|
|
|
+ if (matcher.find()) {
|
|
|
+ return matcher.group(1);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Message[] getEmailMessage(Folder folder, String protocol, Date startDate) {
|
|
|
+ try {
|
|
|
+ if (protocol.contains("imap")) {
|
|
|
+ // 获取邮件日期大于等于startDate的邮件(搜索条件只支持按天)
|
|
|
+ SearchTerm startDateTerm = new ReceivedDateTerm(ComparisonTerm.GE, startDate);
|
|
|
+ return folder.search(startDateTerm);
|
|
|
+ } else {
|
|
|
+ return folder.getMessages();
|
|
|
+ }
|
|
|
+ } catch (MessagingException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|