From 4cc9e6d1af42b74eeb3330dd302b8275173891ac Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Sun, 9 Apr 2023 17:09:08 +0800
Subject: [PATCH 1/7] =?UTF-8?q?=E8=AF=BB=E5=8F=96=E9=82=AE=E7=AE=B1?=
=?UTF-8?q?=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-flyingbook/pom.xml | 6 +-
.../com/ruoyi/flyingbook/mail/MailHelper.java | 107 ++++++++++++++++++
.../flyingbook/mail/request/MailRequest.java | 72 ++++++++++++
3 files changed, 184 insertions(+), 1 deletion(-)
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
diff --git a/ruoyi-flyingbook/pom.xml b/ruoyi-flyingbook/pom.xml
index 26b17c9..b6d07e9 100644
--- a/ruoyi-flyingbook/pom.xml
+++ b/ruoyi-flyingbook/pom.xml
@@ -57,7 +57,11 @@
-
+
+ com.sun.mail
+ javax.mail
+ 1.5.5
+
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
new file mode 100644
index 0000000..9c54058
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
@@ -0,0 +1,107 @@
+package com.ruoyi.flyingbook.mail;
+
+import com.ruoyi.flyingbook.mail.request.MailRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeUtility;
+import javax.mail.search.*;
+import java.security.Security;
+import java.util.Properties;
+
+/**
+ * @author yuxiangyong
+ * @create 2023-04-09 15:28
+ */
+@Slf4j
+@Component
+public class MailHelper {
+
+ /**
+ * ssl加密
+ */
+ private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
+
+ public static void main(String[] args) {
+ MailHelper mailHelper = new MailHelper();
+ MailRequest req = new MailRequest("imap.qq.com",993,"932687738","ohziejkxqvsgbbag");
+ mailHelper.receiveMail(req);
+ }
+
+ public void receiveMail(MailRequest req){
+ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
+ // 定义连接imap服务器的属性信息
+ String portStr = String.valueOf(req.getEmailPort());
+ Properties props = new Properties();
+ props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
+ props.setProperty("mail.imap.socketFactory.fallback", "false");
+ props.setProperty("mail.transport.protocol", req.getEmailProtocol());
+ props.setProperty("mail.imap.port", portStr);
+ props.setProperty("mail.imap.socketFactory.port", portStr);
+
+ //创建会话
+ Session session = Session.getInstance(props, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
+ }
+ });
+ Store store = null;
+ Folder folder = null;
+ try {
+ //存储对象
+ store = session.getStore(req.getEmailProtocol());
+ //连接
+ store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(),req.getAuthorizationCode());
+ // 获得收件箱
+ folder = store.getFolder(req.getReceiveFolder());
+ // 以读写模式打开收件箱
+ folder.open(Folder.READ_WRITE);
+ //false 表示未读
+ FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
+ //获得收件箱的邮件列表
+ Message[] messages = folder.search(flagTerm);
+ // 打印不同状态的邮件数量
+ log.info("收件箱中共{}封邮件!\n共{}封未读邮件!\n共{}封新邮件!\n共{}封已删除邮件!",
+ messages.length,
+ folder.getUnreadMessageCount(),
+ folder.getNewMessageCount(),
+ folder.getDeletedMessageCount());
+ log.info("------------------------开始解析邮件----------------------------------");
+ for (int i = 0; i < messages.length; i++) {
+ Message message = messages[i];
+ parseMsg(message);
+ //设置已读
+ message.setFlag(Flags.Flag.SEEN,true);
+ }
+ } catch (Exception e) {
+ log.error("邮件解析失败",e);
+ } finally {
+ try {
+ if (folder != null) {
+ folder.close(false);
+ }
+ if (store != null) {
+ store.close();
+ }
+ } catch (MessagingException e) {
+ log.error("邮件解析失败",e);
+ }
+ }
+ }
+
+ private void parseMsg(Message message){
+ try {
+ System.out.println("消息:"+ message.getSubject());
+ String from = MimeUtility.decodeText(message.getFrom()[0].toString());
+ InternetAddress internetAddress = new InternetAddress(from);
+ System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
+
+ }catch (Exception e){
+
+ }
+
+ }
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
new file mode 100644
index 0000000..6af378c
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
@@ -0,0 +1,72 @@
+package com.ruoyi.flyingbook.mail.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author yuxiangyong
+ * @create 2023-04-09 16:41
+ */
+@Data
+@NoArgsConstructor
+public class MailRequest {
+
+
+ /**
+ * 邮件服务器地址
+ * imap.qq.com
+ */
+ private String emailServer;
+ /**
+ * 邮件服务器端口
+ * 993
+ */
+ private Integer emailPort;
+ /**
+ * 邮件协议
+ * imap
+ */
+ private String emailProtocol;
+ /**
+ * 登录用户名
+ */
+ private String userName;
+ /**
+ * 开通协议的时候的授权码
+ */
+ private String authorizationCode;
+ /**
+ * 收件箱目录
+ * INBOX
+ */
+ private String receiveFolder;
+ /**
+ * 是否需要反馈已读信息
+ */
+ private Boolean readFeedback;
+
+ private void fillDefault(Boolean readFeedback){
+ this.emailProtocol = "imap";
+ this.receiveFolder = "INBOX";
+ if (readFeedback != null){
+ this.readFeedback = readFeedback;
+ }
+ }
+
+ public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode, Boolean readFeedback) {
+ this.emailServer = emailServer;
+ this.emailPort = emailPort;
+ this.userName = userName;
+ this.authorizationCode = authorizationCode;
+ this.readFeedback = readFeedback;
+ this.fillDefault(readFeedback);
+ }
+
+ public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode) {
+ this.emailServer = emailServer;
+ this.emailPort = emailPort;
+ this.userName = userName;
+ this.authorizationCode = authorizationCode;
+ this.fillDefault(Boolean.TRUE);
+ }
+}
From 83ff42c7a86f7ff874a51037d09dee96c3accb67 Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Sun, 9 Apr 2023 17:32:51 +0800
Subject: [PATCH 2/7] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=82=AE?=
=?UTF-8?q?=E4=BB=B6=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/flyingbook/domain/MailInfo.java | 37 ++++++
.../flyingbook/mapper/MailInfoMapper.java | 61 ++++++++++
.../flyingbook/service/IMailInfoService.java | 63 +++++++++++
.../service/impl/MailInfoServiceImpl.java | 96 ++++++++++++++++
.../main/resources/mapper/MailInfoMapper.xml | 106 ++++++++++++++++++
sql/infoMenu.sql | 22 ++++
6 files changed, 385 insertions(+)
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/MailInfoMapper.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IMailInfoService.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/MailInfoServiceImpl.java
create mode 100644 ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
create mode 100644 sql/infoMenu.sql
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
new file mode 100644
index 0000000..45f84b7
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
@@ -0,0 +1,37 @@
+package com.ruoyi.flyingbook.domain;
+
+import lombok.Data;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * @author ruoyi
+ * @date 2023-04-09
+ */
+@Data
+public class MailInfo extends BaseEntity {
+ private static final long serialVersionUID = 1L;
+
+ private Long id;
+
+ /** 邮件服务器地址 */
+ private String mailServer;
+
+ /** 邮件服务器端口 */
+ private String mailPort;
+
+ /** 邮件服务器使用协议 */
+ private String mailProtocol;
+
+ /** 账号 */
+ private String mailUserName;
+
+ /** 邮箱授权码 */
+ private String mailAuthorizationCode;
+
+ /** 收件箱地址 */
+ private String mailReceiveFolder;
+ /**
+ * @see com.ruoyi.common.enums.FlagStatus
+ */
+ private Long flag;
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/MailInfoMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/MailInfoMapper.java
new file mode 100644
index 0000000..0435779
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/MailInfoMapper.java
@@ -0,0 +1,61 @@
+package com.ruoyi.flyingbook.mapper;
+
+
+import com.ruoyi.flyingbook.domain.MailInfo;
+
+import java.util.List;
+
+/**
+ * @author ruoyi
+ * @date 2023-04-09
+ */
+public interface MailInfoMapper
+{
+ /**
+ * 查询【请填写功能名称】
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 【请填写功能名称】
+ */
+ public MailInfo selectMailInfoById(Long id);
+
+ /**
+ * 查询【请填写功能名称】列表
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 【请填写功能名称】集合
+ */
+ public List selectMailInfoList(MailInfo mailInfo);
+
+ /**
+ * 新增【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ public int insertMailInfo(MailInfo mailInfo);
+
+ /**
+ * 修改【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ public int updateMailInfo(MailInfo mailInfo);
+
+ /**
+ * 删除【请填写功能名称】
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 结果
+ */
+ public int deleteMailInfoById(Long id);
+
+ /**
+ * 批量删除【请填写功能名称】
+ *
+ * @param ids 需要删除的数据ID
+ * @return 结果
+ */
+ public int deleteMailInfoByIds(Long[] ids);
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IMailInfoService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IMailInfoService.java
new file mode 100644
index 0000000..7f908f9
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/IMailInfoService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.flyingbook.service;
+
+
+import com.ruoyi.flyingbook.domain.MailInfo;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author ruoyi
+ * @date 2023-04-09
+ */
+public interface IMailInfoService
+{
+ /**
+ * 查询【请填写功能名称】
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 【请填写功能名称】
+ */
+ public MailInfo selectMailInfoById(Long id);
+
+ /**
+ * 查询【请填写功能名称】列表
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 【请填写功能名称】集合
+ */
+ public List selectMailInfoList(MailInfo mailInfo);
+
+ /**
+ * 新增【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ public int insertMailInfo(MailInfo mailInfo);
+
+ /**
+ * 修改【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ public int updateMailInfo(MailInfo mailInfo);
+
+ /**
+ * 批量删除【请填写功能名称】
+ *
+ * @param ids 需要删除的【请填写功能名称】ID
+ * @return 结果
+ */
+ public int deleteMailInfoByIds(Long[] ids);
+
+ /**
+ * 删除【请填写功能名称】信息
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 结果
+ */
+ public int deleteMailInfoById(Long id);
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/MailInfoServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/MailInfoServiceImpl.java
new file mode 100644
index 0000000..dbfe9a6
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/MailInfoServiceImpl.java
@@ -0,0 +1,96 @@
+package com.ruoyi.flyingbook.service.impl;
+
+import java.util.List;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.flyingbook.domain.MailInfo;
+import com.ruoyi.flyingbook.mapper.MailInfoMapper;
+import com.ruoyi.flyingbook.service.IMailInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-04-09
+ */
+@Service
+public class MailInfoServiceImpl implements IMailInfoService
+{
+ @Autowired
+ private MailInfoMapper mailInfoMapper;
+
+ /**
+ * 查询【请填写功能名称】
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 【请填写功能名称】
+ */
+ @Override
+ public MailInfo selectMailInfoById(Long id)
+ {
+ return mailInfoMapper.selectMailInfoById(id);
+ }
+
+ /**
+ * 查询【请填写功能名称】列表
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 【请填写功能名称】
+ */
+ @Override
+ public List selectMailInfoList(MailInfo mailInfo)
+ {
+ return mailInfoMapper.selectMailInfoList(mailInfo);
+ }
+
+ /**
+ * 新增【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ @Override
+ public int insertMailInfo(MailInfo mailInfo)
+ {
+ mailInfo.setCreateTime(DateUtils.getNowDate());
+ return mailInfoMapper.insertMailInfo(mailInfo);
+ }
+
+ /**
+ * 修改【请填写功能名称】
+ *
+ * @param mailInfo 【请填写功能名称】
+ * @return 结果
+ */
+ @Override
+ public int updateMailInfo(MailInfo mailInfo)
+ {
+ mailInfo.setUpdateTime(DateUtils.getNowDate());
+ return mailInfoMapper.updateMailInfo(mailInfo);
+ }
+
+ /**
+ * 批量删除【请填写功能名称】
+ *
+ * @param ids 需要删除的【请填写功能名称】ID
+ * @return 结果
+ */
+ @Override
+ public int deleteMailInfoByIds(Long[] ids)
+ {
+ return mailInfoMapper.deleteMailInfoByIds(ids);
+ }
+
+ /**
+ * 删除【请填写功能名称】信息
+ *
+ * @param id 【请填写功能名称】ID
+ * @return 结果
+ */
+ @Override
+ public int deleteMailInfoById(Long id)
+ {
+ return mailInfoMapper.deleteMailInfoById(id);
+ }
+}
diff --git a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
new file mode 100644
index 0000000..0a10bea
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, mail_server, mail_port, mail_protocol, mail_user_name, mail_authorization_code, mail_receive_folder, create_by, create_time, update_by, update_time, flag, remark from mail_info
+
+
+
+
+
+
+
+ insert into mail_info
+
+ mail_server,
+ mail_port,
+ mail_protocol,
+ mail_user_name,
+ mail_authorization_code,
+ mail_receive_folder,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+ flag,
+ remark,
+
+
+ #{mailServer},
+ #{mailPort},
+ #{mailProtocol},
+ #{mailUserName},
+ #{mailAuthorizationCode},
+ #{mailReceiveFolder},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+ #{flag},
+ #{remark},
+
+
+
+
+ update mail_info
+
+ mail_server = #{mailServer},
+ mail_port = #{mailPort},
+ mail_protocol = #{mailProtocol},
+ mail_user_name = #{mailUserName},
+ mail_authorization_code = #{mailAuthorizationCode},
+ mail_receive_folder = #{mailReceiveFolder},
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+ flag = #{flag},
+ remark = #{remark},
+
+ where id = #{id}
+
+
+
+ delete from mail_info where id = #{id}
+
+
+
+ delete from mail_info where id in
+
+ #{id}
+
+
+
\ No newline at end of file
diff --git a/sql/infoMenu.sql b/sql/infoMenu.sql
new file mode 100644
index 0000000..b4d0067
--- /dev/null
+++ b/sql/infoMenu.sql
@@ -0,0 +1,22 @@
+-- 菜单 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】', '3', '1', 'info', 'system/info/index', 1, 0, 'C', '0', '0', 'system:info:list', '#', 'admin', sysdate(), '', null, '【请填写功能名称】菜单');
+
+-- 按钮父菜单ID
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 按钮 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'system:info:query', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'system:info:add', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'system:info:edit', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'system:info:remove', '#', 'admin', sysdate(), '', null, '');
+
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('【请填写功能名称】导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'system:info:export', '#', 'admin', sysdate(), '', null, '');
\ No newline at end of file
From 592bf3dcbfcdcdf800bdd9d6bf470cbe2a94c68d Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Sun, 9 Apr 2023 23:40:42 +0800
Subject: [PATCH 3/7] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AE=9A?=
=?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ruoyi/common/enums/EventOperateType.java | 3 +-
.../common/enums/TableRelationTypeEnum.java | 3 +-
ruoyi-flyingbook/pom.xml | 2 +-
.../domain/LarkCompanyTableInfo.java | 25 ++++
.../com/ruoyi/flyingbook/domain/MailInfo.java | 2 +
.../flyingbook/domain/lark/LarkRequest.java | 2 +
.../com/ruoyi/flyingbook/mail/MailHelper.java | 136 +++++++-----------
.../ruoyi/flyingbook/mail/MailHttpHelper.java | 108 ++++++++++++++
.../flyingbook/mail/MailTencentHelper.java | 107 ++++++++++++++
.../flyingbook/mail/request/MailRequest.java | 20 +--
.../mapper/LarkTableRelationMapper.java | 3 +
.../mapper/LarkTableRelationMapper.xml | 113 ++++++++++-----
.../main/resources/mapper/MailInfoMapper.xml | 15 +-
ruoyi-quartz/pom.xml | 4 +
.../com/ruoyi/quartz/task/MailSyncTask.java | 94 ++++++++++++
15 files changed, 505 insertions(+), 132 deletions(-)
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyTableInfo.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MailSyncTask.java
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java
index 96f014c..9b8680e 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/EventOperateType.java
@@ -13,7 +13,8 @@ public enum EventOperateType {
CREATE("CREATE", "创建"),
UPDATE("UPDATE", "更新"),
DELETE("DELETE", "删除"),
- STOP("STOP", "终止");
+ STOP("STOP", "终止"),
+ SYNC_MAIL("SYNC_MAIL", "同步邮件"),;
private final String code;
private final String info;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java
index a207960..fe90dea 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/TableRelationTypeEnum.java
@@ -12,7 +12,8 @@ public enum TableRelationTypeEnum {
*/
MAINTENANCE_ROW_RELATION("MAINTENANCE_ROW_RELATION", "维护表之间的字段关系"),
SINGLE_DIRECTION("SINGLE_DIRECTION", "单向传递"),
- DOUBLE_DIRECTION("DOUBLE_DIRECTION", "双向传递");
+ DOUBLE_DIRECTION("DOUBLE_DIRECTION", "双向传递"),
+ SYNC_EMAIL("SYNC_EMAIL", "同步邮箱"),;
private String code;
private String info;
diff --git a/ruoyi-flyingbook/pom.xml b/ruoyi-flyingbook/pom.xml
index b6d07e9..27f1ad4 100644
--- a/ruoyi-flyingbook/pom.xml
+++ b/ruoyi-flyingbook/pom.xml
@@ -60,7 +60,7 @@
com.sun.mail
javax.mail
- 1.5.5
+ 1.6.2
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyTableInfo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyTableInfo.java
new file mode 100644
index 0000000..912bc47
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/LarkCompanyTableInfo.java
@@ -0,0 +1,25 @@
+package com.ruoyi.flyingbook.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 【请填写功能名称】对象 lark_table_relation
+ *
+ * @author ruoyi
+ * @date 2023-03-15
+ */
+@Data
+public class LarkCompanyTableInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Long id;
+ private String appId;
+ private String appSecret;
+ private String fromAppToken;
+ private String fromTableId;
+ private String toAppToken;
+ private String toTableId;
+
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
index 45f84b7..ede2e77 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
@@ -13,6 +13,8 @@ public class MailInfo extends BaseEntity {
private Long id;
+ private Long larkTableId;
+
/** 邮件服务器地址 */
private String mailServer;
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java
index f3016c7..6f41aa5 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkRequest.java
@@ -15,6 +15,8 @@ import java.util.List;
@AllArgsConstructor
public class LarkRequest {
+ private Long id;
+
private String appId;
private String appSecret;
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
index 9c54058..b6a4f29 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
@@ -1,107 +1,79 @@
package com.ruoyi.flyingbook.mail;
-import com.ruoyi.flyingbook.mail.request.MailRequest;
+import com.lark.oapi.service.bitable.v1.model.CreateAppTableRecordRespBody;
+import com.ruoyi.common.enums.EventOperateType;
+import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper;
+import com.ruoyi.flyingbook.domain.Event;
+import com.ruoyi.flyingbook.domain.EventLog;
+import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
+import com.ruoyi.flyingbook.mapper.EventLogMapper;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
-import javax.mail.*;
+import javax.mail.Flags;
+import javax.mail.Message;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
-import javax.mail.search.*;
-import java.security.Security;
-import java.util.Properties;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
/**
* @author yuxiangyong
- * @create 2023-04-09 15:28
+ * @create 2023-04-09 20:27
*/
@Slf4j
-@Component
public class MailHelper {
- /**
- * ssl加密
- */
- private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
+ @Autowired
+ private LarkTableHelper larkTableHelper;
+ @Autowired
+ private EventLogMapper eventLogMapper;
- public static void main(String[] args) {
- MailHelper mailHelper = new MailHelper();
- MailRequest req = new MailRequest("imap.qq.com",993,"932687738","ohziejkxqvsgbbag");
- mailHelper.receiveMail(req);
- }
+ protected void parseMsg(Message[] messages,LarkTableRequest add) {
- public void receiveMail(MailRequest req){
- Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
- // 定义连接imap服务器的属性信息
- String portStr = String.valueOf(req.getEmailPort());
- Properties props = new Properties();
- props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
- props.setProperty("mail.imap.socketFactory.fallback", "false");
- props.setProperty("mail.transport.protocol", req.getEmailProtocol());
- props.setProperty("mail.imap.port", portStr);
- props.setProperty("mail.imap.socketFactory.port", portStr);
- //创建会话
- Session session = Session.getInstance(props, new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
- }
- });
- Store store = null;
- Folder folder = null;
- try {
- //存储对象
- store = session.getStore(req.getEmailProtocol());
- //连接
- store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(),req.getAuthorizationCode());
- // 获得收件箱
- folder = store.getFolder(req.getReceiveFolder());
- // 以读写模式打开收件箱
- folder.open(Folder.READ_WRITE);
- //false 表示未读
- FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
- //获得收件箱的邮件列表
- Message[] messages = folder.search(flagTerm);
- // 打印不同状态的邮件数量
- log.info("收件箱中共{}封邮件!\n共{}封未读邮件!\n共{}封新邮件!\n共{}封已删除邮件!",
- messages.length,
- folder.getUnreadMessageCount(),
- folder.getNewMessageCount(),
- folder.getDeletedMessageCount());
- log.info("------------------------开始解析邮件----------------------------------");
- for (int i = 0; i < messages.length; i++) {
- Message message = messages[i];
- parseMsg(message);
- //设置已读
- message.setFlag(Flags.Flag.SEEN,true);
- }
- } catch (Exception e) {
- log.error("邮件解析失败",e);
- } finally {
+ /**
+ * 意向度、现有学历、学生姓名、报名时间、手机号码、省市、备注、回放记录、业务员、信息完成度、数据来源、目标国家、所属学校、邮箱来源
+ */
+ List logs = new ArrayList<>();
+ for (Message message : messages) {
try {
- if (folder != null) {
- folder.close(false);
- }
- if (store != null) {
- store.close();
- }
- } catch (MessagingException e) {
- log.error("邮件解析失败",e);
+ System.out.println("消息:" + message.getSubject());
+ String from = MimeUtility.decodeText(message.getFrom()[0].toString());
+ InternetAddress internetAddress = new InternetAddress(from);
+ System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
+ String recordId = syncLarkTable(message,add);
+ this.buildLog(logs,message,recordId,null);
+ message.setFlag(Flags.Flag.SEEN, true);
+ } catch (Exception e) {
+ this.buildLog(logs,message,null,e);
}
}
+ if (CollectionUtils.isNotEmpty(logs)){
+ eventLogMapper.insertBatchEventLog(logs);
+ }
}
- private void parseMsg(Message message){
- try {
- System.out.println("消息:"+ message.getSubject());
- String from = MimeUtility.decodeText(message.getFrom()[0].toString());
- InternetAddress internetAddress = new InternetAddress(from);
- System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
-
- }catch (Exception e){
+ private void buildLog(List logs,Message message,String recordId,Exception e){
+ EventLog log = e != null ?
+ new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message.toString())
+ : new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message.toString(),null,e.getMessage());
+ log.setRemark(recordId);
+ logs.add(log);
+ }
- }
+ private String syncLarkTable(Message message,LarkTableRequest add){
+ Map body = this.buildBody(message);
+ add.setBody(body);
+ CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(add);
+ return respBody.getRecord().getRecordId();
+ }
+ protected Map buildBody(Message message){
+ return new HashMap<>();
}
+
}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
new file mode 100644
index 0000000..5ebe718
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
@@ -0,0 +1,108 @@
+package com.ruoyi.flyingbook.mail;
+
+import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
+import com.ruoyi.flyingbook.mail.request.MailRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeUtility;
+import javax.mail.search.FlagTerm;
+import java.security.Security;
+import java.util.Properties;
+
+/**
+ * @author yuxiangyong
+ * @create 2023-04-09 15:28
+ */
+@Slf4j
+@Component
+public class MailHttpHelper extends MailHelper{
+
+ public static void main(String[] args) {
+ MailHttpHelper mailHelper = new MailHttpHelper();
+ MailRequest req = new MailRequest("xjia.synology.me",5000,"xjzsb","12345678");
+// req = new MailRequest("imap.qq.com",993,"932687738","lwoapikuenmzbfaj");
+ mailHelper.test(req);
+ }
+
+ public void test(MailRequest req){
+ try {
+ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
+ Properties props = new Properties();
+ props.setProperty("mail.debug","true");
+// props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+// props.setProperty("mail.pop3.socketFactory.fallback", "false");
+ props.setProperty("mail.transport.protocol", "pop3");
+ Session session = Session.getInstance(props, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
+ }
+ });
+ Store store = session.getStore("pop3");
+ store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(), req.getAuthorizationCode());
+ Folder inbox = store.getFolder("INBOX");
+ }catch (Exception e){
+ log.info("",e);
+ }
+ }
+
+ public void receiveMail(MailRequest req, LarkTableRequest add){
+ // 定义连接imap服务器的属性信息
+ String portStr = String.valueOf(req.getEmailPort());
+ Properties props = new Properties();
+ props.setProperty("mail.smtp.ssl.enable","false");
+ props.setProperty("mail.imap.starttls.enable","true");
+ props.setProperty("mail.imap.socketFactory.fallback", "false");
+ props.setProperty("mail.transport.protocol", req.getEmailProtocol());
+ props.setProperty("mail.imap.port", portStr);
+ props.setProperty("mail.imap.socketFactory.port", portStr);
+ props.setProperty("mail.debug","false");
+ //创建会话
+ Session session = Session.getInstance(props, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
+ }
+ });
+ Store store = null;
+ Folder folder = null;
+ try {
+ //存储对象
+ store = session.getStore(req.getEmailProtocol());
+ //连接
+ store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(),req.getAuthorizationCode());
+ // 获得收件箱
+ folder = store.getFolder(req.getReceiveFolder());
+ // 以读写模式打开收件箱
+ folder.open(Folder.READ_WRITE);
+ //false 表示未读
+ FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
+ //获得收件箱的邮件列表
+ Message[] messages = folder.search(flagTerm);
+ // 打印不同状态的邮件数量
+ log.info("收件箱中共{}封邮件!\n共{}封未读邮件!\n共{}封新邮件!\n共{}封已删除邮件!",
+ messages.length,
+ folder.getUnreadMessageCount(),
+ folder.getNewMessageCount(),
+ folder.getDeletedMessageCount());
+ log.info("------------------------开始解析邮件----------------------------------");
+// this.parseMsg(messages,add);
+ } catch (Exception e) {
+ log.error("邮件解析失败",e);
+ } finally {
+ try {
+ if (folder != null) {
+ folder.close(false);
+ }
+ if (store != null) {
+ store.close();
+ }
+ } catch (MessagingException e) {
+ log.error("邮件解析失败",e);
+ }
+ }
+ }
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
new file mode 100644
index 0000000..80b45d3
--- /dev/null
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
@@ -0,0 +1,107 @@
+package com.ruoyi.flyingbook.mail;
+
+import com.ruoyi.flyingbook.mail.request.MailRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeUtility;
+import javax.mail.search.*;
+import java.security.Security;
+import java.util.Properties;
+
+/**
+ * @author yuxiangyong
+ * @create 2023-04-09 15:28
+ */
+@Slf4j
+@Component
+public class MailTencentHelper {
+
+ /**
+ * ssl加密
+ */
+ private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
+
+ public static void main(String[] args) {
+ MailTencentHelper mailHelper = new MailTencentHelper();
+ MailRequest req = new MailRequest("imap.qq.com",993,"932687738","ohziejkxqvsgbbag");
+ mailHelper.receiveMail(req);
+ }
+
+ public void receiveMail(MailRequest req){
+ Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
+ // 定义连接imap服务器的属性信息
+ String portStr = String.valueOf(req.getEmailPort());
+ Properties props = new Properties();
+ props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
+ props.setProperty("mail.imap.socketFactory.fallback", "false");
+ props.setProperty("mail.transport.protocol", req.getEmailProtocol());
+ props.setProperty("mail.imap.port", portStr);
+ props.setProperty("mail.imap.socketFactory.port", portStr);
+
+ //创建会话
+ Session session = Session.getInstance(props, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
+ }
+ });
+ Store store = null;
+ Folder folder = null;
+ try {
+ //存储对象
+ store = session.getStore(req.getEmailProtocol());
+ //连接
+ store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(),req.getAuthorizationCode());
+ // 获得收件箱
+ folder = store.getFolder(req.getReceiveFolder());
+ // 以读写模式打开收件箱
+ folder.open(Folder.READ_WRITE);
+ //false 表示未读
+ FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
+ //获得收件箱的邮件列表
+ Message[] messages = folder.search(flagTerm);
+ // 打印不同状态的邮件数量
+ log.info("收件箱中共{}封邮件!\n共{}封未读邮件!\n共{}封新邮件!\n共{}封已删除邮件!",
+ messages.length,
+ folder.getUnreadMessageCount(),
+ folder.getNewMessageCount(),
+ folder.getDeletedMessageCount());
+ log.info("------------------------开始解析邮件----------------------------------");
+ for (int i = 0; i < messages.length; i++) {
+ Message message = messages[i];
+ parseMsg(message);
+ //设置已读
+ message.setFlag(Flags.Flag.SEEN,true);
+ }
+ } catch (Exception e) {
+ log.error("邮件解析失败",e);
+ } finally {
+ try {
+ if (folder != null) {
+ folder.close(false);
+ }
+ if (store != null) {
+ store.close();
+ }
+ } catch (MessagingException e) {
+ log.error("邮件解析失败",e);
+ }
+ }
+ }
+
+ private void parseMsg(Message message){
+ try {
+ System.out.println("消息:"+ message.getSubject());
+ String from = MimeUtility.decodeText(message.getFrom()[0].toString());
+ InternetAddress internetAddress = new InternetAddress(from);
+ System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
+
+ }catch (Exception e){
+
+ }
+
+ }
+}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
index 6af378c..3e0aa43 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
@@ -1,5 +1,6 @@
package com.ruoyi.flyingbook.mail.request;
+import com.ruoyi.flyingbook.domain.MailInfo;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -53,15 +54,6 @@ public class MailRequest {
}
}
- public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode, Boolean readFeedback) {
- this.emailServer = emailServer;
- this.emailPort = emailPort;
- this.userName = userName;
- this.authorizationCode = authorizationCode;
- this.readFeedback = readFeedback;
- this.fillDefault(readFeedback);
- }
-
public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode) {
this.emailServer = emailServer;
this.emailPort = emailPort;
@@ -69,4 +61,14 @@ public class MailRequest {
this.authorizationCode = authorizationCode;
this.fillDefault(Boolean.TRUE);
}
+
+ public MailRequest(MailInfo info,Boolean readFeedback) {
+ this.emailServer = info.getMailServer();
+ this.emailPort = Integer.valueOf(info.getMailPort());
+ this.userName = info.getMailUserName();
+ this.authorizationCode = info.getMailAuthorizationCode();
+ this.emailProtocol = info.getMailProtocol();
+ this.receiveFolder = info.getMailReceiveFolder();
+ this.readFeedback = Boolean.TRUE.equals(readFeedback);
+ }
}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
index 227fb05..66a202b 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.flyingbook.mapper;
+import com.ruoyi.flyingbook.domain.LarkCompanyTableInfo;
import com.ruoyi.flyingbook.domain.LarkTableRelation;
import org.apache.ibatis.annotations.Param;
@@ -62,4 +63,6 @@ public interface LarkTableRelationMapper
*/
public int deleteLarkTableRelationByIds(Long[] ids);
+ public List queryListByIdListJoinLarkCompany(@Param("ids") List tableIds, @Param("flag") Long flag, @Param("relationType") String relationType);
+
}
diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml
index 13ea82a..e78b564 100644
--- a/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml
+++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkTableRelationMapper.xml
@@ -1,48 +1,73 @@
+ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+ "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- select id, lark_company_relation_id, from_app_token, from_table_id, to_app_token, to_table_id, create_by, create_time, update_by, update_time, flag, remark,relation_type from lark_table_relation
+ select id,
+ lark_company_relation_id,
+ from_app_token,
+ from_table_id,
+ to_app_token,
+ to_table_id,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+ flag,
+ remark,
+ relation_type
+ from lark_table_relation
-
\ No newline at end of file
diff --git a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
index 0a10bea..74ae45c 100644
--- a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
+++ b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
@@ -6,6 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
@@ -21,12 +22,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- select id, mail_server, mail_port, mail_protocol, mail_user_name, mail_authorization_code, mail_receive_folder, create_by, create_time, update_by, update_time, flag, remark from mail_info
+ select id,lark_table_id, mail_server, mail_port, mail_protocol, mail_user_name, mail_authorization_code, mail_receive_folder, create_by, create_time, update_by, update_time, flag, remark from mail_info
-
+
-
+
+ and lark_table_id = #{larkTableId}
and mail_server = #{mailServer}
and mail_port = #{mailPort}
and mail_protocol = #{mailProtocol}
@@ -42,9 +44,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
-
+
insert into mail_info
+ lark_table_id,
mail_server,
mail_port,
mail_protocol,
@@ -59,6 +62,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
remark,
+ #{larkTableId},
#{mailServer},
#{mailPort},
#{mailProtocol},
@@ -74,9 +78,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
+
update mail_info
+ lark_table_id = #{larkTableId},
mail_server = #{mailServer},
mail_port = #{mailPort},
mail_protocol = #{mailProtocol},
diff --git a/ruoyi-quartz/pom.xml b/ruoyi-quartz/pom.xml
index 864ece1..b438e64 100644
--- a/ruoyi-quartz/pom.xml
+++ b/ruoyi-quartz/pom.xml
@@ -34,6 +34,10 @@
com.ruoyi
ruoyi-common
+
+ com.ruoyi
+ ruoyi-flyingbook
+
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MailSyncTask.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MailSyncTask.java
new file mode 100644
index 0000000..5a379dd
--- /dev/null
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/MailSyncTask.java
@@ -0,0 +1,94 @@
+package com.ruoyi.quartz.task;
+
+import com.ruoyi.common.enums.FlagStatus;
+import com.ruoyi.common.enums.TableRelationTypeEnum;
+import com.ruoyi.flyingbook.domain.LarkCompanyTableInfo;
+import com.ruoyi.flyingbook.domain.MailInfo;
+import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
+import com.ruoyi.flyingbook.mail.MailHttpHelper;
+import com.ruoyi.flyingbook.mail.request.MailRequest;
+import com.ruoyi.flyingbook.mapper.LarkTableRelationMapper;
+import com.ruoyi.flyingbook.service.IMailInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author ruoyi
+ */
+@Slf4j
+@Component("mailSyncTask")
+public class MailSyncTask {
+
+ @Autowired
+ private MailHttpHelper mailHttpHelper;
+
+ @Autowired
+ private IMailInfoService iMailInfoService;
+ @Autowired
+ private LarkTableRelationMapper larkTableRelationMapper;
+
+ public void syncMail() {
+ log.info("MailSyncTask start");
+ MailInfo mailInfo = new MailInfo();
+ mailInfo.setFlag(FlagStatus.OK.getCode());
+ List mailInfos = iMailInfoService.selectMailInfoList(mailInfo);
+ log.info("MailSyncTask execute size:{}", mailInfos.size());
+ Map larkMap = this.getLarkMap(mailInfos);
+
+ for (MailInfo info : mailInfos) {
+ LarkTableRequest addRequest = larkMap.get(info.getLarkTableId());
+ if (addRequest == null) {
+ log.info("待同步邮箱未配置飞书相关信息,mailInfo:{}", info);
+ continue;
+ }
+ MailRequest request = new MailRequest(info, Boolean.TRUE);
+ mailHttpHelper.receiveMail(request,addRequest);
+ }
+ log.info("MailSyncTask end");
+ }
+
+ private Map getLarkMap(List mailInfos) {
+ List tableIds = mailInfos.stream()
+ .filter(r -> {
+ return r.getLarkTableId() != null;
+ })
+ .map(MailInfo::getLarkTableId)
+ .distinct()
+ .collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(tableIds)) {
+ return new HashMap<>();
+ }
+ List larkCompanyTableInfos = larkTableRelationMapper.queryListByIdListJoinLarkCompany(tableIds, FlagStatus.OK.getCode(), TableRelationTypeEnum.SYNC_EMAIL.getCode());
+ return larkCompanyTableInfos.stream()
+ .filter(r -> {
+ return r.getId() != null
+ && StringUtils.isNotBlank(r.getAppId())
+ && StringUtils.isNotBlank(r.getAppSecret())
+ && StringUtils.isNotBlank(r.getToAppToken())
+ && StringUtils.isNotBlank(r.getToTableId());
+ })
+ .map(r -> {
+ LarkTableRequest request = new LarkTableRequest();
+ request.setId(r.getId());
+ request.setAppId(r.getAppId());
+ request.setAppSecret(r.getAppSecret());
+ request.setAppToken(r.getToAppToken());
+ request.setAppTable(r.getToTableId());
+ return request;
+ })
+ .collect(
+ Collectors.toMap(LarkTableRequest::getId, Function.identity(), (k1, k2) -> k1)
+ );
+ }
+}
From 2daa1d5fafd72d99f46f3135ba098dde1aa66a76 Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Tue, 11 Apr 2023 20:51:44 +0800
Subject: [PATCH 4/7] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=82=AE?=
=?UTF-8?q?=E7=AE=B1=E5=90=8C=E6=AD=A5=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/ruoyi/common/enums/AppType.java | 3 +-
.../com/ruoyi/flyingbook/mail/MailHelper.java | 75 +++++++++++++++----
.../ruoyi/flyingbook/mail/MailHttpHelper.java | 69 +++++++++--------
.../mapper/LarkTableRelationMapper.java | 2 +-
.../main/resources/mapper/MailInfoMapper.xml | 2 +-
.../framework/config/SecurityConfig.java | 2 +-
.../quartz/controller/MailInfoController.java | 24 ++++++
7 files changed, 124 insertions(+), 53 deletions(-)
create mode 100644 ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java
index 600f38e..d55ef60 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/AppType.java
@@ -10,7 +10,8 @@ public enum AppType {
*
*/
MULTIDIMENSIONAL_TABLE("MULTIDIMENSIONAL_TABLE", "多维表格"),
- APPROVAL_TASK("APPROVAL_TASK", "审批回调");
+ APPROVAL_TASK("APPROVAL_TASK", "审批回调"),
+ SYNC_EMAIL("SYNC_EMAIL", "同步邮箱");
private final String code;
private final String info;
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
index b6a4f29..b2660e6 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
@@ -11,10 +11,12 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import javax.mail.Flags;
-import javax.mail.Message;
+import javax.mail.*;
import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -33,23 +35,28 @@ public class MailHelper {
private EventLogMapper eventLogMapper;
protected void parseMsg(Message[] messages,LarkTableRequest add) {
-
+ log.info("------------------------开始解析邮件----------------------------------");
/**
* 意向度、现有学历、学生姓名、报名时间、手机号码、省市、备注、回放记录、业务员、信息完成度、数据来源、目标国家、所属学校、邮箱来源
*/
List logs = new ArrayList<>();
for (Message message : messages) {
+ String msgSubject = null;
try {
- System.out.println("消息:" + message.getSubject());
+ log.info("----------------------------------------------------------");
String from = MimeUtility.decodeText(message.getFrom()[0].toString());
InternetAddress internetAddress = new InternetAddress(from);
- System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
+ msgSubject = String.format("主题:%s,发件人:%s(%s),收件人:%s",
+ message.getSubject(),
+ internetAddress.getPersonal(),
+ internetAddress.getAddress(),
+ this.getReceiveAddress(message,null));
String recordId = syncLarkTable(message,add);
- this.buildLog(logs,message,recordId,null);
+ this.buildLog(logs,msgSubject,recordId,null);
message.setFlag(Flags.Flag.SEEN, true);
} catch (Exception e) {
- this.buildLog(logs,message,null,e);
+ this.buildLog(logs,msgSubject,null,e);
}
}
if (CollectionUtils.isNotEmpty(logs)){
@@ -57,22 +64,62 @@ public class MailHelper {
}
}
- private void buildLog(List logs,Message message,String recordId,Exception e){
- EventLog log = e != null ?
- new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message.toString())
- : new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message.toString(),null,e.getMessage());
+ public String getReceiveAddress(Message msg, Message.RecipientType type) throws MessagingException {
+ StringBuffer receiveAddress = new StringBuffer();
+ Address[] addresss = null;
+ if (type == null) {
+ addresss = msg.getAllRecipients();
+ } else {
+ addresss = msg.getRecipients(type);
+ }
+
+ if (addresss == null || addresss.length < 1)
+ return null;
+ for (Address address : addresss) {
+ InternetAddress internetAddress = (InternetAddress) address;
+ receiveAddress.append(internetAddress.toUnicodeString()).append(",");
+ }
+
+ receiveAddress.deleteCharAt(receiveAddress.length() - 1); //删除最后一个逗号
+
+ return receiveAddress.toString();
+ }
+
+ public void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
+ //如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
+ boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
+ if (part.isMimeType("text/*") && !isContainTextAttach) {
+ content.append(part.getContent().toString());
+ } else if (part.isMimeType("message/rfc822")) {
+ getMailTextContent((Part) part.getContent(), content);
+ } else if (part.isMimeType("multipart/*")) {
+ Multipart multipart = (Multipart) part.getContent();
+ int partCount = multipart.getCount();
+ for (int i = 0; i < partCount; i++) {
+ BodyPart bodyPart = multipart.getBodyPart(i);
+ getMailTextContent(bodyPart, content);
+ }
+ }
+ }
+
+ private void buildLog(List logs,String message,String recordId,Exception e){
+ EventLog log = e == null ?
+ new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message)
+ : new EventLog(null, EventOperateType.SYNC_MAIL.getCode(), message,null,e.getMessage());
log.setRemark(recordId);
logs.add(log);
}
- private String syncLarkTable(Message message,LarkTableRequest add){
- Map body = this.buildBody(message);
+ private String syncLarkTable(Message message,LarkTableRequest add) throws MessagingException, IOException {
+ StringBuffer content = new StringBuffer(30);
+ getMailTextContent(message,content);
+ Map body = this.buildBody(message,content.toString());
add.setBody(body);
CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(add);
return respBody.getRecord().getRecordId();
}
- protected Map buildBody(Message message){
+ protected Map buildBody(Message message,String content){
return new HashMap<>();
}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
index 5ebe718..ff73dbc 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
@@ -10,6 +10,8 @@ import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import java.security.Security;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Properties;
/**
@@ -23,43 +25,17 @@ public class MailHttpHelper extends MailHelper{
public static void main(String[] args) {
MailHttpHelper mailHelper = new MailHttpHelper();
MailRequest req = new MailRequest("xjia.synology.me",5000,"xjzsb","12345678");
-// req = new MailRequest("imap.qq.com",993,"932687738","lwoapikuenmzbfaj");
- mailHelper.test(req);
- }
-
- public void test(MailRequest req){
- try {
- Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
- Properties props = new Properties();
- props.setProperty("mail.debug","true");
-// props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
-// props.setProperty("mail.pop3.socketFactory.fallback", "false");
- props.setProperty("mail.transport.protocol", "pop3");
- Session session = Session.getInstance(props, new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(req.getUserName(),req.getAuthorizationCode());
- }
- });
- Store store = session.getStore("pop3");
- store.connect(req.getEmailServer(),req.getEmailPort(),req.getUserName(), req.getAuthorizationCode());
- Folder inbox = store.getFolder("INBOX");
- }catch (Exception e){
- log.info("",e);
- }
+ req = new MailRequest("xjia.synology.me",143,"xjzsb@xjia-edu.com","12345678");
+ mailHelper.receiveMail(req,null);
}
public void receiveMail(MailRequest req, LarkTableRequest add){
// 定义连接imap服务器的属性信息
- String portStr = String.valueOf(req.getEmailPort());
Properties props = new Properties();
- props.setProperty("mail.smtp.ssl.enable","false");
- props.setProperty("mail.imap.starttls.enable","true");
- props.setProperty("mail.imap.socketFactory.fallback", "false");
- props.setProperty("mail.transport.protocol", req.getEmailProtocol());
- props.setProperty("mail.imap.port", portStr);
- props.setProperty("mail.imap.socketFactory.port", portStr);
- props.setProperty("mail.debug","false");
+ props.put("mail.store.protocol", req.getEmailProtocol());
+ props.put("mail.imap.host", req.getEmailServer());
+ props.put("mail.imap.port", req.getEmailPort());
+ props.put("mail.imap.starttls.enable", "true");
//创建会话
Session session = Session.getInstance(props, new Authenticator() {
@Override
@@ -79,7 +55,7 @@ public class MailHttpHelper extends MailHelper{
// 以读写模式打开收件箱
folder.open(Folder.READ_WRITE);
//false 表示未读
- FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),false);
+ FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN),true);
//获得收件箱的邮件列表
Message[] messages = folder.search(flagTerm);
// 打印不同状态的邮件数量
@@ -88,8 +64,7 @@ public class MailHttpHelper extends MailHelper{
folder.getUnreadMessageCount(),
folder.getNewMessageCount(),
folder.getDeletedMessageCount());
- log.info("------------------------开始解析邮件----------------------------------");
-// this.parseMsg(messages,add);
+ this.parseMsg(messages,add);
} catch (Exception e) {
log.error("邮件解析失败",e);
} finally {
@@ -105,4 +80,28 @@ public class MailHttpHelper extends MailHelper{
}
}
}
+
+ /**
+ * 意向度、现有学历、学生姓名、报名时间、手机号码、省市、备注、回放记录、业务员、信息完成度、数据来源、目标国家、所属学校、邮箱来源
+ */
+ @Override
+ protected Map buildBody(Message message,String content) {
+ Map map = new HashMap<>();
+ map.put("学生姓名",null);
+ map.put("意向度",null);
+ map.put("现有学历",null);
+ map.put("报名时间",null);
+ map.put("手机号码",null);
+ map.put("省市",null);
+ map.put("备注",null);
+ map.put("回放记录",null);
+ map.put("业务员",null);
+ map.put("信息完成度",null);
+ map.put("数据来源",null);
+ map.put("目标国家",null);
+ map.put("所属学校",null);
+ map.put("邮箱来源",null);
+ map.put("原始线索",content);
+ return map;
+ }
}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
index 66a202b..9c08f47 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mapper/LarkTableRelationMapper.java
@@ -63,6 +63,6 @@ public interface LarkTableRelationMapper
*/
public int deleteLarkTableRelationByIds(Long[] ids);
- public List queryListByIdListJoinLarkCompany(@Param("ids") List tableIds, @Param("flag") Long flag, @Param("relationType") String relationType);
+ public List queryListByIdListJoinLarkCompany(@Param("tableIds") List tableIds, @Param("flag") Long flag, @Param("relationType") String relationType);
}
diff --git a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
index 74ae45c..1fb61c2 100644
--- a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
+++ b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index aa0b33c..11bf344 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -97,7 +97,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
// 过滤请求
.authorizeRequests()
// 对于登录login 验证码captchaImage 允许匿名访问
- .antMatchers("/login", "/captchaImage", "/approval", "/approval2").anonymous()
+ .antMatchers("/login", "/captchaImage", "/approval","/syncEmail", "/approval2").anonymous()
.antMatchers(
HttpMethod.GET,
"/*.html",
diff --git a/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java
new file mode 100644
index 0000000..7f2f06f
--- /dev/null
+++ b/ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/MailInfoController.java
@@ -0,0 +1,24 @@
+package com.ruoyi.quartz.controller;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.quartz.task.MailSyncTask;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@Slf4j
+@RestController
+public class MailInfoController extends BaseController {
+
+ @Autowired
+ private MailSyncTask mailSyncTask;
+
+ @PostMapping("/syncEmail")
+ public void syncEmail() {
+ mailSyncTask.syncMail();
+ }
+
+}
+
From 9c6507a7c9dc55548e496bb06a4c4a5c05b67679 Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Wed, 12 Apr 2023 21:09:21 +0800
Subject: [PATCH 5/7] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=82=AE?=
=?UTF-8?q?=E7=AE=B1=E5=90=8C=E6=AD=A5=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ruoyi/flyingbook/mail/MailHttpHelper.java | 59 ++++++++++++++++---
1 file changed, 50 insertions(+), 9 deletions(-)
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
index ff73dbc..14a2feb 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
@@ -3,6 +3,8 @@ package com.ruoyi.flyingbook.mail;
import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
import com.ruoyi.flyingbook.mail.request.MailRequest;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.Index;
import org.springframework.stereotype.Component;
import javax.mail.*;
@@ -24,9 +26,10 @@ public class MailHttpHelper extends MailHelper{
public static void main(String[] args) {
MailHttpHelper mailHelper = new MailHttpHelper();
- MailRequest req = new MailRequest("xjia.synology.me",5000,"xjzsb","12345678");
- req = new MailRequest("xjia.synology.me",143,"xjzsb@xjia-edu.com","12345678");
- mailHelper.receiveMail(req,null);
+// MailRequest req = new MailRequest("xjia.synology.me",5000,"xjzsb","12345678");
+// req = new MailRequest("xjia.synology.me",143,"xjzsb@xjia-edu.com","12345678");
+// mailHelper.receiveMail(req,null);
+ mailHelper.buildBody(null,"刘畅文祺 13996409399父亲微信同 重庆 高三作曲 英语120 文化一本线 意向美国伯克利 其他国家也可以考虑一下 费用没问题 了解过其他学校 过几天联系");
}
public void receiveMail(MailRequest req, LarkTableRequest add){
@@ -87,21 +90,59 @@ public class MailHttpHelper extends MailHelper{
@Override
protected Map buildBody(Message message,String content) {
Map map = new HashMap<>();
- map.put("学生姓名",null);
+ Integer index = 0;
+ StringBuilder str = new StringBuilder();
+ for (String s : content.split("")) {
+ if (StringUtils.isNotBlank(str) && s.equals(" ")){
+ this.fillMap(map,str.toString(),index);
+ str = new StringBuilder();
+ index ++;
+ continue;
+ }
+ if (s.equals(" ")){
+ continue;
+ }
+ str.append(s);
+ }
+
map.put("意向度",null);
- map.put("现有学历",null);
map.put("报名时间",null);
- map.put("手机号码",null);
- map.put("省市",null);
- map.put("备注",null);
map.put("回放记录",null);
map.put("业务员",null);
map.put("信息完成度",null);
map.put("数据来源",null);
- map.put("目标国家",null);
map.put("所属学校",null);
map.put("邮箱来源",null);
+// if (index > 6){
+// map.clear();
+// }
map.put("原始线索",content);
return map;
}
+ private void fillMap(Map map,String msg,Integer index){
+ switch (index){
+ case 0:
+ map.put("学生姓名",msg);
+ break;
+ case 1:
+ map.put("省市",msg);
+ break;
+ case 2:
+ map.put("现有学历",msg);
+ break;
+ case 3:
+ map.put("手机号码",msg);
+ break;
+ case 4:
+ break;
+ case 5:
+ map.put("目标国家",msg);
+ break;
+ case 6:
+ map.put("备注",msg);
+ break;
+ default:
+ break;
+ }
+ }
}
From e207b3cbdaac5047265c43caaf8b4ac072f4392e Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Thu, 13 Apr 2023 21:26:29 +0800
Subject: [PATCH 6/7] =?UTF-8?q?=E8=BF=87=E6=BB=A4=E9=82=AE=E7=AE=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/flyingbook/domain/MailInfo.java | 5 +++++
.../com/ruoyi/flyingbook/mail/MailHelper.java | 17 ++++++++++-----
.../ruoyi/flyingbook/mail/MailHttpHelper.java | 21 +++++++------------
.../flyingbook/mail/MailTencentHelper.java | 10 ++++-----
.../flyingbook/mail/request/MailRequest.java | 8 ++++++-
.../main/resources/mapper/MailInfoMapper.xml | 7 ++++++-
6 files changed, 41 insertions(+), 27 deletions(-)
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
index ede2e77..42cbacd 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/MailInfo.java
@@ -32,6 +32,11 @@ public class MailInfo extends BaseEntity {
/** 收件箱地址 */
private String mailReceiveFolder;
+
+ /** 邮件来源名称 */
+ private String sourceName;
+
+
/**
* @see com.ruoyi.common.enums.FlagStatus
*/
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
index b2660e6..c669b6a 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
@@ -6,6 +6,7 @@ import com.ruoyi.flyingbook.LarkHelper.LarkTableHelper;
import com.ruoyi.flyingbook.domain.Event;
import com.ruoyi.flyingbook.domain.EventLog;
import com.ruoyi.flyingbook.domain.lark.LarkTableRequest;
+import com.ruoyi.flyingbook.mail.request.MailRequest;
import com.ruoyi.flyingbook.mapper.EventLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -34,7 +35,7 @@ public class MailHelper {
@Autowired
private EventLogMapper eventLogMapper;
- protected void parseMsg(Message[] messages,LarkTableRequest add) {
+ protected void parseMsg(Message[] messages, LarkTableRequest add, MailRequest req) {
log.info("------------------------开始解析邮件----------------------------------");
/**
@@ -47,12 +48,16 @@ public class MailHelper {
log.info("----------------------------------------------------------");
String from = MimeUtility.decodeText(message.getFrom()[0].toString());
InternetAddress internetAddress = new InternetAddress(from);
+ String receiveAddress = this.getReceiveAddress(message, null);
+ if (!from.contains(req.getSourceName())){
+ continue;
+ }
msgSubject = String.format("主题:%s,发件人:%s(%s),收件人:%s",
message.getSubject(),
internetAddress.getPersonal(),
internetAddress.getAddress(),
- this.getReceiveAddress(message,null));
- String recordId = syncLarkTable(message,add);
+ receiveAddress);
+ String recordId = syncLarkTable(message,add,req.getSourceName());
this.buildLog(logs,msgSubject,recordId,null);
message.setFlag(Flags.Flag.SEEN, true);
} catch (Exception e) {
@@ -73,8 +78,9 @@ public class MailHelper {
addresss = msg.getRecipients(type);
}
- if (addresss == null || addresss.length < 1)
+ if (addresss == null || addresss.length < 1) {
return null;
+ }
for (Address address : addresss) {
InternetAddress internetAddress = (InternetAddress) address;
receiveAddress.append(internetAddress.toUnicodeString()).append(",");
@@ -110,10 +116,11 @@ public class MailHelper {
logs.add(log);
}
- private String syncLarkTable(Message message,LarkTableRequest add) throws MessagingException, IOException {
+ private String syncLarkTable(Message message,LarkTableRequest add,String sourceName) throws MessagingException, IOException {
StringBuffer content = new StringBuffer(30);
getMailTextContent(message,content);
Map body = this.buildBody(message,content.toString());
+ body.put("邮箱来源",sourceName);
add.setBody(body);
CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(add);
return respBody.getRecord().getRecordId();
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
index 14a2feb..1a2e2cd 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
@@ -67,7 +67,7 @@ public class MailHttpHelper extends MailHelper{
folder.getUnreadMessageCount(),
folder.getNewMessageCount(),
folder.getDeletedMessageCount());
- this.parseMsg(messages,add);
+ this.parseMsg(messages,add,req);
} catch (Exception e) {
log.error("邮件解析失败",e);
} finally {
@@ -90,7 +90,7 @@ public class MailHttpHelper extends MailHelper{
@Override
protected Map buildBody(Message message,String content) {
Map map = new HashMap<>();
- Integer index = 0;
+ Integer index = 1;
StringBuilder str = new StringBuilder();
for (String s : content.split("")) {
if (StringUtils.isNotBlank(str) && s.equals(" ")){
@@ -112,34 +112,27 @@ public class MailHttpHelper extends MailHelper{
map.put("信息完成度",null);
map.put("数据来源",null);
map.put("所属学校",null);
- map.put("邮箱来源",null);
-// if (index > 6){
-// map.clear();
-// }
map.put("原始线索",content);
return map;
}
private void fillMap(Map map,String msg,Integer index){
switch (index){
- case 0:
- map.put("学生姓名",msg);
- break;
case 1:
- map.put("省市",msg);
+ map.put("学生姓名",msg);
break;
case 2:
- map.put("现有学历",msg);
+ map.put("省市",msg);
break;
case 3:
- map.put("手机号码",msg);
+ map.put("现有学历",msg);
break;
case 4:
+ map.put("手机号码",msg);
break;
case 5:
- map.put("目标国家",msg);
break;
case 6:
- map.put("备注",msg);
+ map.put("目标国家",msg);
break;
default:
break;
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
index 80b45d3..2791e67 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailTencentHelper.java
@@ -26,7 +26,7 @@ public class MailTencentHelper {
public static void main(String[] args) {
MailTencentHelper mailHelper = new MailTencentHelper();
- MailRequest req = new MailRequest("imap.qq.com",993,"932687738","ohziejkxqvsgbbag");
+ MailRequest req = new MailRequest("imap.qq.com",993,"932687738","ohziejkxqvsgbbag","新梦想");
mailHelper.receiveMail(req);
}
@@ -64,14 +64,12 @@ public class MailTencentHelper {
//获得收件箱的邮件列表
Message[] messages = folder.search(flagTerm);
// 打印不同状态的邮件数量
- log.info("收件箱中共{}封邮件!\n共{}封未读邮件!\n共{}封新邮件!\n共{}封已删除邮件!",
- messages.length,
- folder.getUnreadMessageCount(),
- folder.getNewMessageCount(),
- folder.getDeletedMessageCount());
log.info("------------------------开始解析邮件----------------------------------");
for (int i = 0; i < messages.length; i++) {
Message message = messages[i];
+ if (!message.getSubject().contains(req.getSourceName())){
+ continue;
+ }
parseMsg(message);
//设置已读
message.setFlag(Flags.Flag.SEEN,true);
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
index 3e0aa43..e2d1ab3 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/request/MailRequest.java
@@ -41,6 +41,10 @@ public class MailRequest {
* INBOX
*/
private String receiveFolder;
+
+ /** 邮件来源名称 */
+ private String sourceName;
+
/**
* 是否需要反馈已读信息
*/
@@ -54,11 +58,12 @@ public class MailRequest {
}
}
- public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode) {
+ public MailRequest(String emailServer, Integer emailPort, String userName, String authorizationCode,String sourceName) {
this.emailServer = emailServer;
this.emailPort = emailPort;
this.userName = userName;
this.authorizationCode = authorizationCode;
+ this.sourceName = sourceName;
this.fillDefault(Boolean.TRUE);
}
@@ -70,5 +75,6 @@ public class MailRequest {
this.emailProtocol = info.getMailProtocol();
this.receiveFolder = info.getMailReceiveFolder();
this.readFeedback = Boolean.TRUE.equals(readFeedback);
+ this.sourceName = info.getSourceName();
}
}
diff --git a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
index 1fb61c2..ea82335 100644
--- a/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
+++ b/ruoyi-flyingbook/src/main/resources/mapper/MailInfoMapper.xml
@@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
@@ -22,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- select id,lark_table_id, mail_server, mail_port, mail_protocol, mail_user_name, mail_authorization_code, mail_receive_folder, create_by, create_time, update_by, update_time, flag, remark from mail_info
+ select id,lark_table_id, mail_server, mail_port, mail_protocol, mail_user_name, mail_authorization_code, mail_receive_folder,source_name, create_by, create_time, update_by, update_time, flag, remark from mail_info
@@ -35,6 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and mail_user_name like concat('%', #{mailUserName}, '%')
and mail_authorization_code = #{mailAuthorizationCode}
and mail_receive_folder = #{mailReceiveFolder}
+ and source_name = #{sourceName}
and flag = #{flag}
@@ -54,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mail_user_name,
mail_authorization_code,
mail_receive_folder,
+ source_name,
create_by,
create_time,
update_by,
@@ -69,6 +72,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{mailUserName},
#{mailAuthorizationCode},
#{mailReceiveFolder},
+ #{sourceName},
#{createBy},
#{createTime},
#{updateBy},
@@ -88,6 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
mail_user_name = #{mailUserName},
mail_authorization_code = #{mailAuthorizationCode},
mail_receive_folder = #{mailReceiveFolder},
+ source_name = #{sourceName},
create_by = #{createBy},
create_time = #{createTime},
update_by = #{updateBy},
From 0f013cb4a3a12cfbdda49ee20321acecafe3e07d Mon Sep 17 00:00:00 2001
From: YXY <932687738@qq.com>
Date: Sat, 15 Apr 2023 11:48:19 +0800
Subject: [PATCH 7/7] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/ruoyi/flyingbook/mail/MailHelper.java | 12 ++++
.../ruoyi/flyingbook/mail/MailHttpHelper.java | 68 +++++++++++--------
2 files changed, 52 insertions(+), 28 deletions(-)
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
index c669b6a..792ff1c 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHelper.java
@@ -18,6 +18,7 @@ import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import java.io.IOException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -121,6 +122,8 @@ public class MailHelper {
getMailTextContent(message,content);
Map body = this.buildBody(message,content.toString());
body.put("邮箱来源",sourceName);
+ body.put("数据时间",this.getReceiveDate(message));
+ body.put("备注",content);
add.setBody(body);
CreateAppTableRecordRespBody respBody = larkTableHelper.addTableRecord(add);
return respBody.getRecord().getRecordId();
@@ -130,4 +133,13 @@ public class MailHelper {
return new HashMap<>();
}
+ protected String getReceiveDate(Message message){
+ try {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ return sdf.format(message.getReceivedDate());
+ } catch (MessagingException e) {
+ }
+ return null;
+ }
+
}
diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
index 1a2e2cd..250d409 100644
--- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
+++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/mail/MailHttpHelper.java
@@ -12,9 +12,7 @@ import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import java.security.Security;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.util.*;
/**
* @author yuxiangyong
@@ -24,12 +22,14 @@ import java.util.Properties;
@Component
public class MailHttpHelper extends MailHelper{
+ private static final List degreeList = Arrays.asList("初一","初二","初三","中专","专科","高考","高中","高一","高二","高三","本科","大一","大二","大三","大四");
+
public static void main(String[] args) {
MailHttpHelper mailHelper = new MailHttpHelper();
// MailRequest req = new MailRequest("xjia.synology.me",5000,"xjzsb","12345678");
// req = new MailRequest("xjia.synology.me",143,"xjzsb@xjia-edu.com","12345678");
// mailHelper.receiveMail(req,null);
- mailHelper.buildBody(null,"刘畅文祺 13996409399父亲微信同 重庆 高三作曲 英语120 文化一本线 意向美国伯克利 其他国家也可以考虑一下 费用没问题 了解过其他学校 过几天联系");
+// mailHelper.buildBody(null,"刘畅文祺 13996409399父亲微信同 重庆 高三作曲 英语120 文化一本线 意向美国伯克利 其他国家也可以考虑一下 费用没问题 了解过其他学校 过几天联系");
}
public void receiveMail(MailRequest req, LarkTableRequest add){
@@ -90,44 +90,55 @@ public class MailHttpHelper extends MailHelper{
@Override
protected Map buildBody(Message message,String content) {
Map map = new HashMap<>();
- Integer index = 1;
- StringBuilder str = new StringBuilder();
- for (String s : content.split("")) {
- if (StringUtils.isNotBlank(str) && s.equals(" ")){
- this.fillMap(map,str.toString(),index);
- str = new StringBuilder();
- index ++;
- continue;
- }
- if (s.equals(" ")){
- continue;
+ try {
+ Integer index = 1;
+ StringBuilder str = new StringBuilder();
+ for (String s : content.split("")) {
+ if (StringUtils.isNotBlank(str) && s.equals(" ")){
+ this.fillMap(map,str.toString(),index);
+ str = new StringBuilder();
+ index ++;
+ continue;
+ }
+ if (s.equals(" ")){
+ continue;
+ }
+ str.append(s);
}
- str.append(s);
+ }catch (Exception e){
+ map.clear();
+ map.put("异常信息",e.getMessage());
+ log.error("解析邮件文本失败",e);
}
-
- map.put("意向度",null);
- map.put("报名时间",null);
- map.put("回放记录",null);
- map.put("业务员",null);
- map.put("信息完成度",null);
- map.put("数据来源",null);
- map.put("所属学校",null);
- map.put("原始线索",content);
return map;
}
private void fillMap(Map map,String msg,Integer index){
switch (index){
case 1:
- map.put("学生姓名",msg);
+ map.put("学生姓名",msg);
break;
case 2:
map.put("省市",msg);
break;
case 3:
- map.put("现有学历",msg);
+ Boolean degreeExist = Boolean.FALSE;
+ for (String degree : degreeList) {
+ if (msg.contains(degree)){
+ degreeExist = Boolean.TRUE;
+ map.put("现有学历",msg);
+ }
+ }
+ if (!degreeExist){
+ throw new RuntimeException("学历格式不正确");
+ }
break;
case 4:
- map.put("手机号码",msg);
+ int startIndex = msg.indexOf("1");
+ if (startIndex >= 0 && msg.length() - startIndex >= 11){
+ map.put("手机号码",msg.substring(startIndex,startIndex + 11));
+ }else {
+ throw new RuntimeException("电话号码格式不正确");
+ }
break;
case 5:
break;
@@ -138,4 +149,5 @@ public class MailHttpHelper extends MailHelper{
break;
}
}
+
}