lin
2024-03-05 cb6efdef55c77da2bcc8dbd99a74e7e49c5ec067
邮件收件+bug修复+流程优化
13 files modified
1 files added
513 ■■■■■ changed files
src/main/java/org/springblade/common/utils/ParseMail.java 253 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java 40 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/flow/core/entity/BladeFlow.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/email/config/MailSenderConfig.java 56 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/email/entity/EmailEntity.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java 10 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/email/service/IEmailAccountService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/email/service/impl/EmailAccountServiceImpl.java 97 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/messageRecord/controller/MessageRecordController.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/messageRecord/service/IMessageRecordService.java 4 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/messageRecord/service/impl/MessageRecordServiceImpl.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/messageRecord/vo/MessageRecordVO.java 1 ●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/messageRecord/vo/MessageUserVO.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/system/mapper/UserMapper.xml 2 ●●● patch | view | raw | blame | history
src/main/java/org/springblade/common/utils/ParseMail.java
New file
@@ -0,0 +1,253 @@
package org.springblade.common.utils;
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.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ParseMail {
    /**
     * 删除邮件
     *
     * @param messages 要解析的邮件列表
     */
    public static void deleteMessage(Message... messages) throws MessagingException, IOException {
        if (messages == null || messages.length < 1)
            throw new MessagingException("未找到要解析的邮件!");
        // 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
            /**
             *   邮件删除
             */
            Message message = messages[i];
            String subject = message.getSubject();
            // set the DELETE flag to true
            message.setFlag(Flags.Flag.DELETED, true);
            System.out.println("Marked DELETE for message: " + subject);
        }
    }
    /**
     * 获得邮件主题
     *
     * @param msg 邮件内容
     * @return 解码后的邮件主题
     */
    public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
        return MimeUtility.decodeText(msg.getSubject());
    }
    /**
     * 获得邮件发件人
     *
     * @param msg 邮件内容
     * @return 姓名 <Email地址>
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
        InternetAddress address = (InternetAddress) froms[0];
        String person = address.getPersonal();
        if (person != null) {
            person = MimeUtility.decodeText(person) + " ";
        } else {
            person = "";
        }
        from = person + "<" + address.getAddress() + ">";
        return from;
    }
    /**
     * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
     * <p>Message.RecipientType.TO  收件人</p>
     * <p>Message.RecipientType.CC  抄送</p>
     * <p>Message.RecipientType.BCC 密送</p>
     *
     * @param msg  邮件内容
     * @param type 收件人类型
     * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
     * @throws MessagingException
     */
    public static String getReceiveAddress(MimeMessage 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();
    }
    /**
     * 获得邮件发送时间
     *
     * @param msg 邮件内容
     * @return yyyy年mm月dd日 星期X HH:mm
     * @throws MessagingException
     */
    public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
        Date receivedDate = msg.getSentDate();
        if (receivedDate == null)
            return "";
        if (pattern == null || "".equals(pattern))
            pattern = "yyyy/MM/dd HH:mm ";
        return new SimpleDateFormat(pattern).format(receivedDate);
    }
    /**
     * 判断邮件中是否包含附件
     *
     * @return 邮件中存在附件返回true,不存在返回false
     * @throws MessagingException
     * @throws IOException
     */
    public static boolean isContainAttachment(Part part) throws MessagingException, IOException {
        boolean flag = false;
        if (part.isMimeType("multipart/*")) {
            MimeMultipart multipart = (MimeMultipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    flag = true;
                } else if (bodyPart.isMimeType("multipart/*")) {
                    flag = isContainAttachment(bodyPart);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("application") != -1) {
                        flag = true;
                    }
                    if (contentType.indexOf("name") != -1) {
                        flag = true;
                    }
                }
                if (flag) break;
            }
        } else if (part.isMimeType("message/rfc822")) {
            flag = isContainAttachment((Part) part.getContent());
        }
        return flag;
    }
    /**
     * 判断邮件是否已读
     *
     * @param msg 邮件内容
     * @return 如果邮件已读返回true, 否则返回false
     * @throws MessagingException
     */
    public static boolean isSeen(MimeMessage msg) throws MessagingException {
        return msg.getFlags().contains(Flags.Flag.SEEN);
    }
    /**
     * 判断邮件是否需要阅读回执
     *
     * @param msg 邮件内容
     * @return 需要回执返回true, 否则返回false
     * @throws MessagingException
     */
    public static boolean isReplySign(MimeMessage msg) throws MessagingException {
        boolean replySign = false;
        String[] headers = msg.getHeader("Disposition-Notification-To");
        if (headers != null)
            replySign = true;
        return replySign;
    }
    /**
     * 获得邮件的优先级
     *
     * @param msg 邮件内容
     * @return 1(High):紧急  3:普通(Normal)  5:低(Low)
     * @throws MessagingException
     */
    public static String getPriority(MimeMessage msg) throws MessagingException {
        String priority = "普通";
        String[] headers = msg.getHeader("X-Priority");
        if (headers != null) {
            String headerPriority = headers[0];
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
                priority = "紧急";
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
                priority = "低";
            else
                priority = "普通";
        }
        return priority;
    }
    public static String getTextMultipart(Part part) throws Exception{
        if(part.isMimeType("text/html")){
            String content = (String) part.getContent();
            return content;
        }else if(part.isMimeType("text/plain")){
            String content = (String) part.getContent();
            return content;
        }
        return "";
    }
    /**
     * 获得邮件文本内容
     *
     * @param part    邮件体
     * @param content 存储邮件文本内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public static 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/*")) {
            Object mpart = part.getContent();
            if (mpart instanceof 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);
                }
            }
        }
    }
}
src/main/java/org/springblade/flow/business/service/impl/FlowBusinessServiceImpl.java
@@ -16,9 +16,12 @@
 */
package org.springblade.flow.business.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.flowable.engine.HistoryService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
@@ -39,6 +42,8 @@
import org.springblade.flow.engine.constant.FlowEngineConstant;
import org.springblade.flow.engine.entity.FlowProcess;
import org.springblade.flow.engine.utils.FlowCache;
import org.springblade.modules.district.entity.DistrictEntity;
import org.springblade.modules.district.service.IDistrictService;
import org.springblade.modules.property.entity.PropertyCapitalApplyEntity;
import org.springblade.modules.property.service.IPropertyCapitalApplyService;
import org.springframework.stereotype.Service;
@@ -46,6 +51,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * 流程业务实现类
@@ -104,7 +110,7 @@
        buildFlowTaskList(bladeFlow, flowList, todoQuery, FlowEngineConstant.STATUS_TODO);
        // 计算总数
        long count = todoQuery.count();
        long count = flowList.size();
        // 设置页数
        page.setSize(count);
        // 设置总数
@@ -323,6 +329,11 @@
            if (capitalApplyEntity != null) {
                flow.setName(capitalApplyEntity.getName());
                flow.setDistrictId(capitalApplyEntity.getDistrictId());
                IDistrictService bean1 = SpringUtils.getBean(IDistrictService.class);
                DistrictEntity one = bean1.getOne(Wrappers.<DistrictEntity>lambdaQuery().eq(DistrictEntity::getId, capitalApplyEntity.getDistrictId()));
                if (one != null) {
                    flow.setDistrictName(one.getName());
                }
                flow.setLinkman(capitalApplyEntity.getLinkman());
                flow.setLinkPhone(capitalApplyEntity.getLinkPhone());
            }
@@ -336,7 +347,32 @@
            flow.setProcessDefinitionVersion(processDefinition.getVersion());
            flow.setProcessInstanceId(task.getProcessInstanceId());
            flow.setStatus(status);
            flowList.add(flow);
            Boolean districtNameFlag = false;
            Boolean nameFlag = false;
            Boolean dateFlag = false;
            Boolean isFilter = false;
            if (StringUtils.isNotBlank(bladeFlow.getDistrictName())) {
                isFilter = true;
                // 小区、项目名称、申请时间
                districtNameFlag = flow.getDistrictName().contains(bladeFlow.getDistrictName());
            } else if (StringUtils.isNotBlank(bladeFlow.getName())) {
                isFilter = true;
                // 小区、项目名称、申请时间
                nameFlag = flow.getName().contains(bladeFlow.getName());
            } else if (bladeFlow.getStartTimes() != null && bladeFlow.getEndTimes() != null) {
                isFilter = true;
                // 小区、项目名称、申请时间
                dateFlag = flow.getCreateTime().after(bladeFlow.getStartTimes())
                    && flow.getCreateTime().before(bladeFlow.getEndTimes());
            }
            if (isFilter ) {
                if(districtNameFlag || nameFlag || dateFlag){
                    flowList.add(flow);
                }
            } else {
                flowList.add(flow);
            }
        });
    }
src/main/java/org/springblade/flow/core/entity/BladeFlow.java
@@ -16,6 +16,7 @@
 */
package org.springblade.flow.core.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springblade.flow.core.constant.ProcessConstant;
@@ -36,10 +37,25 @@
    // 小区id
    private String districtId;
    // 小区名称
    private String districtName;
    // 时间名称
    private String name;
    /**
     * 开始时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startTimes;
    /**
     * 结束时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endTimes;
    /**
     * 联系人姓名
     */
    @ApiModelProperty(value = "联系人姓名")
src/main/java/org/springblade/modules/email/config/MailSenderConfig.java
@@ -8,7 +8,10 @@
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.stereotype.Component;
import javax.mail.*;
import java.security.Security;
import java.util.List;
import java.util.Properties;
@Slf4j
@Component
@@ -34,6 +37,7 @@
        //获取数据库中启用的邮件配置
        EmailEntity params = new EmailEntity();
        params.setStatus(2);
        params.setEmailType("1");
        EmailEntity email = emailMapper.selectOne(Condition.getQueryWrapper(params));
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
@@ -61,6 +65,48 @@
    }
    /**
     *
     * @return
     * @throws MessagingException
     */
    public Store buildMailReceive() throws MessagingException {
        log.info("初始化mailReceive");
        //获取数据库中启用的邮件配置
        EmailEntity params = new EmailEntity();
        params.setStatus(2);
        params.setEmailType("2");
        EmailEntity email = emailMapper.selectOne(Condition.getQueryWrapper(params));
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";//ssl加密
        //有些参数可能不需要
        Properties props = new Properties();
        props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.imap.socketFactory.fallback", "false");
        props.setProperty("mail.transport.protocol", email.getProtocol()); // 使用的协议
        props.setProperty("mail.imap.port", email.getPort().toString());
        props.setProperty("mail.imap.socketFactory.port", email.getPort().toString());
        //创建会话
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(email.getUsername(),email.getPassword());
            }
        });
        //存储对象
        Store store = session.getStore("imap");
        //连接
        store.connect("imap.qq.com",email.getPort(),email.getUsername(),email.getPassword());
        return store;
    }
    /**
     * 获取MailSender
     *
     * @return CustomMailSender
@@ -68,4 +114,14 @@
    public JavaMailSenderImpl getSender() {
        return buildMailSender();
    }
    /**
     * 获取MailSender
     *
     * @return CustomMailSender
     */
    public Store getReceive() throws MessagingException {
        return buildMailReceive();
    }
}
src/main/java/org/springblade/modules/email/entity/EmailEntity.java
@@ -72,4 +72,7 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "1:发送配置 2:接收配置")
    private String emailType;
}
src/main/java/org/springblade/modules/email/entity/EmailTemplateEntity.java
@@ -16,8 +16,7 @@
 */
package org.springblade.modules.email.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -43,7 +42,8 @@
    /** id */
    @ApiModelProperty(value = "主键ID", example = "")
    private Integer id;
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    /** 标题 */
    @ApiModelProperty(value = "标题", example = "")
@@ -58,13 +58,13 @@
    /** 创建时间 */
    @ApiModelProperty(value = "创建时间", example = "")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("create_time")
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private Date createTime;
    /** 更新时间 */
    @ApiModelProperty(value = "更新时间", example = "")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("update_time")
    @TableField(value = "update_time",fill = FieldFill.UPDATE)
    private Date updateTime;
    /** 是否已删除 */
src/main/java/org/springblade/modules/email/service/IEmailAccountService.java
@@ -2,7 +2,9 @@
import org.springblade.modules.email.entity.EmailAccount;
import org.springblade.modules.messageRecord.entity.MessageUser;
import org.springblade.modules.messageRecord.vo.MessageRecordVO;
import javax.mail.MessagingException;
import java.util.List;
public interface IEmailAccountService {
@@ -11,4 +13,6 @@
    Boolean senderEmail(EmailAccount account);
    Boolean sendMessageUserEmail(String title, String content, List<MessageUser> messageUserList);
    List<MessageRecordVO> getUnreadList() throws MessagingException;
}
src/main/java/org/springblade/modules/email/service/impl/EmailAccountServiceImpl.java
@@ -1,15 +1,19 @@
package org.springblade.modules.email.service.impl;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
import com.xxl.job.core.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.common.utils.ParseMail;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.email.config.MailProperties;
import org.springblade.modules.email.config.MailSenderConfig;
import org.springblade.modules.email.entity.EmailAccount;
import org.springblade.modules.email.service.IEmailAccountService;
import org.springblade.modules.messageRecord.entity.MessageUser;
import org.springblade.modules.messageRecord.vo.MessageRecordVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
@@ -17,9 +21,18 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.mail.search.FlagTerm;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
@@ -79,6 +92,86 @@
        emailAccount.setSubject(title);
        emailAccount.setContent(content);
        return  senderEmail(emailAccount);
        return senderEmail(emailAccount);
    }
    @Override
    public List<MessageRecordVO> getUnreadList() throws MessagingException {
        Folder folder = null;
        Store store = senderConfig.getReceive();
        List<MessageRecordVO> MessageRecordVOList = new ArrayList<>();
        try {
            // 获得收件箱
            folder = store.getFolder("INBOX");
            // 以读写模式打开收件箱
            folder.open(Folder.READ_WRITE);
            //false 表示未读
            FlagTerm flagTerm = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
            //获得收件箱的邮件列表
            Message[] messages = folder.search(flagTerm);
            // 打印不同状态的邮件数量
            System.out.println("收件箱中共" + messages.length + "封邮件!");
            System.out.println("收件箱中共" + folder.getUnreadMessageCount() + "封未读邮件!");
            System.out.println("收件箱中共" + folder.getNewMessageCount() + "封新邮件!");
            System.out.println("收件箱中共" + folder.getDeletedMessageCount() + "封已删除邮件!");
            System.out.println("------------------------开始解析邮件----------------------------------");
//            ParseMail.getMailTextContent(messages.)
            StringBuffer content = new StringBuffer(30);
//            for (int i = 0; i < messages.length; i++) {
//                System.out.println("消息:"+messages[i].getSubject());
//                String from = MimeUtility.decodeText(messages[i].getFrom()[0].toString());
//                InternetAddress internetAddress = new InternetAddress(from);
//                System.out.println("发件人:" + internetAddress.getPersonal() + '(' + internetAddress.getAddress() + ')');
//            }
            for (Message message : messages) {
                ParseMail.getMailTextContent(message, content);
                MessageRecordVO messageRecordVO = new MessageRecordVO();
                String from = MimeUtility.decodeText(message.getFrom()[0].toString());
                InternetAddress ia = new InternetAddress(from);
                System.out.println("发件人:" + ia.getPersonal() + '(' + ia.getAddress() + ')');
                System.out.println("主题:" + message.getSubject());
                System.out.println("主题fa:" + message.getFlags());
                if (message.getSentDate() != null) {
                    System.out.println("邮件发送时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(message.getSentDate()));
                }
                System.out.println("-------------------------------------------\n");
//                message.setFlag(Flags.Flag.SEEN, true);
                messageRecordVO.setTitle(message.getSubject());
                if (message.getSentDate() != null) {
                    messageRecordVO.setStartTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(message.getSentDate()));
                }
                messageRecordVO.setUserName(ia.getPersonal() + '(' + ia.getAddress() + ')');
                messageRecordVO.setContent(String.valueOf(content));
                MessageRecordVOList.add(messageRecordVO);
            }
            return MessageRecordVOList;
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (folder != null) {
                    folder.close(false);
                }
                if (store != null) {
                    store.close();
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
src/main/java/org/springblade/modules/messageRecord/controller/MessageRecordController.java
@@ -34,6 +34,8 @@
import org.springblade.modules.messageRecord.service.IMessageRecordService;
import org.springblade.core.boot.ctrl.BladeController;
import java.util.List;
/**
 * 消息记录表 控制器
 *
@@ -140,4 +142,15 @@
        return R.status(messageRecordService.sendMessage(id));
    }
    /**
     * 消息记录表 分页
     */
    @GetMapping("/getUnreadList")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页", notes = "传入meseRecord")
    public R<List<MessageRecordVO>> getUnreadList() {
        List<MessageRecordVO> pages = messageRecordService.getUnreadList();
        return R.data(pages);
    }
}
src/main/java/org/springblade/modules/messageRecord/service/IMessageRecordService.java
@@ -21,6 +21,8 @@
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;
/**
 * 消息记录表 服务类
 *
@@ -42,4 +44,6 @@
    Boolean customizeSave(MessageRecordVO messageRecord);
    Boolean sendMessage(String id);
    List<MessageRecordVO> getUnreadList();
}
src/main/java/org/springblade/modules/messageRecord/service/impl/MessageRecordServiceImpl.java
@@ -37,6 +37,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.transaction.annotation.Transactional;
import javax.mail.MessagingException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -138,5 +139,14 @@
        return true;
    }
    @Override
    public List<MessageRecordVO> getUnreadList() {
        try {
            List<MessageRecordVO> aa = emailAccountService.getUnreadList();
            return aa;
        } catch (MessagingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
src/main/java/org/springblade/modules/messageRecord/vo/MessageRecordVO.java
@@ -32,6 +32,7 @@
    private static final long serialVersionUID = 1L;
    private String startTime;
    private String endTime;
    private String userName;
src/main/java/org/springblade/modules/messageRecord/vo/MessageUserVO.java
@@ -22,4 +22,6 @@
    private String startTime;
    private String endTime;
    private Long sendUserId;
}
src/main/java/org/springblade/modules/system/mapper/UserMapper.xml
@@ -245,7 +245,7 @@
        bu.birthday
        FROM
        blade_user bu
        LEFT JOIN jczz_household jh ON bu.id = jh.associated_user_id
        LEFT JOIN jczz_household jh ON bu.id = jh.associated_user_id and jh.is_deleted=0
        LEFT JOIN jczz_house jhe ON jhe.house_code = jh.house_code
        LEFT JOIN jczz_district jd on jd.aoi_code=jhe.district_code
        <where>