24282 2 лет назад
Родитель
Сommit
2a726d2c37

+ 0 - 3
.gitignore

@@ -35,6 +35,3 @@ app-log
 **/libraries
 **/*.iml
 
-# 测试环境配置不提交
-fly-admin/src/main/resources/application-dev.yml
-

+ 6 - 0
hx-mail/pom.xml

@@ -24,6 +24,12 @@
             <artifactId>hx-common</artifactId>
         </dependency>
 
+        <!-- mail -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 62 - 0
hx-mail/src/main/java/com/fjhx/mail/entity/enterprise/po/EnterpriseFolder.java

@@ -0,0 +1,62 @@
+package com.fjhx.mail.entity.enterprise.po;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 企业邮箱文件夹
+ * </p>
+ *
+ * @author
+ * @since 2023-04-07
+ */
+@Getter
+@Setter
+@TableName("enterprise_folder")
+public class EnterpriseFolder extends BaseIdPo {
+
+    /**
+     * 邮箱id
+     */
+    private Long mailboxId;
+
+    /**
+     * 文件夹名称
+     */
+    private String name;
+
+    /**
+     * 上次同步邮件number
+     */
+    private Integer lastMessageNumber;
+
+    /**
+     * 上次同步邮件发送时间
+     */
+    private Date lastReceivedDate;
+
+    /**
+     * 同步邮件状态: 1同步 0不同步
+     */
+    private Integer syncStatus;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+}

+ 61 - 0
hx-mail/src/main/java/com/fjhx/mail/entity/personal/po/PersonalFolder.java

@@ -0,0 +1,61 @@
+package com.fjhx.mail.entity.personal.po;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 个人邮箱文件夹
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+@Getter
+@Setter
+@TableName("personal_folder")
+public class PersonalFolder extends BaseIdPo {
+
+    /**
+     * 邮箱id
+     */
+    private Long mailboxId;
+
+    /**
+     * 文件夹名称
+     */
+    private String name;
+
+    /**
+     * 上次同步邮件number
+     */
+    private Integer lastMessageNumber;
+
+    /**
+     * 上次同步邮件发送时间
+     */
+    private Date lastReceivedDate;
+
+    /**
+     * 同步邮件状态: 1同步 0不同步
+     */
+    private Integer syncStatus;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+
+}

+ 17 - 0
hx-mail/src/main/java/com/fjhx/mail/mapper/enterprise/EnterpriseFolderMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.mail.mapper.enterprise;
+
+import com.fjhx.mail.entity.enterprise.po.EnterpriseFolder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 企业邮箱文件夹 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+public interface EnterpriseFolderMapper extends BaseMapper<EnterpriseFolder> {
+
+}

+ 17 - 0
hx-mail/src/main/java/com/fjhx/mail/mapper/personal/PersonalFolderMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.mail.mapper.personal;
+
+import com.fjhx.mail.entity.personal.po.PersonalFolder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 个人邮箱文件夹 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+public interface PersonalFolderMapper extends BaseMapper<PersonalFolder> {
+
+}

+ 17 - 0
hx-mail/src/main/java/com/fjhx/mail/service/enterprise/EnterpriseFolderService.java

@@ -0,0 +1,17 @@
+package com.fjhx.mail.service.enterprise;
+
+import com.fjhx.mail.entity.enterprise.po.EnterpriseFolder;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 企业邮箱文件夹 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+public interface EnterpriseFolderService extends BaseService<EnterpriseFolder> {
+
+}

+ 21 - 0
hx-mail/src/main/java/com/fjhx/mail/service/enterprise/impl/EnterpriseFolderServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.mail.service.enterprise.impl;
+
+import com.fjhx.mail.entity.enterprise.po.EnterpriseFolder;
+import com.fjhx.mail.mapper.enterprise.EnterpriseFolderMapper;
+import com.fjhx.mail.service.enterprise.EnterpriseFolderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 企业邮箱文件夹 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+@Service
+public class EnterpriseFolderServiceImpl extends ServiceImpl<EnterpriseFolderMapper, EnterpriseFolder> implements EnterpriseFolderService {
+
+}

+ 56 - 1
hx-mail/src/main/java/com/fjhx/mail/service/enterprise/impl/EnterpriseMailboxServiceImpl.java

@@ -1,21 +1,33 @@
 package com.fjhx.mail.service.enterprise.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxDto;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxSelectDto;
+import com.fjhx.mail.entity.enterprise.po.EnterpriseDomain;
+import com.fjhx.mail.entity.enterprise.po.EnterpriseFolder;
 import com.fjhx.mail.entity.enterprise.po.EnterpriseMailbox;
 import com.fjhx.mail.entity.enterprise.vo.EnterpriseMailboxVo;
 import com.fjhx.mail.mapper.enterprise.EnterpriseMailboxMapper;
+import com.fjhx.mail.service.enterprise.EnterpriseDomainService;
+import com.fjhx.mail.service.enterprise.EnterpriseFolderService;
 import com.fjhx.mail.service.enterprise.EnterpriseMailboxService;
+import com.fjhx.mail.util.EmailUtil;
 import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.utils.UserUtil;
+import com.sun.mail.imap.IMAPStore;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.mail.MessagingException;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -23,12 +35,18 @@ import java.util.List;
  * 企业邮箱 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-06
  */
 @Service
 public class EnterpriseMailboxServiceImpl extends ServiceImpl<EnterpriseMailboxMapper, EnterpriseMailbox> implements EnterpriseMailboxService {
 
+    @Autowired
+    private EnterpriseFolderService enterpriseFolderService;
+
+    @Autowired
+    private EnterpriseDomainService enterpriseDomainService;
+
     @Override
     public Page<EnterpriseMailboxVo> getPage(EnterpriseMailboxSelectDto dto) {
         IWrapper<EnterpriseMailbox> wrapper = getWrapper();
@@ -54,12 +72,49 @@ public class EnterpriseMailboxServiceImpl extends ServiceImpl<EnterpriseMailboxM
         return result;
     }
 
+    @Transactional
     @Override
     public void add(EnterpriseMailboxDto enterpriseMailboxDto) {
+
+        Long enterpriseMailboxId = IdWorker.getId();
+
+        Long domainId = enterpriseMailboxDto.getDomainId();
+        EnterpriseDomain enterpriseDomain = enterpriseDomainService.getById(domainId);
+
+        if (enterpriseDomain == null) {
+            throw new ServiceException("未找到企业域名");
+        }
+
+        try {
+
+            IMAPStore imapStore = EmailUtil.getIMAPStore(
+                    enterpriseDomain.getReceiveHost(),
+                    enterpriseDomain.getReceivePort(),
+                    enterpriseMailboxDto.getMailUserPrefix() + "@" + enterpriseDomain.getDomainName(),
+                    enterpriseMailboxDto.getMailPassword()
+            );
+
+            List<String> folderNameList = EmailUtil.getFolderNameList(imapStore);
+            List<EnterpriseFolder> personalFolderList = folderNameList.stream().map(item -> {
+                EnterpriseFolder enterpriseFolder = new EnterpriseFolder();
+                enterpriseFolder.setMailboxId(enterpriseMailboxId);
+                enterpriseFolder.setName(item);
+                enterpriseFolder.setSyncStatus(1);
+                return enterpriseFolder;
+            }).collect(Collectors.toList());
+
+            enterpriseFolderService.saveBatch(personalFolderList);
+
+        } catch (MessagingException e) {
+            throw new ServiceException("连接邮箱异常");
+        }
+
+        enterpriseMailboxDto.setId(enterpriseMailboxId);
         enterpriseMailboxDto.setDefaultStatus(0);
         enterpriseMailboxDto.setSyncStatus(1);
         enterpriseMailboxDto.setStatus(StatusConstant.ENABLE);
         this.save(enterpriseMailboxDto);
+
     }
 
     @Override

+ 17 - 0
hx-mail/src/main/java/com/fjhx/mail/service/personal/PersonalFolderService.java

@@ -0,0 +1,17 @@
+package com.fjhx.mail.service.personal;
+
+import com.fjhx.mail.entity.personal.po.PersonalFolder;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 个人邮箱文件夹 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+public interface PersonalFolderService extends BaseService<PersonalFolder> {
+
+}

+ 21 - 0
hx-mail/src/main/java/com/fjhx/mail/service/personal/impl/PersonalFolderServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.mail.service.personal.impl;
+
+import com.fjhx.mail.entity.personal.po.PersonalFolder;
+import com.fjhx.mail.mapper.personal.PersonalFolderMapper;
+import com.fjhx.mail.service.personal.PersonalFolderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 个人邮箱文件夹 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-04-07
+ */
+@Service
+public class PersonalFolderServiceImpl extends ServiceImpl<PersonalFolderMapper, PersonalFolder> implements PersonalFolderService {
+
+}

+ 44 - 1
hx-mail/src/main/java/com/fjhx/mail/service/personal/impl/PersonalMailboxServiceImpl.java

@@ -1,19 +1,31 @@
 package com.fjhx.mail.service.personal.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxDto;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxSelectDto;
+import com.fjhx.mail.entity.personal.po.PersonalFolder;
 import com.fjhx.mail.entity.personal.po.PersonalMailbox;
 import com.fjhx.mail.entity.personal.vo.PersonalMailboxVo;
 import com.fjhx.mail.mapper.personal.PersonalMailboxMapper;
+import com.fjhx.mail.service.personal.PersonalFolderService;
 import com.fjhx.mail.service.personal.PersonalMailboxService;
+import com.fjhx.mail.util.EmailUtil;
 import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
+import com.sun.mail.imap.IMAPStore;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.mail.MessagingException;
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -21,12 +33,15 @@ import org.springframework.stereotype.Service;
  * 个人邮箱 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-04-06
  */
 @Service
 public class PersonalMailboxServiceImpl extends ServiceImpl<PersonalMailboxMapper, PersonalMailbox> implements PersonalMailboxService {
 
+    @Autowired
+    private PersonalFolderService personalFolderService;
+
     @Override
     public Page<PersonalMailboxVo> getPage(PersonalMailboxSelectDto dto) {
         IWrapper<PersonalMailbox> wrapper = getWrapper();
@@ -44,8 +59,36 @@ public class PersonalMailboxServiceImpl extends ServiceImpl<PersonalMailboxMappe
         return result;
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void add(PersonalMailboxDto personalMailboxDto) {
+
+        Long personalMailboxId = IdWorker.getId();
+
+        try {
+            IMAPStore imapStore = EmailUtil.getIMAPStore(
+                    personalMailboxDto.getReceiveHost(),
+                    personalMailboxDto.getReceivePort(),
+                    personalMailboxDto.getMailUser(),
+                    personalMailboxDto.getMailPassword()
+            );
+
+            List<String> folderNameList = EmailUtil.getFolderNameList(imapStore);
+            List<PersonalFolder> personalFolderList = folderNameList.stream().map(item -> {
+                PersonalFolder personalFolder = new PersonalFolder();
+                personalFolder.setMailboxId(personalMailboxId);
+                personalFolder.setName(item);
+                personalFolder.setSyncStatus(1);
+                return personalFolder;
+            }).collect(Collectors.toList());
+
+            personalFolderService.saveBatch(personalFolderList);
+
+        } catch (MessagingException e) {
+            throw new ServiceException("连接邮箱异常");
+        }
+
+        personalMailboxDto.setId(personalMailboxId);
         personalMailboxDto.setStatus(StatusConstant.ENABLE);
         personalMailboxDto.setSyncStatus(1);
         personalMailboxDto.setDefaultStatus(0);

+ 61 - 0
hx-mail/src/main/java/com/fjhx/mail/util/EmailUtil.java

@@ -0,0 +1,61 @@
+package com.fjhx.mail.util;
+
+import com.sun.mail.imap.IMAPFolder;
+import com.sun.mail.imap.IMAPStore;
+
+import javax.mail.Folder;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+public class EmailUtil {
+
+    private static final HashMap<String, String> ImapStoreId = new HashMap<>();
+
+    static {
+        ImapStoreId.put("name", "fjhx");
+        ImapStoreId.put("version", "1.0.0");
+        ImapStoreId.put("vendor", "fjhxClient");
+        ImapStoreId.put("support-email", "fjhx@fjhx.com");
+    }
+
+    /**
+     * 获取imapStore
+     * 993
+     */
+    public static IMAPStore getIMAPStore(String host, Integer port, String user, String password) throws MessagingException {
+        Properties ImapProperties = new Properties();
+        ImapProperties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+
+        Session session = Session.getInstance(ImapProperties);
+        IMAPStore store = (IMAPStore) session.getStore("imap");
+        store.connect(host, port, user, password);
+        store.id(ImapStoreId);
+        return store;
+    }
+
+    /**
+     * 获取邮箱文件夹
+     */
+    public static List<String> getFolderNameList(IMAPStore imapStore) throws MessagingException {
+        IMAPFolder folder = (IMAPFolder) imapStore.getDefaultFolder();
+        Folder[] folders = folder.list();
+        List<String> mailFolderList = new ArrayList<>();
+        addMailFolderList(mailFolderList, folders);
+        return mailFolderList;
+    }
+
+    private static void addMailFolderList(List<String> mailFolderList, Folder[] folders) throws MessagingException {
+        for (Folder folder : folders) {
+            int type = folder.getType();
+            if (type == 2) {
+                addMailFolderList(mailFolderList, folder.list());
+            } else if (type == 3) {
+                mailFolderList.add(folder.getFullName());
+            }
+        }
+    }
+}

+ 4 - 0
hx-mail/src/main/resources/mapper/enterprise/EnterpriseFolderMapper.xml

@@ -0,0 +1,4 @@
+<?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.mail.mapper.enterprise.EnterpriseFolderMapper">
+</mapper>

+ 4 - 0
hx-mail/src/main/resources/mapper/personal/PersonalFolderMapper.xml

@@ -0,0 +1,4 @@
+<?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.mail.mapper.personal.PersonalFolderMapper">
+</mapper>