EmailReceiveServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. package jnpf.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import jnpf.base.PaginationTime;
  7. import jnpf.base.entity.EmailConfigEntity;
  8. import jnpf.base.model.MailAccount;
  9. import jnpf.base.model.MailFile;
  10. import jnpf.base.model.MailModel;
  11. import jnpf.base.service.SuperServiceImpl;
  12. import jnpf.base.util.Pop3Util;
  13. import jnpf.base.util.SmtpUtil;
  14. import jnpf.config.ConfigValueUtil;
  15. import jnpf.constant.FileTypeConstant;
  16. import jnpf.base.entity.EmailReceiveEntity;
  17. import jnpf.constant.MsgCode;
  18. import jnpf.entity.EmailSendEntity;
  19. import jnpf.exception.DataException;
  20. import jnpf.mapper.EmailReceiveMapper;
  21. import jnpf.service.EmailConfigService;
  22. import jnpf.service.EmailReceiveService;
  23. import jnpf.service.EmailSendService;
  24. import jnpf.util.*;
  25. import jnpf.util.type.StringNumber;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.apache.commons.lang3.StringUtils;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.stereotype.Service;
  30. import org.springframework.transaction.annotation.Transactional;
  31. import java.util.ArrayList;
  32. import java.util.Date;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.stream.Collectors;
  36. /**
  37. * 邮件接收
  38. *
  39. * @author JNPF开发平台组
  40. * @version V3.1.0
  41. * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com)
  42. * @date 2019年9月26日 上午9:18
  43. */
  44. @Slf4j
  45. @Service
  46. public class EmailReceiveServiceImpl extends SuperServiceImpl<EmailReceiveMapper, EmailReceiveEntity> implements EmailReceiveService {
  47. @Autowired
  48. private EmailSendService emailSendService;
  49. @Autowired
  50. private EmailConfigService emailConfigService;
  51. @Autowired
  52. private Pop3Util pop3Util;
  53. @Autowired
  54. private ConfigValueUtil configValueUtil;
  55. @Override
  56. public List<EmailReceiveEntity> getReceiveList(PaginationTime paginationTime) {
  57. String userId = UserProvider.getUser().getUserId();
  58. QueryWrapper<EmailReceiveEntity> queryWrapper = new QueryWrapper<>();
  59. queryWrapper.lambda().eq(EmailReceiveEntity::getCreatorUserId, userId);
  60. //日期范围(近7天、近1月、近3月、自定义)
  61. if (ObjectUtil.isNotEmpty(paginationTime.getStartTime()) && ObjectUtil.isNotEmpty(paginationTime.getEndTime())) {
  62. queryWrapper.lambda().between(EmailReceiveEntity::getFdate, new Date(paginationTime.getStartTime()), new Date(paginationTime.getEndTime()));
  63. }
  64. //关键字(用户、IP地址、功能名称)
  65. String keyWord = paginationTime.getKeyword() != null ? paginationTime.getKeyword() : null;
  66. //关键字(发件人、主题)
  67. if (!StringUtils.isEmpty(keyWord)) {
  68. String word = keyWord;
  69. queryWrapper.lambda().and(
  70. t -> t.like(EmailReceiveEntity::getSender, word)
  71. .or().like(EmailReceiveEntity::getSubject, word)
  72. );
  73. }
  74. //排序
  75. if (StringUtils.isEmpty(paginationTime.getSidx())) {
  76. queryWrapper.lambda().orderByDesc(EmailReceiveEntity::getFdate);
  77. } else {
  78. queryWrapper = "asc".equals(paginationTime.getSort().toLowerCase()) ? queryWrapper.orderByAsc(paginationTime.getSidx()) : queryWrapper.orderByDesc(paginationTime.getSidx());
  79. }
  80. Page<EmailReceiveEntity> page = new Page<>(paginationTime.getCurrentPage(), paginationTime.getPageSize());
  81. IPage<EmailReceiveEntity> userIPage = this.page(page, queryWrapper);
  82. return paginationTime.setData(userIPage.getRecords(), page.getTotal());
  83. }
  84. @Override
  85. public List<EmailReceiveEntity> getReceiveList() {
  86. String userId = UserProvider.getUser().getUserId();
  87. QueryWrapper<EmailReceiveEntity> queryWrapper = new QueryWrapper<>();
  88. queryWrapper.lambda().eq(EmailReceiveEntity::getCreatorUserId, userId).eq(EmailReceiveEntity::getIsRead,0).orderByDesc(EmailReceiveEntity::getCreatorTime);
  89. return this.baseMapper.selectList(queryWrapper);
  90. }
  91. @Override
  92. public List<EmailReceiveEntity> getDashboardReceiveList() {
  93. String userId = UserProvider.getUser().getUserId();
  94. QueryWrapper<EmailReceiveEntity> queryWrapper = new QueryWrapper<>();
  95. queryWrapper.lambda().eq(EmailReceiveEntity::getCreatorUserId, userId).eq(EmailReceiveEntity::getIsRead,0).orderByDesc(EmailReceiveEntity::getCreatorTime);
  96. Page<EmailReceiveEntity> page = new Page<>(1, 20);
  97. IPage<EmailReceiveEntity> iPage = this.page(page, queryWrapper);
  98. return iPage.getRecords();
  99. }
  100. @Override
  101. public List<EmailReceiveEntity> getStarredList(PaginationTime paginationTime) {
  102. String userId = UserProvider.getUser().getUserId();
  103. QueryWrapper<EmailReceiveEntity> queryWrapper = new QueryWrapper<>();
  104. queryWrapper.lambda().eq(EmailReceiveEntity::getCreatorUserId, userId).eq(EmailReceiveEntity::getStarred, 1);
  105. //日期范围(近7天、近1月、近3月、自定义)
  106. if (ObjectUtil.isNotEmpty(paginationTime.getStartTime()) && ObjectUtil.isNotEmpty(paginationTime.getEndTime())) {
  107. queryWrapper.lambda().between(EmailReceiveEntity::getCreatorTime, new Date(paginationTime.getStartTime()), new Date(paginationTime.getEndTime()));
  108. }
  109. //关键字(用户、IP地址、功能名称)
  110. String keyWord = paginationTime.getKeyword() != null ? paginationTime.getKeyword() : null;
  111. //关键字(发件人、主题)
  112. if (!StringUtils.isEmpty(keyWord)) {
  113. String word = keyWord;
  114. queryWrapper.lambda().and(
  115. t -> t.like(EmailReceiveEntity::getSender, word)
  116. .or().like(EmailReceiveEntity::getSubject, word)
  117. );
  118. }
  119. //排序
  120. if (StringUtils.isEmpty(paginationTime.getSidx())) {
  121. queryWrapper.lambda().orderByDesc(EmailReceiveEntity::getCreatorTime);
  122. } else {
  123. queryWrapper = "asc".equals(paginationTime.getSort().toLowerCase()) ? queryWrapper.orderByAsc(paginationTime.getSidx()) : queryWrapper.orderByDesc(paginationTime.getSidx());
  124. }
  125. Page<EmailReceiveEntity> page = new Page<>(paginationTime.getCurrentPage(), paginationTime.getPageSize());
  126. IPage<EmailReceiveEntity> userIPage = this.page(page, queryWrapper);
  127. return paginationTime.setData(userIPage.getRecords(), page.getTotal());
  128. }
  129. @Override
  130. public List<EmailSendEntity> getDraftList(PaginationTime paginationTime) {
  131. String userId = UserProvider.getUser().getUserId();
  132. QueryWrapper<EmailSendEntity> queryWrapper = new QueryWrapper<>();
  133. queryWrapper.lambda().eq(EmailSendEntity::getCreatorUserId, userId).eq(EmailSendEntity::getState, -1);
  134. //日期范围(近7天、近1月、近3月、自定义)
  135. if (!ObjectUtil.isEmpty(paginationTime.getStartTime()) && !ObjectUtil.isEmpty(paginationTime.getEndTime())) {
  136. queryWrapper.lambda().between(EmailSendEntity::getCreatorTime, new Date(paginationTime.getStartTime()), new Date(paginationTime.getEndTime()));
  137. }
  138. //关键字(用户、IP地址、功能名称)
  139. String keyWord = paginationTime.getKeyword() != null ? paginationTime.getKeyword() : null;
  140. //关键字(发件人、主题)
  141. if (!StringUtils.isEmpty(keyWord)) {
  142. String word = keyWord;
  143. queryWrapper.lambda().and(
  144. t -> t.like(EmailSendEntity::getSender, word)
  145. .or().like(EmailSendEntity::getSubject, word)
  146. );
  147. }
  148. //排序
  149. if (StringUtils.isEmpty(paginationTime.getSidx())) {
  150. queryWrapper.lambda().orderByDesc(EmailSendEntity::getCreatorTime);
  151. } else {
  152. queryWrapper = "asc".equals(paginationTime.getSort().toLowerCase()) ? queryWrapper.orderByAsc(paginationTime.getSidx()) : queryWrapper.orderByDesc(paginationTime.getSidx());
  153. }
  154. Page<EmailSendEntity> page = new Page<>(paginationTime.getCurrentPage(), paginationTime.getPageSize());
  155. IPage<EmailSendEntity> userIPage = emailSendService.page(page, queryWrapper);
  156. return paginationTime.setData(userIPage.getRecords(), page.getTotal());
  157. }
  158. @Override
  159. public List<EmailSendEntity> getSentList(PaginationTime paginationTime) {
  160. String userId = UserProvider.getUser().getUserId();
  161. QueryWrapper<EmailSendEntity> queryWrapper = new QueryWrapper<>();
  162. queryWrapper.lambda().eq(EmailSendEntity::getCreatorUserId, userId).ne(EmailSendEntity::getState, -1);
  163. //日期范围(近7天、近1月、近3月、自定义)
  164. if (ObjectUtil.isNotEmpty(paginationTime.getStartTime()) && ObjectUtil.isNotEmpty(paginationTime.getEndTime())) {
  165. queryWrapper.lambda().between(EmailSendEntity::getCreatorTime, new Date(paginationTime.getStartTime()), new Date(paginationTime.getEndTime()));
  166. }
  167. //关键字(用户、IP地址、功能名称)
  168. String keyWord = paginationTime.getKeyword() != null ? String.valueOf(paginationTime.getKeyword()) : null;
  169. //关键字(发件人、主题)
  170. if (!StringUtils.isEmpty(keyWord)) {
  171. String word = keyWord;
  172. queryWrapper.lambda().and(
  173. t -> t.like(EmailSendEntity::getSender, word)
  174. .or().like(EmailSendEntity::getSubject, word)
  175. );
  176. }
  177. //排序
  178. String sort = paginationTime.getSort() != null ? paginationTime.getSort() : null;
  179. if (!StringUtils.isEmpty(sort)) {
  180. queryWrapper.lambda().orderByDesc(EmailSendEntity::getCreatorTime);
  181. }
  182. Page<EmailSendEntity> page = new Page<>(paginationTime.getCurrentPage(), paginationTime.getPageSize());
  183. IPage<EmailSendEntity> userIPage = emailSendService.page(page, queryWrapper);
  184. return paginationTime.setData(userIPage.getRecords(), page.getTotal());
  185. }
  186. @Override
  187. public EmailConfigEntity getConfigInfo() {
  188. String userId = UserProvider.getUser().getUserId();
  189. QueryWrapper<EmailConfigEntity> queryWrapper = new QueryWrapper<>();
  190. queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId);
  191. return emailConfigService.getOne(queryWrapper);
  192. }
  193. @Override
  194. public EmailConfigEntity getConfigInfo(String userId) {
  195. QueryWrapper<EmailConfigEntity> queryWrapper = new QueryWrapper<>();
  196. queryWrapper.lambda().eq(EmailConfigEntity::getCreatorUserId, userId);
  197. return emailConfigService.getOne(queryWrapper);
  198. }
  199. @Override
  200. public Object getInfo(String id) {
  201. EmailReceiveEntity receiveInfo = this.getById(id);
  202. Object object;
  203. if (receiveInfo != null) {
  204. //解析内容
  205. receiveInfo.setBodyText(receiveInfo.getBodyText());
  206. //更新已读
  207. receiveInfo.setIsRead(1);
  208. receiveInfo.setLastModifyTime(new Date());
  209. receiveInfo.setLastModifyUserId(UserProvider.getUser().getUserId());
  210. this.updateById(receiveInfo);
  211. object = receiveInfo;
  212. } else {
  213. EmailSendEntity sendInfo = emailSendService.getById(id);
  214. object = sendInfo;
  215. }
  216. return object;
  217. }
  218. @Override
  219. public boolean delete(String id) {
  220. Object object = getInfo(id);
  221. if (object != null && object instanceof EmailReceiveEntity) {
  222. //删除邮件
  223. EmailConfigEntity mailConfig = getConfigInfo();
  224. EmailReceiveEntity mailReceiveEntity = (EmailReceiveEntity) object;
  225. MailAccount mailAccount = new MailAccount();
  226. mailAccount.setAccount(mailConfig.getAccount());
  227. mailAccount.setPassword(mailConfig.getPassword());
  228. mailAccount.setPop3Port(mailConfig.getPop3Port());
  229. mailAccount.setPop3Host(mailConfig.getPop3Host());
  230. pop3Util.deleteMessage(mailAccount, mailReceiveEntity.getMID());
  231. this.removeById(mailReceiveEntity.getId());
  232. return true;
  233. } else if (object != null) {
  234. //删除数据
  235. EmailSendEntity entity = (EmailSendEntity) object;
  236. emailSendService.removeById(entity.getId());
  237. return true;
  238. }
  239. return false;
  240. }
  241. @Override
  242. @Transactional
  243. public void saveDraft(EmailSendEntity entity) {
  244. entity.setState(-1);
  245. if (StringUtil.isNotEmpty(entity.getId())) {
  246. entity.setLastModifyTime(new Date());
  247. entity.setLastModifyUserId(UserProvider.getUser().getUserId());
  248. emailSendService.updateById(entity);
  249. } else {
  250. entity.setId(RandomUtil.uuId());
  251. entity.setCreatorUserId(UserProvider.getUser().getUserId());
  252. emailSendService.save(entity);
  253. }
  254. }
  255. @Override
  256. public boolean receiveRead(String id, int isRead) {
  257. EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id);
  258. if (entity != null) {
  259. entity.setIsRead(isRead);
  260. return this.updateById(entity);
  261. }
  262. return false;
  263. }
  264. @Override
  265. public boolean receiveStarred(String id, int isStarred) {
  266. EmailReceiveEntity entity = (EmailReceiveEntity) getInfo(id);
  267. if (entity != null) {
  268. entity.setStarred(isStarred);
  269. return this.updateById(entity);
  270. }
  271. return false;
  272. }
  273. @Override
  274. public void saveConfig(EmailConfigEntity configEntity) throws DataException {
  275. EmailConfigEntity emailConfigEntity=getConfigInfo(UserProvider.getUser().getUserId());
  276. if (emailConfigEntity == null && UserProvider.getUser().getUserId() != null) {
  277. configEntity.setId(RandomUtil.uuId());
  278. configEntity.setCreatorTime(new Date());
  279. configEntity.setCreatorUserId(UserProvider.getUser().getUserId());
  280. emailConfigService.save(configEntity);
  281. } else if (UserProvider.getUser().getUserId() != null) {
  282. configEntity.setId(emailConfigEntity.getId());
  283. emailConfigService.updateById(configEntity);
  284. } else {
  285. throw new DataException(MsgCode.ETD114.get());
  286. }
  287. }
  288. @Override
  289. @Transactional
  290. public int saveSent(EmailSendEntity entity, EmailConfigEntity mailConfig) {
  291. int flag = 1;
  292. //拷贝文件,注意:从临时文件夹拷贝到邮件文件夹
  293. List<MailFile> attachmentList = JsonUtil.getJsonToList(entity.getAttachment(), MailFile.class);
  294. //邮件路径
  295. String mailFilePath = configValueUtil.getEmailFilePath();
  296. try {
  297. //写入数据
  298. //发送邮件
  299. //邮件发送信息
  300. MailModel mailModel = new MailModel();
  301. mailModel.setFrom(entity.getSender());
  302. mailModel.setRecipient(entity.getRecipient());
  303. mailModel.setCc(entity.getCc());
  304. mailModel.setBcc(entity.getBcc());
  305. mailModel.setSubject(entity.getSubject());
  306. mailModel.setBodyText(entity.getBodyText());
  307. mailModel.setAttachment(attachmentList);
  308. mailModel.setFromName(mailConfig.getSenderName());
  309. //账号验证信息
  310. MailAccount mailAccount = new MailAccount();
  311. mailAccount.setAccount(mailConfig.getAccount());
  312. mailAccount.setPassword(mailConfig.getPassword());
  313. mailAccount.setPop3Host(mailConfig.getPop3Host());
  314. mailAccount.setPop3Port(mailConfig.getPop3Port());
  315. mailAccount.setSmtpHost(mailConfig.getSmtpHost());
  316. mailAccount.setSmtpPort(mailConfig.getSmtpPort());
  317. mailAccount.setSsl(mailConfig.getEmailSsl() == 1 ? true : false);
  318. mailAccount.setAccountName(mailConfig.getSenderName());
  319. SmtpUtil smtpUtil = new SmtpUtil(mailAccount);
  320. smtpUtil.sendMail(null, mailFilePath, mailModel);
  321. flag = 0;
  322. //插入数据库
  323. if (entity.getId() != null) {
  324. entity.setState(1);
  325. emailSendService.updateById(entity);
  326. } else {
  327. entity.setId(RandomUtil.uuId());
  328. entity.setCreatorUserId(UserProvider.getUser().getUserId());
  329. if (mailConfig.getAccount() != null) {
  330. entity.setSender(mailConfig.getAccount());
  331. }
  332. entity.setState(1);
  333. emailSendService.save(entity);
  334. }
  335. } catch (Exception e) {
  336. for (MailFile mailFile : attachmentList) {
  337. FileUtil.deleteFile(mailFilePath + mailFile.getFileId());
  338. }
  339. log.error(e.getMessage());
  340. }
  341. return flag;
  342. }
  343. @Override
  344. @Transactional
  345. public int receive(EmailConfigEntity mailConfig) {
  346. //账号验证信息
  347. MailAccount mailAccount = new MailAccount();
  348. mailAccount.setAccount(mailConfig.getAccount());
  349. mailAccount.setPassword(mailConfig.getPassword());
  350. mailAccount.setPop3Host(mailConfig.getPop3Host());
  351. mailAccount.setPop3Port(mailConfig.getPop3Port());
  352. mailAccount.setSmtpHost(mailConfig.getSmtpHost());
  353. mailAccount.setSmtpPort(mailConfig.getSmtpPort());
  354. if (StringNumber.ONE.equals(mailConfig.getEmailSsl().toString())) {
  355. mailAccount.setSsl(true);
  356. } else {
  357. mailAccount.setSsl(false);
  358. }
  359. Map<String, Object> map = pop3Util.popMail(mailAccount);
  360. int receiveCount = 0;
  361. if (map.get("receiveCount") != null) {
  362. receiveCount = (int) map.get("receiveCount");
  363. }
  364. List<EmailReceiveEntity> mailList = new ArrayList<>();
  365. if (map.get("mailList") != null) {
  366. mailList = (List<EmailReceiveEntity>) map.get("mailList");
  367. }
  368. if (mailList.size() > 0) {
  369. List<String> mids = mailList.stream().map(u -> u.getMID()).collect(Collectors.toList());
  370. //查询数据库状态
  371. QueryWrapper<EmailReceiveEntity> wrapper = new QueryWrapper<>();
  372. wrapper.lambda().in(EmailReceiveEntity::getMID, mids);
  373. List<EmailReceiveEntity> emails = this.list(wrapper);
  374. this.remove(wrapper);
  375. //邮件赋值状态
  376. for (int i = 0; i < mailList.size(); i++) {
  377. EmailReceiveEntity entity = mailList.get(i);
  378. entity.setCreatorUserId(UserProvider.getUser().getUserId());
  379. //通过数据库进行赋值,没有就默认0
  380. 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;
  381. long count = emails.stream().filter(m -> m.getMID().equals(entity.getMID())).count();
  382. entity.setIsRead(stat);
  383. if (count != 0) {
  384. receiveCount--;
  385. }
  386. this.save(entity);
  387. }
  388. }
  389. return receiveCount;
  390. }
  391. }