|
@@ -2,7 +2,6 @@ package com.fjhx.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.io.FileUtil;
|
|
import cn.hutool.core.io.FileUtil;
|
|
-import cn.hutool.core.thread.ThreadUtil;
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
@@ -16,6 +15,7 @@ import com.fjhx.vo.BindingVo;
|
|
import com.fjhx.vo.EmailMailboxVo;
|
|
import com.fjhx.vo.EmailMailboxVo;
|
|
import com.fjhx.vo.MessageDetailVo;
|
|
import com.fjhx.vo.MessageDetailVo;
|
|
import com.fjhx.vo.MessageVo;
|
|
import com.fjhx.vo.MessageVo;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -26,6 +26,7 @@ import java.util.List;
|
|
import java.util.concurrent.Executor;
|
|
import java.util.concurrent.Executor;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
+@Slf4j
|
|
@Service
|
|
@Service
|
|
public class AccountServiceImpl implements IAccountService {
|
|
public class AccountServiceImpl implements IAccountService {
|
|
|
|
|
|
@@ -106,136 +107,176 @@ public class AccountServiceImpl implements IAccountService {
|
|
*/
|
|
*/
|
|
private void asyncReadEmail(String email, List<EmailMailbox> emailMailboxList) {
|
|
private void asyncReadEmail(String email, List<EmailMailbox> emailMailboxList) {
|
|
executor.execute(() -> {
|
|
executor.execute(() -> {
|
|
- ThreadUtil.sleep(5000);
|
|
|
|
|
|
+ // ThreadUtil.sleep(5000);
|
|
|
|
|
|
// 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
// 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
- List<String> lastMessageId = new ArrayList<>();
|
|
|
|
|
|
+ List<String> lastMessageIdList = new ArrayList<>();
|
|
|
|
|
|
|
|
+ // 遍历每个邮箱
|
|
for (EmailMailbox emailMailbox : emailMailboxList) {
|
|
for (EmailMailbox emailMailbox : emailMailboxList) {
|
|
|
|
+ // 保存邮箱中的邮件
|
|
EmailEngineUtil.handleMessageList(
|
|
EmailEngineUtil.handleMessageList(
|
|
email,
|
|
email,
|
|
emailMailbox.getPath(),
|
|
emailMailbox.getPath(),
|
|
- messageList -> {
|
|
|
|
- List<EmailMessage> emailMessageList = new ArrayList<>();
|
|
|
|
- List<EmailMessageSend> emailMessageSendList = new ArrayList<>();
|
|
|
|
- List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
|
|
|
|
-
|
|
|
|
- for (MessageVo.MessagesDTO messagesDTO : messageList) {
|
|
|
|
- if (lastMessageId.contains(messagesDTO.getId())) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messagesDTO.getId());
|
|
|
|
-
|
|
|
|
- // 基本信息
|
|
|
|
- EmailMessage emailMessage = new EmailMessage();
|
|
|
|
- long id = IdWorker.getId();
|
|
|
|
- emailMessage.setId(id);
|
|
|
|
- emailMessage.setMessageId(messagesDTO.getId());
|
|
|
|
- emailMessage.setEmailMailboxId(emailMailbox.getId());
|
|
|
|
- emailMessage.setEmailMailboxPath(emailMailbox.getPath());
|
|
|
|
- emailMessage.setUnseen(messagesDTO.getUnseen());
|
|
|
|
- emailMessage.setFlagged(messagesDTO.getFlagged());
|
|
|
|
- emailMessage.setSubject(messagesDTO.getSubject());
|
|
|
|
- emailMessage.setFromDate(messagesDTO.getDate());
|
|
|
|
-
|
|
|
|
- // 发件人
|
|
|
|
- MessageVo.MessagesDTO.ToDTO from = messagesDTO.getFrom();
|
|
|
|
- if (ObjectUtils.isNotEmpty(from)) {
|
|
|
|
- emailMessage.setFromName(from.getName());
|
|
|
|
- emailMessage.setFromAddress(from.getAddress());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 正文内容
|
|
|
|
- MessageDetailVo.TextDTO text = messageDetail.getText();
|
|
|
|
- if (ObjectUtils.isNotEmpty(text)) {
|
|
|
|
- emailMessage.setHtmlContent(text.getHtml());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 收件人
|
|
|
|
- List<MessageVo.MessagesDTO.ToDTO> to = messagesDTO.getTo();
|
|
|
|
- if (ObjectUtils.isNotEmpty(to)) {
|
|
|
|
- for (MessageVo.MessagesDTO.ToDTO toDTO : to) {
|
|
|
|
- EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
|
- emailMessageSend.setEmailMessageId(id);
|
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
- emailMessageSend.setType(SendConstants.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.setEmailMessageId(id);
|
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
- emailMessageSend.setType(SendConstants.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.setEmailMessageId(id);
|
|
|
|
- emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
- emailMessageSend.setType(SendConstants.BCC);
|
|
|
|
- emailMessageSend.setName(toDTO.getName());
|
|
|
|
- emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
|
- emailMessageSendList.add(emailMessageSend);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- 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());
|
|
|
|
-
|
|
|
|
- // 异常重试
|
|
|
|
- boolean execute = RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(email, attachmentId, newFileName));
|
|
|
|
-
|
|
|
|
- // TODO 下载失败加入日志
|
|
|
|
- if (execute) {
|
|
|
|
- EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
|
|
|
|
- emailMessageAttachment.setEmailMessageId(id);
|
|
|
|
- emailMessageAttachment.setMessageId(messagesDTO.getId());
|
|
|
|
- emailMessageAttachment.setName(attachment.getFilename());
|
|
|
|
- emailMessageAttachment.setPath(email + "\\" + newFileName);
|
|
|
|
- emailMessageAttachment.setAttachmentId(attachmentId);
|
|
|
|
- emailMessageAttachment.setSize(attachment.getEncodedSize());
|
|
|
|
- emailMessageAttachmentList.add(emailMessageAttachment);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- emailMessageList.add(emailMessage);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- emailMessageService.saveBatch(emailMessageList);
|
|
|
|
- emailMessageSendService.saveBatch(emailMessageSendList);
|
|
|
|
- emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
|
|
|
|
-
|
|
|
|
- lastMessageId.clear();
|
|
|
|
- for (EmailMessage emailMessage : emailMessageList) {
|
|
|
|
- lastMessageId.add(emailMessage.getMessageId());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ messageList -> this.saveBatchMessage(email, lastMessageIdList, emailMailbox, messageList)
|
|
);
|
|
);
|
|
}
|
|
}
|
|
|
|
+
|
|
});
|
|
});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 批量保存邮件信息
|
|
|
|
+ */
|
|
|
|
+ private void saveBatchMessage(String email, List<String> lastMessageId, EmailMailbox emailMailbox, List<MessageVo.MessagesDTO> messageList) {
|
|
|
|
+ List<EmailMessage> emailMessageList = new ArrayList<>();
|
|
|
|
+ List<EmailMessageSend> emailMessageSendList = new ArrayList<>();
|
|
|
|
+ List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
|
|
|
|
+
|
|
|
|
+ for (MessageVo.MessagesDTO messagesDTO : messageList) {
|
|
|
|
+ if (lastMessageId.contains(messagesDTO.getId())) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 生成邮件实体
|
|
|
|
+ EmailMessage emailMessage = createMessage(email, emailMailbox, messagesDTO);
|
|
|
|
+
|
|
|
|
+ emailMessageList.add(emailMessage);
|
|
|
|
+
|
|
|
|
+ // 添加推送信息
|
|
|
|
+ addMessageSend(emailMessageSendList, messagesDTO, emailMessage.getId());
|
|
|
|
+
|
|
|
|
+ // 下载并添加附件信息
|
|
|
|
+ addMessageAttachment(email, emailMessageAttachmentList, messagesDTO, emailMessage.getId());
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ emailMessageService.saveBatch(emailMessageList);
|
|
|
|
+ emailMessageSendService.saveBatch(emailMessageSendList);
|
|
|
|
+ emailMessageAttachmentService.saveBatch(emailMessageAttachmentList);
|
|
|
|
+
|
|
|
|
+ lastMessageId.clear();
|
|
|
|
+ for (EmailMessage emailMessage : emailMessageList) {
|
|
|
|
+ lastMessageId.add(emailMessage.getMessageId());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 生成邮件实体
|
|
|
|
+ */
|
|
|
|
+ private EmailMessage createMessage(String email, EmailMailbox emailMailbox, MessageVo.MessagesDTO messagesDTO) {
|
|
|
|
+
|
|
|
|
+ EmailMessage emailMessage = new EmailMessage();
|
|
|
|
+ emailMessage.setId(IdWorker.getId());
|
|
|
|
+ emailMessage.setMessageId(messagesDTO.getId());
|
|
|
|
+ emailMessage.setEmailMailboxId(emailMailbox.getId());
|
|
|
|
+ emailMessage.setEmailMailboxPath(emailMailbox.getPath());
|
|
|
|
+ emailMessage.setUnseen(messagesDTO.getUnseen());
|
|
|
|
+ emailMessage.setFlagged(messagesDTO.getFlagged());
|
|
|
|
+ emailMessage.setSubject(messagesDTO.getSubject());
|
|
|
|
+ emailMessage.setFromDate(messagesDTO.getDate());
|
|
|
|
+
|
|
|
|
+ // 发件人
|
|
|
|
+ MessageVo.MessagesDTO.ToDTO from = messagesDTO.getFrom();
|
|
|
|
+ if (ObjectUtils.isNotEmpty(from)) {
|
|
|
|
+ emailMessage.setFromName(from.getName());
|
|
|
|
+ emailMessage.setFromAddress(from.getAddress());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 正文内容
|
|
|
|
+ MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messagesDTO.getId());
|
|
|
|
+ MessageDetailVo.TextDTO text = messageDetail.getText();
|
|
|
|
+ if (ObjectUtils.isNotEmpty(text)) {
|
|
|
|
+ emailMessage.setHtmlContent(text.getHtml());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return emailMessage;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 添加推送信息
|
|
|
|
+ */
|
|
|
|
+ private void addMessageSend(List<EmailMessageSend> emailMessageSendList, MessageVo.MessagesDTO messagesDTO, Long emailMessageId) {
|
|
|
|
+ // 收件人
|
|
|
|
+ List<MessageVo.MessagesDTO.ToDTO> to = messagesDTO.getTo();
|
|
|
|
+ if (ObjectUtils.isNotEmpty(to)) {
|
|
|
|
+ for (MessageVo.MessagesDTO.ToDTO toDTO : to) {
|
|
|
|
+ EmailMessageSend emailMessageSend = new EmailMessageSend();
|
|
|
|
+ emailMessageSend.setEmailMessageId(emailMessageId);
|
|
|
|
+ emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
+ emailMessageSend.setType(SendConstants.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.setEmailMessageId(emailMessageId);
|
|
|
|
+ emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
+ emailMessageSend.setType(SendConstants.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.setEmailMessageId(emailMessageId);
|
|
|
|
+ emailMessageSend.setMessageId(messagesDTO.getId());
|
|
|
|
+ emailMessageSend.setType(SendConstants.BCC);
|
|
|
|
+ emailMessageSend.setName(toDTO.getName());
|
|
|
|
+ emailMessageSend.setAddress(toDTO.getAddress());
|
|
|
|
+ emailMessageSendList.add(emailMessageSend);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 下载并添加附件信息
|
|
|
|
+ */
|
|
|
|
+ private void addMessageAttachment(String email, List<EmailMessageAttachment> emailMessageAttachmentList,
|
|
|
|
+ MessageVo.MessagesDTO messagesDTO, Long emailMessageId) {
|
|
|
|
+
|
|
|
|
+ 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());
|
|
|
|
+
|
|
|
|
+ // 下载附件
|
|
|
|
+ try {
|
|
|
|
+ Boolean flag = RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(email, attachmentId, newFileName));
|
|
|
|
+
|
|
|
|
+ if (flag) {
|
|
|
|
+ EmailMessageAttachment emailMessageAttachment = new EmailMessageAttachment();
|
|
|
|
+ emailMessageAttachment.setEmailMessageId(emailMessageId);
|
|
|
|
+ emailMessageAttachment.setMessageId(messagesDTO.getId());
|
|
|
|
+ emailMessageAttachment.setName(attachment.getFilename());
|
|
|
|
+ emailMessageAttachment.setPath(email + "\\" + newFileName);
|
|
|
|
+ emailMessageAttachment.setAttachmentId(attachmentId);
|
|
|
|
+ emailMessageAttachment.setSize(attachment.getEncodedSize());
|
|
|
|
+ emailMessageAttachmentList.add(emailMessageAttachment);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("下载附件失败:", e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|