24282 2 年之前
父節點
當前提交
8d0e35faf7

+ 1 - 1
src/main/java/com/fjhx/config/CodeGeneration.java

@@ -26,7 +26,7 @@ public class CodeGeneration {
                 })
                 .strategyConfig(builder -> builder
                         // 设置需要生成的表名
-                        .addInclude("email_mailbox_link")
+                        .addInclude("email_user")
                         .entityBuilder()
                         .disableSerialVersionUID()
                         .superClass(BaseEntity.class)

+ 18 - 0
src/main/java/com/fjhx/controller/AccountController.java

@@ -5,13 +5,18 @@ import com.fjhx.base.R;
 import com.fjhx.config.redis.RedisCache;
 import com.fjhx.constants.RedisConstant;
 import com.fjhx.entity.EmailInfo;
+import com.fjhx.entity.EmailUser;
 import com.fjhx.service.IAccountService;
+import com.fjhx.service.IEmailUserService;
 import com.fjhx.vo.BindingVo;
 import com.fjhx.vo.ListenerVo;
 import com.fjhx.vo.ProgressVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 @RestController
 @RequestMapping("/account")
 public class AccountController {
@@ -19,6 +24,9 @@ public class AccountController {
     @Autowired
     private IAccountService accountService;
 
+    @Autowired
+    private IEmailUserService emailUserService;
+
     /**
      * 绑定邮箱
      */
@@ -29,6 +37,16 @@ public class AccountController {
     }
 
     /**
+     * 查看用户绑定了哪些邮箱
+     */
+    @GetMapping("/getUserBindingEmail")
+    public R getUserBindingEmail(BindingVo bindingVo) {
+        List<EmailUser> list = emailUserService.list(q -> q.eq(EmailUser::getUserId, bindingVo.getUserId()));
+        List<String> emailList = list.stream().map(EmailUser::getEmail).distinct().collect(Collectors.toList());
+        return R.ok(emailList);
+    }
+
+    /**
      * 查看用户账号同步进度
      */
     @GetMapping("getAsyncProgress")

+ 30 - 0
src/main/java/com/fjhx/entity/EmailUser.java

@@ -0,0 +1,30 @@
+package com.fjhx.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fjhx.base.BaseEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 用户邮箱绑定
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-02-24
+ */
+@Getter
+@Setter
+@TableName("email_user")
+public class EmailUser extends BaseEntity {
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+}

+ 16 - 0
src/main/java/com/fjhx/mapper/EmailUserMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.mapper;
+
+import com.fjhx.entity.EmailUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 用户邮箱绑定 Mapper 接口
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-02-24
+ */
+public interface EmailUserMapper extends BaseMapper<EmailUser> {
+
+}

+ 5 - 0
src/main/java/com/fjhx/mapper/xml/EmailUserMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.mapper.EmailUserMapper">
+
+</mapper>

+ 16 - 0
src/main/java/com/fjhx/service/IEmailUserService.java

@@ -0,0 +1,16 @@
+package com.fjhx.service;
+
+import com.fjhx.entity.EmailUser;
+import com.fjhx.base.BaseService;
+
+/**
+ * <p>
+ * 用户邮箱绑定 服务类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-02-24
+ */
+public interface IEmailUserService extends BaseService<EmailUser> {
+
+}

+ 29 - 7
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -16,10 +16,7 @@ import com.fjhx.config.exception.EmailEngineException;
 import com.fjhx.config.exception.ServiceException;
 import com.fjhx.config.redis.RedisCache;
 import com.fjhx.constants.RedisConstant;
-import com.fjhx.entity.EmailInfo;
-import com.fjhx.entity.EmailMessage;
-import com.fjhx.entity.EmailMessageAttachment;
-import com.fjhx.entity.EmailMessageContent;
+import com.fjhx.entity.*;
 import com.fjhx.enums.SendEventEnum;
 import com.fjhx.service.*;
 import com.fjhx.utils.EmailEngineUtil;
@@ -53,6 +50,9 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
     @Autowired
     private IEmailMessageContentService emailMessageContentService;
 
+    @Autowired
+    private IEmailUserService emailUserService;
+
 
     @Qualifier(TaskPoolConfig.SYNC_MAILBOX_EXECUTOR)
     @Autowired
@@ -221,6 +221,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
         EmailInfo emailInfo = emailInfoService.getOne(q -> q.eq(EmailInfo::getEmail, email));
         // 如果存在,直接返回邮箱信息
         if (emailInfo != null) {
+            bindingUser(bindingVo.getUserId(), bindingVo.getEmail());
             return emailInfo;
         }
         ProgressVo progressVo;
@@ -228,8 +229,11 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
             // 保存账号信息到数据库
             emailInfo = BeanUtil.copyProperties(bindingVo, EmailInfo.class);
             emailInfoService.save(emailInfo);
+
+            bindingUser(bindingVo.getUserId(), bindingVo.getEmail());
+
             // 添加账号
-            RetryUtil.execute(() -> EmailEngineUtil.createAccount(bindingVo), 3, 3000L);
+            RetryUtil.execute(() -> EmailEngineUtil.createAccount(bindingVo), 5, 3000L);
             // redis添加同步进度
             progressVo = this.progressInitialization(emailInfo.getId(), bindingVo);
         } catch (Exception e) {
@@ -264,6 +268,24 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
 
     }
 
+
+    /**
+     * 用户绑定邮箱
+     *
+     * @param userId 用户id
+     * @param email  邮箱
+     */
+    private void bindingUser(String userId, String email) {
+        long count = emailUserService.count(q -> q.eq(EmailUser::getUserId, userId).eq(EmailUser::getEmail, email));
+        if (count > 0) {
+            return;
+        }
+        EmailUser emailUser = new EmailUser();
+        emailUser.setUserId(userId);
+        emailUser.setEmail(email);
+        emailUserService.save(emailUser);
+    }
+
     /**
      * 同步邮件进度初始化
      */
@@ -362,7 +384,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
         emailMessage.setMessageId(messagesDTO.getId());
         emailMessage.setEmailInfoId(emailInfoId);
         emailMessage.setEmail(email);
-        emailMessage.setUnseen(messagesDTO.getUnseen());
+        emailMessage.setUnseen(ObjectUtil.defaultIfNull(messagesDTO.getUnseen(), true));
         emailMessage.setFlagged(messagesDTO.getFlagged());
         emailMessage.setSubject(messagesDTO.getSubject());
         emailMessage.setFromDate(messagesDTO.getDate());
@@ -391,7 +413,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
         emailMessageAttachment.setEmail(message.getEmail());
         emailMessageAttachment.setName(attachment.getFilename());
         emailMessageAttachment.setSize(attachment.getEncodedSize());
-        emailMessageAttachment.setPath(message.getEmail() + "\\" + newFileName);
+        emailMessageAttachment.setPath(message.getEmail() + "/" + newFileName);
         emailMessageAttachment.setIsDownload(false);
         emailMessageAttachment.setFromDate(fromDate);
 

+ 3 - 0
src/main/java/com/fjhx/service/impl/EmailMessageContentServiceImpl.java

@@ -38,6 +38,8 @@ public class EmailMessageContentServiceImpl extends ServiceImpl<EmailMessageCont
     @Override
     public String getContent(String email, String messageId) {
         EmailMessageContent content = getById(messageId);
+
+
         try {
             if (content == null) {
                 // 正文内容
@@ -61,6 +63,7 @@ public class EmailMessageContentServiceImpl extends ServiceImpl<EmailMessageCont
                     EmailMessage emailMessage = new EmailMessage();
                     emailMessage.setMessageId(messageId);
                     emailMessage.setContentSync(true);
+                    emailMessage.setUnseen(false);
                     emailMessageService.updateById(emailMessage);
 
                 });

+ 1 - 0
src/main/java/com/fjhx/service/impl/EmailMessageServiceImpl.java

@@ -38,6 +38,7 @@ public class EmailMessageServiceImpl extends ServiceImpl<EmailMessageMapper, Ema
         return page(vo, q -> q
                 .eq(EmailMessage::getEmail, email)
                 .eq(EmailMessage::getIsShow, true)
+                .eq(ObjectUtil.isNotEmpty(vo.getUnseen()), EmailMessage::getUnseen, vo.getUnseen())
                 .between(ObjectUtil.isAllNotEmpty(beginTime, endTime), EmailMessage::getFromDate, beginTime, endTime)
                 .like(ObjectUtil.isNotEmpty(subject), EmailMessage::getSubject, subject)
                 .like(ObjectUtil.isNotEmpty(fromName), EmailMessage::getFromName, fromName)

+ 20 - 0
src/main/java/com/fjhx/service/impl/EmailUserServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fjhx.service.impl;
+
+import com.fjhx.entity.EmailUser;
+import com.fjhx.mapper.EmailUserMapper;
+import com.fjhx.service.IEmailUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户邮箱绑定 服务实现类
+ * </p>
+ *
+ * @author zlj
+ * @since 2023-02-24
+ */
+@Service
+public class EmailUserServiceImpl extends ServiceImpl<EmailUserMapper, EmailUser> implements IEmailUserService {
+
+}

+ 3 - 4
src/main/java/com/fjhx/utils/EmailEngineUtil.java

@@ -8,7 +8,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.fjhx.config.exception.EmailEngineException;
 import com.fjhx.config.exception.ServiceException;
 import com.fjhx.vo.*;
-import com.sun.istack.internal.NotNull;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
@@ -35,13 +34,13 @@ public class EmailEngineUtil {
         restTemplate.setErrorHandler(new ResponseErrorHandler() {
 
             @Override
-            public boolean hasError(@NotNull ClientHttpResponse response) throws IOException {
+            public boolean hasError(ClientHttpResponse response) throws IOException {
                 HttpStatus.Series series = response.getStatusCode().series();
                 return !HttpStatus.Series.SUCCESSFUL.equals(series);
             }
 
             @Override
-            public void handleError(@NotNull ClientHttpResponse response) throws IOException {
+            public void handleError(ClientHttpResponse response) throws IOException {
                 InputStream body = response.getBody();
                 byte[] bytes = new byte[body.available()];
                 body.read(bytes);
@@ -124,7 +123,7 @@ public class EmailEngineUtil {
         if (attachmentFile.exists()) {
             return;
         }
-        FileOutputStream fileOutputStream = new FileOutputStream(filePath);
+        FileOutputStream fileOutputStream = new FileOutputStream(attachmentFile);
         download("v1/account/" + email + "/attachment/" + attachmentId, fileOutputStream);
     }
 

+ 14 - 0
src/main/java/com/fjhx/vo/BindingVo.java

@@ -1,11 +1,17 @@
 package com.fjhx.vo;
 
+import cn.hutool.core.util.ObjectUtil;
 import lombok.Data;
 
 @Data
 public class BindingVo {
 
     /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
      * 邮箱
      */
     private String email;
@@ -25,6 +31,14 @@ public class BindingVo {
 
     private String path;
 
+    public String getPath() {
+        return ObjectUtil.isEmpty(path) ? "INBOX" : path;
+    }
+
     private int pages;
 
+    public int getPages() {
+        return pages <= 10 ? 300 : pages;
+    }
+
 }

+ 5 - 0
src/main/java/com/fjhx/vo/GetEmailMessagePageVo.java

@@ -28,4 +28,9 @@ public class GetEmailMessagePageVo extends BaseSelectVo {
      */
     private String subject;
 
+    /**
+     * 是否未读
+     */
+    private Boolean unseen;
+
 }

+ 1 - 1
src/main/resources/application-dev.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8080
+  port: 8888
 
 # 数据源配置
 spring:

+ 2 - 2
src/main/resources/application-pro.yml

@@ -20,5 +20,5 @@ spring:
     database: 0
 
 config:
-  urlPrefix: http://localhost:3000/
-  attachmentPath: D:\24282\Downloads\
+  urlPrefix: http://127.0.0.1:3000/
+  attachmentPath: /mnt/file

+ 24 - 0
src/main/resources/application-test.yml

@@ -0,0 +1,24 @@
+server:
+  port: 9998
+
+# 数据源配置
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://139.9.184.42:3306/bladex_email?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&tinyInt1isBit=false&allowMultiQueries=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
+    username: root
+    password: Fjhx@pwd123
+
+  redis:
+    # 地址
+    host: 139.9.184.42
+    # 端口,默认为6379
+    port: 26164
+    # 密码
+    password: fjhx@pwd123456
+    # 数据库索引
+    database: 1
+
+config:
+  urlPrefix: http://127.0.0.1:3000/
+  attachmentPath: /mnt/file/

+ 1 - 1
src/main/resources/application.yml

@@ -3,7 +3,7 @@ server:
   max-http-header-size: 10KB
 spring:
   profiles:
-    active: pro
+    active: test
 
   jackson:
     date-format: yyyy-MM-dd HH:mm:ss