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>