|
@@ -10,10 +10,14 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
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.*;
|
|
|
+import com.fjhx.entity.EmailInfo;
|
|
|
+import com.fjhx.entity.EmailMessage;
|
|
|
+import com.fjhx.entity.EmailMessageAttachment;
|
|
|
+import com.fjhx.entity.EmailMessageSend;
|
|
|
import com.fjhx.enums.SendEventEnum;
|
|
|
import com.fjhx.service.*;
|
|
|
import com.fjhx.utils.EmailEngineUtil;
|
|
@@ -37,9 +41,6 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
private IEmailInfoService emailInfoService;
|
|
|
|
|
|
@Autowired
|
|
|
- private IEmailMailboxService emailMailboxService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
private IEmailMessageService emailMessageService;
|
|
|
|
|
|
@Autowired
|
|
@@ -56,10 +57,12 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
@Override
|
|
|
public EmailInfo binding(BindingVo bindingVo) {
|
|
|
|
|
|
+ EmailInfo emailInfo;
|
|
|
+
|
|
|
try {
|
|
|
String email = bindingVo.getEmail();
|
|
|
|
|
|
- EmailInfo emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, email));
|
|
|
+ emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, email));
|
|
|
// 如果存在,直接返回邮箱信息
|
|
|
if (emailInfo != null) {
|
|
|
return emailInfo;
|
|
@@ -70,14 +73,15 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
EmailEngineUtil.createAccount(bindingVo);
|
|
|
// redis添加同步进度
|
|
|
this.progressInitialization(bindingVo);
|
|
|
- // 异步遍历文件夹下的所有邮件
|
|
|
- this.asyncReadEmail(emailInfo.getId(), bindingVo);
|
|
|
- return emailInfo;
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
EmailEngineUtil.deleteAccount(bindingVo.getEmail());
|
|
|
throw e;
|
|
|
}
|
|
|
|
|
|
+ // 异步遍历文件夹下的所有邮件
|
|
|
+ this.asyncReadEmail(emailInfo.getId(), bindingVo, 19);
|
|
|
+ return emailInfo;
|
|
|
}
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -123,17 +127,12 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
String email = bindingVo.getEmail();
|
|
|
int pages = bindingVo.getPages();
|
|
|
|
|
|
+ MessageVo messageVo = EmailEngineUtil.getMessageList(email, bindingVo.getPath(), 1);
|
|
|
+
|
|
|
ProgressVo progressVo = new ProgressVo();
|
|
|
progressVo.setEmail(email);
|
|
|
progressVo.setCompleteMessageCount(0);
|
|
|
progressVo.setPercentage(0);
|
|
|
- progressVo.setInit(false);
|
|
|
- RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
-
|
|
|
- ThreadUtil.sleep(1000L);
|
|
|
-
|
|
|
- MessageVo messageVo = EmailEngineUtil.getMessageList(email, bindingVo.getPath(), 1);
|
|
|
- progressVo.setInit(true);
|
|
|
progressVo.setTotalMessageCount(messageVo.getTotal() > pages * 10 ? pages * 10 : messageVo.getTotal());
|
|
|
RedisCache.set(RedisConstant.PROGRESS_KEY + email, progressVo);
|
|
|
}
|
|
@@ -141,40 +140,57 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
/**
|
|
|
* 异步读取文件
|
|
|
*/
|
|
|
- private void asyncReadEmail(Long emailInfoId, BindingVo bindingVo) {
|
|
|
+ private void asyncReadEmail(Long emailInfoId, BindingVo bindingVo, Integer pageFlag) {
|
|
|
String email = bindingVo.getEmail();
|
|
|
int pages = bindingVo.getPages();
|
|
|
String mailbox = bindingVo.getPath();
|
|
|
|
|
|
executor.execute(() -> {
|
|
|
ThreadUtil.sleep(3000);
|
|
|
+ int page = pageFlag;
|
|
|
+ try {
|
|
|
|
|
|
- // 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
|
- List<String> lastMessageIdList = new ArrayList<>();
|
|
|
+ // 记录上次消息id,防止循环查询分页过程中接收到了新邮件,出现邮件重复问题
|
|
|
+ List<String> lastMessageIdList = new ArrayList<>();
|
|
|
|
|
|
- int page = 0;
|
|
|
- while (page < pages) {
|
|
|
- MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, page);
|
|
|
- List<MessageVo.MessagesDTO> messagesDTOList = result.getMessages();
|
|
|
- if (messagesDTOList.size() > 0) {
|
|
|
- // 批量保存邮件信息
|
|
|
- List<EmailMessage> emailMessageList = this.saveBatchMessage(emailInfoId, email, lastMessageIdList, messagesDTOList);
|
|
|
+ while (page < pages) {
|
|
|
|
|
|
- // 更新同步邮件进度
|
|
|
- this.synchronizationProgress(email, messagesDTOList);
|
|
|
+ // 分页获取文件夹邮件
|
|
|
+ MessageVo result = EmailEngineUtil.getMessageList(email, mailbox, page);
|
|
|
+
|
|
|
+ List<MessageVo.MessagesDTO> messagesDTOList = result.getMessages();
|
|
|
+
|
|
|
+ if (messagesDTOList.size() > 0) {
|
|
|
+
|
|
|
+ // 批量保存邮件信息
|
|
|
+ List<EmailMessage> emailMessageList = this.saveBatchMessage(emailInfoId, email, lastMessageIdList, messagesDTOList);
|
|
|
+
|
|
|
+ // 更新同步邮件进度
|
|
|
+ this.synchronizationProgress(email, messagesDTOList);
|
|
|
+
|
|
|
+ // 记录上次保存的邮件id
|
|
|
+ lastMessageIdList.clear();
|
|
|
+ for (EmailMessage emailMessage : emailMessageList) {
|
|
|
+ lastMessageIdList.add(emailMessage.getMessageId());
|
|
|
+ }
|
|
|
|
|
|
- // 记录上次保存的邮件id
|
|
|
- lastMessageIdList.clear();
|
|
|
- for (EmailMessage emailMessage : emailMessageList) {
|
|
|
- lastMessageIdList.add(emailMessage.getMessageId());
|
|
|
}
|
|
|
+ page++;
|
|
|
|
|
|
ThreadUtil.sleep(3000);
|
|
|
}
|
|
|
- page++;
|
|
|
+
|
|
|
+ } catch (EmailEngineException e) {
|
|
|
+ log.error("下载失败,等待5分钟");
|
|
|
+ ThreadUtil.sleep(1000 * 60 * 5);
|
|
|
+
|
|
|
+ asyncReadEmail(emailInfoId, bindingVo, page);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("未知原因同步文件夹失败:{}", email, e);
|
|
|
}
|
|
|
|
|
|
});
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -305,23 +321,22 @@ public class AccountServiceImpl implements IAccountService {
|
|
|
|
|
|
String newFileName = attachmentId + "." + FileUtil.getSuffix(attachment.getFilename());
|
|
|
|
|
|
+ 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);
|
|
|
+
|
|
|
// 下载附件
|
|
|
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);
|
|
|
- }
|
|
|
-
|
|
|
+ RetryUtil.execute(() -> EmailEngineUtil.downloadAttachment(email, attachmentId, newFileName));
|
|
|
} catch (Exception e) {
|
|
|
- log.error("下载附件失败:", e);
|
|
|
+ log.error("下载附件失败:email:{},attachmentId:{}", email, attachmentId, e);
|
|
|
+
|
|
|
+ RedisCache.set(RedisConstant.DOWNLOAD_FAIL_FILE_KEY + email + ":" + attachmentId, emailMessageAttachment);
|
|
|
}
|
|
|
|
|
|
}
|