|
@@ -12,11 +12,10 @@ import com.fjhx.config.TaskPoolConfig;
|
|
|
import com.fjhx.config.exception.EmailEngineException;
|
|
|
import com.fjhx.config.redis.RedisCache;
|
|
|
import com.fjhx.constants.RedisConstant;
|
|
|
-import com.fjhx.constants.SendConstant;
|
|
|
import com.fjhx.entity.EmailInfo;
|
|
|
import com.fjhx.entity.EmailMessage;
|
|
|
import com.fjhx.entity.EmailMessageAttachment;
|
|
|
-import com.fjhx.entity.EmailMessageSend;
|
|
|
+import com.fjhx.entity.EmailMessageContent;
|
|
|
import com.fjhx.enums.SendEventEnum;
|
|
|
import com.fjhx.service.*;
|
|
|
import com.fjhx.utils.EmailEngineUtil;
|
|
@@ -31,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
import java.util.concurrent.Executor;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@Slf4j
|
|
|
@Service
|
|
@@ -48,9 +48,17 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
@Autowired
|
|
|
private IEmailMessageAttachmentService emailMessageAttachmentService;
|
|
|
|
|
|
- @Qualifier(TaskPoolConfig.taskExecutor)
|
|
|
@Autowired
|
|
|
- private Executor executor;
|
|
|
+ private IEmailMessageContentService emailMessageContentService;
|
|
|
+
|
|
|
+
|
|
|
+ @Qualifier(TaskPoolConfig.SYNC_MAILBOX_EXECUTOR)
|
|
|
+ @Autowired
|
|
|
+ private Executor syncMailboxExecutor;
|
|
|
+
|
|
|
+ @Qualifier(TaskPoolConfig.EXECUTOR)
|
|
|
+ @Autowired
|
|
|
+ private Executor syncExecutor;
|
|
|
|
|
|
/**
|
|
|
* 每页获取多少封邮件
|
|
@@ -60,12 +68,9 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public EmailInfo binding(BindingVo bindingVo) {
|
|
|
-
|
|
|
+ String email = bindingVo.getEmail();
|
|
|
EmailInfo emailInfo;
|
|
|
-
|
|
|
try {
|
|
|
- String email = bindingVo.getEmail();
|
|
|
-
|
|
|
emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, email));
|
|
|
// 如果存在,直接返回邮箱信息
|
|
|
if (emailInfo != null) {
|
|
@@ -77,7 +82,6 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailEngineUtil.createAccount(bindingVo);
|
|
|
// redis添加同步进度
|
|
|
this.progressInitialization(bindingVo);
|
|
|
-
|
|
|
} catch (Exception e) {
|
|
|
EmailEngineUtil.deleteAccount(bindingVo.getEmail());
|
|
|
throw e;
|
|
@@ -149,11 +153,10 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
String mailbox = bindingVo.getPath();
|
|
|
int pages = bindingVo.getPages();
|
|
|
|
|
|
- executor.execute(() -> {
|
|
|
+ syncMailboxExecutor.execute(() -> {
|
|
|
int page = pageFlag;
|
|
|
try {
|
|
|
while (page < pages) {
|
|
|
- ThreadUtil.sleep(3000);
|
|
|
// 分页获取文件夹邮件
|
|
|
MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, page, SIZE);
|
|
|
// 邮件信息
|
|
@@ -171,7 +174,6 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
} catch (Exception e) {
|
|
|
log.error("未知原因同步邮件失败:{}", email, e);
|
|
|
}
|
|
|
-
|
|
|
});
|
|
|
|
|
|
String redisKey = RedisConstant.PROGRESS_KEY + email;
|
|
@@ -193,13 +195,11 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
emailMessageList.add(message);
|
|
|
|
|
|
List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
|
|
|
-
|
|
|
if (attachments != null && attachments.size() > 0) {
|
|
|
for (MessageVo.MessagesDTO.AttachmentsDTO attachment : attachments) {
|
|
|
emailMessageAttachmentList.add(this.createMessageAttachment(message, attachment));
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
// 保存邮件
|
|
@@ -254,83 +254,6 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 添加推送信息
|
|
|
- */
|
|
|
- private void addMessageSend(List<EmailMessageSend> emailMessageSendList, MessageVo.MessagesDTO messagesDTO) {
|
|
|
- // 收件人
|
|
|
- List<MessageVo.MessagesDTO.ToDTO> to = messagesDTO.getTo();
|
|
|
- if (ObjectUtils.isNotEmpty(to)) {
|
|
|
- for (MessageVo.MessagesDTO.ToDTO toDTO : to) {
|
|
|
- EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstant.TO);
|
|
|
- emailMessageSend.setName(toDTO.getName());
|
|
|
- emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
- emailMessageSendList.add(emailMessageSend);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 抄送人
|
|
|
- List<MessageVo.MessagesDTO.ToDTO> cc = messagesDTO.getCc();
|
|
|
- if (ObjectUtils.isNotEmpty(cc)) {
|
|
|
- for (MessageVo.MessagesDTO.ToDTO toDTO : cc) {
|
|
|
- EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstant.CC);
|
|
|
- emailMessageSend.setName(toDTO.getName());
|
|
|
- emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
- emailMessageSendList.add(emailMessageSend);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 密送人
|
|
|
- List<MessageVo.MessagesDTO.ToDTO> bcc = messagesDTO.getBcc();
|
|
|
- if (ObjectUtils.isNotEmpty(bcc)) {
|
|
|
- for (MessageVo.MessagesDTO.ToDTO toDTO : cc) {
|
|
|
- EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageSend.setType(SendConstant.BCC);
|
|
|
- emailMessageSend.setName(toDTO.getName());
|
|
|
- emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
- emailMessageSendList.add(emailMessageSend);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 下载并添加附件信息
|
|
|
- */
|
|
|
- private void addMessageAttachment(String email, List<EmailMessageAttachment> emailMessageAttachmentList, MessageVo.MessagesDTO messagesDTO) {
|
|
|
-
|
|
|
- List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
|
|
|
- if (ObjectUtils.isNotEmpty(attachments)) {
|
|
|
- for (MessageVo.MessagesDTO.AttachmentsDTO attachment : attachments) {
|
|
|
- String attachmentId = attachment.getId();
|
|
|
-
|
|
|
- String newFileName = attachmentId + "." + FileUtil.getSuffix(attachment.getFilename());
|
|
|
-
|
|
|
- EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
|
|
|
- emailMessageAttachment.setAttachmentId(attachmentId);
|
|
|
- emailMessageAttachment.setMessageId(messagesDTO.getId());
|
|
|
- emailMessageAttachment.setName(attachment.getFilename());
|
|
|
- emailMessageAttachment.setPath(email + "\\" + newFileName);
|
|
|
- emailMessageAttachment.setSize(attachment.getEncodedSize());
|
|
|
- emailMessageAttachmentList.add(emailMessageAttachment);
|
|
|
-
|
|
|
- // 下载附件
|
|
|
- try {
|
|
|
- RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(email, attachmentId, newFileName));
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("下载附件失败:email:{},attachmentId:{}", email, attachmentId, e);
|
|
|
-
|
|
|
- RedisCache.set(RedisConstant.DOWNLOAD_FAIL_FILE_KEY + email + ":" + attachmentId, emailMessageAttachment);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
* 同步邮件进度
|
|
|
*/
|
|
|
private void synchronizationProgress(String email, List<MessageVo.MessagesDTO> messagesDTOList) {
|
|
@@ -355,7 +278,7 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, account));
|
|
|
Assert.notNull(emailInfo, "未找到邮箱信息");
|
|
|
} catch (Exception e) {
|
|
|
- log.error("查找邮箱失败", e);
|
|
|
+ log.error("查找邮箱失败: {}", account, e);
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -366,15 +289,51 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailMessage emailMessage = this.createMessage(emailInfo.getId(), emailInfo.getEmail(), messagesDTO);
|
|
|
emailMessageService.save(emailMessage);
|
|
|
|
|
|
- // 保存推送人信息
|
|
|
- List<EmailMessageSend> emailMessageSendList = new ArrayList<>();
|
|
|
- this.addMessageSend(emailMessageSendList, messagesDTO);
|
|
|
- emailMessageSendService.saveBatch(emailMessageSendList);
|
|
|
+ // 保存邮箱附件
|
|
|
+ List<EmailMessageAttachment> emailMessageAttachmentList;
|
|
|
+ List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
|
|
|
+ if (attachments == null || attachments.size() == 0) {
|
|
|
+ emailMessageAttachmentList = null;
|
|
|
+ } else {
|
|
|
+ emailMessageAttachmentList = attachments.stream()
|
|
|
+ .map(attachment -> this.createMessageAttachment(emailMessage, attachment))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ emailMessageAttachmentService.saveOrUpdateBatch(emailMessageAttachmentList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 下载正文
|
|
|
+ syncExecutor.execute(() -> {
|
|
|
+ String messageId = emailMessage.getMessageId();
|
|
|
+ // 正文内容
|
|
|
+ MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(account, messagesDTO.getId());
|
|
|
+ MessageDetailVo.TextDTO text = messageDetail.getText();
|
|
|
+ if (ObjectUtils.isNotEmpty(text)) {
|
|
|
+ EmailMessageContent emailMessageContent = new EmailMessageContent();
|
|
|
+ emailMessageContent.setMessageId(messageId);
|
|
|
+ emailMessageContent.setHtmlContent(text.getHtml());
|
|
|
+ emailMessageContentService.saveOrUpdate(emailMessageContent);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 下载附件
|
|
|
+ if (emailMessageAttachmentList != null) {
|
|
|
+ syncExecutor.execute(() -> {
|
|
|
+ for (EmailMessageAttachment attachment : emailMessageAttachmentList) {
|
|
|
+ String attachmentId = attachment.getAttachmentId();
|
|
|
+ String path = attachment.getPath();
|
|
|
+
|
|
|
+ // 下载附件
|
|
|
+ try {
|
|
|
+ RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(account, attachmentId, path));
|
|
|
+ attachment.setIsDownload(true);
|
|
|
+ emailMessageAttachmentService.updateById(attachment);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("下载附件失败:email:{},attachmentId:{}", account, attachmentId, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
|
|
|
- // 保存附件信息
|
|
|
- List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
|
|
|
- this.addMessageAttachment(account, emailMessageAttachmentList, messagesDTO);
|
|
|
- emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
|
|
|
}
|
|
|
|
|
|
/**
|