package jnpf.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jnpf.base.PaginationTime; import jnpf.base.entity.EmailConfigEntity; import jnpf.base.service.SuperServiceImpl; import jnpf.config.ConfigValueUtil; import jnpf.constant.FileTypeConstant; import jnpf.constant.MsgCode; import jnpf.entity.EmailReceiveEntity; import jnpf.entity.EmailSendEntity; import jnpf.exception.DataException; import jnpf.mapper.EmailConfigMapper; import jnpf.mapper.EmailReceiveMapper; import jnpf.mapper.EmailSendMapper; import jnpf.message.model.mail.*; import jnpf.service.EmailReceiveService; import jnpf.util.*; import jnpf.util.type.StringNumber; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * 邮件接收 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com) * @date 2019年9月26日 上午9:18 */ @Slf4j @Service public class EmailReceiveServiceImpl extends SuperServiceImpl implements EmailReceiveService { @Autowired private EmailSendMapper emailSendMapper; @Autowired private EmailConfigMapper emailConfigMapper; @Autowired private Pop3Util pop3Util; @Autowired private ConfigValueUtil configValueUtil; @Override public List getReceiveList(PaginationTime paginationTime) { return this.baseMapper.getReceiveList(paginationTime); } @Override public List getDashboardReceiveList() { return this.baseMapper.getDashboardReceiveList(); } @Override public List getStarredList(PaginationTime paginationTime) { return this.baseMapper.getStarredList(paginationTime); } @Override public List getDraftList(PaginationTime paginationTime) { return emailSendMapper.getDraftList(paginationTime); } @Override public List getSentList(PaginationTime paginationTime) { return emailSendMapper.getSentList(paginationTime); } @Override public EmailConfigEntity getConfigInfo() { String userId = UserProvider.getUser().getUserId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId); return emailConfigMapper.selectOne(queryWrapper); } @Override public EmailConfigEntity getConfigInfo(String userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId); return emailConfigMapper.selectOne(queryWrapper); } @Override public Object getInfo(String id) { EmailReceiveEntity receiveInfo = this.getById(id); Object object; if (receiveInfo != null) { //解析内容 receiveInfo.setBodyText(receiveInfo.getBodyText()); //更新已读 receiveInfo.setIsRead(1); receiveInfo.setLastModifyTime(new Date()); receiveInfo.setLastModifyUserId(UserProvider.getUser().getUserId()); this.updateById(receiveInfo); object = receiveInfo; } else { EmailSendEntity sendInfo = emailSendMapper.selectById(id); object = sendInfo; } return object; } @Override public boolean delete(String id) { Object object = getInfo(id); if (object != null && object instanceof EmailReceiveEntity) { //删除邮件 EmailConfigEntity mailConfig = getConfigInfo(); EmailReceiveEntity mailReceiveEntity = (EmailReceiveEntity) object; MailAccount mailAccount = new MailAccount(); mailAccount.setAccount(mailConfig.getAccount()); mailAccount.setPassword(mailConfig.getPassword()); mailAccount.setPop3Port(mailConfig.getPop3Port()); mailAccount.setPop3Host(mailConfig.getPop3Host()); pop3Util.deleteMessage(mailAccount, mailReceiveEntity.getMID()); this.removeById(mailReceiveEntity.getId()); return true; } else if (object != null) { //删除数据 EmailSendEntity entity = (EmailSendEntity) object; emailSendMapper.deleteById(entity.getId()); return true; } return false; } @Override @Transactional public void saveDraft(EmailSendEntity entity) { entity.setState(-1); if (StringUtil.isNotEmpty(entity.getId())) { entity.setLastModifyTime(new Date()); entity.setLastModifyUserId(UserProvider.getUser().getUserId()); emailSendMapper.updateById(entity); } else { entity.setId(RandomUtil.uuId()); entity.setCreatorUserId(UserProvider.getUser().getUserId()); emailSendMapper.insert(entity); } } @Override public boolean receiveRead(String id, int isRead) { EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id); if (entity != null) { entity.setIsRead(isRead); return this.updateById(entity); } return false; } @Override public boolean receiveStarred(String id, int isStarred) { EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id); if (entity != null) { entity.setStarred(isStarred); return this.updateById(entity); } return false; } @Override public String checkLogin(EmailConfigEntity configEntity) { MailAccount mailAccount = new MailAccount(); mailAccount.setAccount(configEntity.getAccount()); mailAccount.setPassword(configEntity.getPassword()); mailAccount.setPop3Host(configEntity.getPop3Host()); mailAccount.setPop3Port(configEntity.getPop3Port()); mailAccount.setSmtpHost(configEntity.getSmtpHost()); mailAccount.setSmtpPort(configEntity.getSmtpPort()); if ("1".equals(String.valueOf(configEntity.getEmailSsl()))) { mailAccount.setSsl(true); } else { mailAccount.setSsl(false); } if (mailAccount.getSmtpHost() != null) { return SmtpUtil.checkConnected(mailAccount); } if (mailAccount.getPop3Host() != null) { return pop3Util.checkConnected(mailAccount); } return "false"; } @Override public void saveConfig(EmailConfigEntity configEntity) throws DataException { EmailConfigEntity emailConfigEntity = getConfigInfo(UserProvider.getUser().getUserId()); if (emailConfigEntity == null && UserProvider.getUser().getUserId() != null) { configEntity.setId(RandomUtil.uuId()); configEntity.setCreatorTime(new Date()); configEntity.setCreatorUserId(UserProvider.getUser().getUserId()); emailConfigMapper.insert(configEntity); } else if (UserProvider.getUser().getUserId() != null) { configEntity.setId(emailConfigEntity.getId()); emailConfigMapper.updateById(configEntity); } else { throw new DataException(MsgCode.ETD114.get()); } } @Override @Transactional public int saveSent(EmailSendEntity entity, EmailConfigEntity mailConfig) { int flag = 1; //拷贝文件,注意:从临时文件夹拷贝到邮件文件夹 List attachmentList = JsonUtil.getJsonToList(entity.getAttachment(), MailFile.class); //邮件路径 String mailFilePath = configValueUtil.getEmailFilePath(); try { //写入数据 //发送邮件 //邮件发送信息 List attachmentFile = new ArrayList<>(); MailModel mailModel = new MailModel(); mailModel.setFrom(entity.getSender()); mailModel.setRecipient(entity.getRecipient()); mailModel.setCc(entity.getCc()); mailModel.setBcc(entity.getBcc()); mailModel.setSubject(entity.getSubject()); mailModel.setBodyText(entity.getBodyText()); mailModel.setAttachment(attachmentList); mailModel.setFromName(mailConfig.getSenderName()); for (MailFile mailFile : mailModel.getAttachment()) { File file = new File(XSSEscape.escapePath(mailFilePath + mailFile.getFileId())); attachmentFile.add(file); } mailModel.setAttachmentFile(attachmentFile); //账号验证信息 MailAccount mailAccount = new MailAccount(); mailAccount.setAccount(mailConfig.getAccount()); mailAccount.setPassword(mailConfig.getPassword()); mailAccount.setPop3Host(mailConfig.getPop3Host()); mailAccount.setPop3Port(mailConfig.getPop3Port()); mailAccount.setSmtpHost(mailConfig.getSmtpHost()); mailAccount.setSmtpPort(mailConfig.getSmtpPort()); mailAccount.setSsl(mailConfig.getEmailSsl() == 1 ? true : false); mailAccount.setAccountName(mailConfig.getSenderName()); SmtpUtil smtpUtil = new SmtpUtil(mailAccount); smtpUtil.sendMail(mailModel); flag = 0; //插入数据库 if (entity.getId() != null) { entity.setState(1); emailSendMapper.updateById(entity); } else { entity.setId(RandomUtil.uuId()); entity.setCreatorUserId(UserProvider.getUser().getUserId()); if (mailConfig.getAccount() != null) { entity.setSender(mailConfig.getAccount()); } entity.setState(1); emailSendMapper.insert(entity); } } catch (Exception e) { for (MailFile mailFile : attachmentList) { FileUtil.deleteFile(mailFilePath + mailFile.getFileId()); } log.error(e.getMessage()); } return flag; } @Override @Transactional public int receive(EmailConfigEntity mailConfig) { //账号验证信息 MailAccount mailAccount = new MailAccount(); mailAccount.setAccount(mailConfig.getAccount()); mailAccount.setPassword(mailConfig.getPassword()); mailAccount.setPop3Host(mailConfig.getPop3Host()); mailAccount.setPop3Port(mailConfig.getPop3Port()); mailAccount.setSmtpHost(mailConfig.getSmtpHost()); mailAccount.setSmtpPort(mailConfig.getSmtpPort()); mailAccount.setDestDir(FileUploadUtils.getLocalBasePath() + FilePathUtil.getFilePath(FileTypeConstant.MAIL)); if (StringNumber.ONE.equals(mailConfig.getEmailSsl().toString())) { mailAccount.setSsl(true); } else { mailAccount.setSsl(false); } PopMailModel popMailModel = pop3Util.popMail(mailAccount); int receiveCount = popMailModel.getReceiveCount(); List mailList = popMailModel.getMailList(); if (mailList.size() > 0) { List mids = mailList.stream().map(u -> u.getMID()).collect(Collectors.toList()); //查询数据库状态 QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(EmailReceiveEntity::getMID, mids); List emails = this.list(wrapper); this.remove(wrapper); //邮件赋值状态 for (int i = 0; i < mailList.size(); i++) { EmailReceiveEntity entity = JsonUtil.getJsonToBean(mailList.get(i), EmailReceiveEntity.class); entity.setCreatorUserId(UserProvider.getUser().getUserId()); //通过数据库进行赋值,没有就默认0 int stat = emails.stream().filter(m -> m.getMID().equals(entity.getMID())).findFirst().isPresent() ? emails.stream().filter(m -> m.getMID().equals(entity.getMID())).findFirst().get().getIsRead() : 0; long count = emails.stream().filter(m -> m.getMID().equals(entity.getMID())).count(); entity.setIsRead(stat); if (count != 0) { receiveCount--; } this.save(entity); } } return receiveCount; } }