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 - - - and lark_company_relation_id = #{larkCompanyRelationId} - and relation_type = #{relationType} - and from_app_token = #{fromAppToken} - and from_table_id = #{fromTableId} - and to_app_token = #{toAppToken} - and to_table_id = #{toTableId} - and flag = #{flag} + + and lark_company_relation_id = #{larkCompanyRelationId} + and relation_type = #{relationType} + and from_app_token = #{fromAppToken} + and from_table_id = #{fromTableId} + and to_app_token = #{toAppToken} + and to_table_id = #{toTableId} + and flag = #{flag} - + - - + + insert into lark_table_relation lark_company_relation_id, @@ -57,7 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" flag, remark, relation_type, - + #{larkCompanyRelationId}, #{fromAppToken}, @@ -71,7 +96,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{flag}, #{remark}, #{relationType}, - + @@ -94,13 +119,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from lark_table_relation where id = #{id} + delete + from lark_table_relation + where id = #{id} - delete from lark_table_relation where id in + delete from lark_table_relation where id in #{id} + \ 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 @@ -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; } } + }