MailServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. package com.fjhx.email.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.alibaba.fastjson2.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.fjhx.email.config.base.BaseEntity;
  9. import com.fjhx.email.config.exception.ServiceException;
  10. import com.fjhx.email.entity.*;
  11. import com.fjhx.email.entity.dto.GetMessagePageDto;
  12. import com.fjhx.email.entity.dto.MailFolderInfo;
  13. import com.fjhx.email.entity.dto.MailboxInfo;
  14. import com.fjhx.email.entity.dto.SetSeenDto;
  15. import com.fjhx.email.entity.vo.MessageDetailVo;
  16. import com.fjhx.email.entity.vo.MessageVo;
  17. import com.fjhx.email.mapper.EnterpriseMessageMapper;
  18. import com.fjhx.email.mapper.MailMapper;
  19. import com.fjhx.email.mapper.PersonalMessageMapper;
  20. import com.fjhx.email.service.*;
  21. import com.fjhx.email.utils.ObsFileUtil;
  22. import com.fjhx.email.utils.PageWrapper;
  23. import com.fjhx.email.utils.email.ImapUtil;
  24. import com.fjhx.email.utils.email.MessageAddress;
  25. import com.fjhx.email.utils.email.TextAndAttachment;
  26. import com.sun.mail.imap.IMAPFolder;
  27. import com.sun.mail.imap.IMAPMessage;
  28. import com.sun.mail.imap.IMAPStore;
  29. import lombok.SneakyThrows;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.PlatformTransactionManager;
  34. import org.springframework.transaction.TransactionDefinition;
  35. import org.springframework.transaction.TransactionStatus;
  36. import javax.mail.*;
  37. import java.io.IOException;
  38. import java.io.InputStream;
  39. import java.util.*;
  40. import java.util.concurrent.*;
  41. import java.util.function.Function;
  42. import java.util.stream.Collectors;
  43. @Slf4j
  44. @Service
  45. public class MailServiceImpl implements IMailService {
  46. /**
  47. * 创建一个线程池
  48. */
  49. private static final Executor executor = new ThreadPoolExecutor(
  50. 12,
  51. 36,
  52. 60,
  53. TimeUnit.SECONDS,
  54. new ArrayBlockingQueue<>(36),
  55. new ThreadPoolExecutor.CallerRunsPolicy()
  56. );
  57. @Autowired
  58. private MailMapper mailMapper;
  59. @Autowired
  60. private IPersonalMessageService personalMessageService;
  61. @Autowired
  62. private IEnterpriseMessageService enterpriseMessageService;
  63. @Autowired
  64. private IEnterpriseMessageAddressService enterpriseMessageAddressService;
  65. @Autowired
  66. private IEnterpriseMessageAttachmentService enterpriseMessageAttachmentService;
  67. @Autowired
  68. private IEnterpriseMessageContentService enterpriseMessageContentService;
  69. @Autowired
  70. private IPersonalMessageAddressService personalMessageAddressService;
  71. @Autowired
  72. private IPersonalMessageAttachmentService personalMessageAttachmentService;
  73. @Autowired
  74. private IPersonalMessageContentService personalMessageContentService;
  75. @Autowired
  76. private IPersonalMailboxService personalMailboxService;
  77. @Autowired
  78. private IEnterpriseMailboxService enterpriseMailboxService;
  79. @Autowired
  80. private IEnterpriseDomainService enterpriseDomainService;
  81. @Autowired
  82. private TransactionDefinition transactionDefinition;
  83. @Autowired
  84. private PlatformTransactionManager platformTransactionManager;
  85. @Autowired
  86. private IPersonalFolderService personalFolderService;
  87. @Autowired
  88. private IEnterpriseFolderService enterpriseFolderService;
  89. @Autowired
  90. private EnterpriseMessageMapper enterpriseMessageMapper;
  91. @Autowired
  92. private PersonalMessageMapper personalMessageMapper;
  93. @Override
  94. public List<MailboxInfo> getMailboxInfoListByUserId(List<Long> userIdList, Integer mailType) {
  95. if (ObjectUtil.isEmpty(userIdList)) {
  96. return Collections.emptyList();
  97. }
  98. return mailMapper.getMailboxInfoListByUserId(userIdList, mailType);
  99. }
  100. @SneakyThrows
  101. @Override
  102. public PageWrapper<MessageVo> getMessagePage(GetMessagePageDto dto) {
  103. PageWrapper<MessageVo> pageWrapper;
  104. // IMAPStore imapStore;
  105. // IMAPFolder folder;
  106. // 个人邮箱
  107. if (dto.getType().equals(1)) {
  108. QueryWrapper<PersonalMessage> wrapper = Wrappers.query();
  109. wrapper.eq("pm.folder_id", dto.getFolderId());
  110. wrapper.and(ObjectUtil.isNotEmpty(dto.getKeyword()), q1 -> q1
  111. .like("pm.from_email", dto.getKeyword())
  112. .or().like("pm.from_personal_name", dto.getKeyword())
  113. .or().like("pm.subject", dto.getKeyword())
  114. .or().like("pmc.content", dto.getKeyword())
  115. );
  116. wrapper.orderByDesc("pm.send_date");
  117. Page<PersonalMessage> page = personalMessageMapper.getPage(dto.getPage(), wrapper);
  118. // Page<PersonalMessage> page = personalMessageService.page(dto, q -> q
  119. // .eq(PersonalMessage::getFolderId, dto.getFolderId())
  120. // .orderByDesc(PersonalMessage::getSendDate)
  121. // );
  122. pageWrapper = new PageWrapper<>(page, MessageVo.class);
  123. if (page.getSize() == 0) {
  124. return pageWrapper;
  125. }
  126. PersonalFolder personalFolder = personalFolderService.getById(dto.getFolderId());
  127. if (personalFolder == null) {
  128. throw new ServiceException("文件夹已被删除");
  129. }
  130. // MailboxInfo mailboxInfo = getMailboxInfo(1, personalFolder.getMailboxId());
  131. // imapStore = ImapUtil.getStore(
  132. // mailboxInfo.getReceiveHost(),
  133. // mailboxInfo.getMailUser(),
  134. // mailboxInfo.getMailPassword()
  135. // );
  136. // folder = (IMAPFolder) imapStore.getFolder(personalFolder.getName());
  137. }
  138. // 企业邮箱
  139. else {
  140. QueryWrapper<EnterpriseMessage> wrapper = Wrappers.query();
  141. wrapper.eq("em.folder_id", dto.getFolderId());
  142. wrapper.and(ObjectUtil.isNotEmpty(dto.getKeyword()), q1 -> q1
  143. .like("em.from_email", dto.getKeyword())
  144. .or().like("em.from_personal_name", dto.getKeyword())
  145. .or().like("em.subject", dto.getKeyword())
  146. .or().like("emc.content", dto.getKeyword())
  147. );
  148. wrapper.orderByDesc("em.send_date");
  149. Page<EnterpriseMessage> page = enterpriseMessageMapper.getPage(dto.getPage(), wrapper);
  150. // Page<EnterpriseMessage> page = enterpriseMessageService.page(dto, q -> q
  151. // .eq(EnterpriseMessage::getFolderId, dto.getFolderId())
  152. // .orderByDesc(EnterpriseMessage::getSendDate)
  153. // );
  154. pageWrapper = new PageWrapper<>(page, MessageVo.class);
  155. if (page.getSize() == 0) {
  156. return pageWrapper;
  157. }
  158. EnterpriseFolder enterpriseFolder = enterpriseFolderService.getById(dto.getFolderId());
  159. if (enterpriseFolder == null) {
  160. throw new ServiceException("文件夹已被删除");
  161. }
  162. // MailboxInfo mailboxInfo = getMailboxInfo(2, enterpriseFolder.getMailboxId());
  163. // imapStore = ImapUtil.getStore(
  164. // mailboxInfo.getReceiveHost(),
  165. // mailboxInfo.getMailUser(),
  166. // mailboxInfo.getMailPassword()
  167. // );
  168. // folder = (IMAPFolder) imapStore.getFolder(enterpriseFolder.getName());
  169. }
  170. // folder.open(Folder.READ_ONLY);
  171. // ArrayList<CompletableFuture<Void>> futureList = new ArrayList<>();
  172. // for (MessageVo messageVo : pageWrapper.getRows()) {
  173. // CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> {
  174. // Long uid = messageVo.getUid();
  175. // try {
  176. // Message message = folder.getMessageByUID(uid);
  177. // if (message != null) {
  178. // String flags = ImapUtil.getFlags(message.getFlags());
  179. // messageVo.setFlags(flags);
  180. // }
  181. // } catch (MessagingException e) {
  182. // throw new ServiceException("获取邮件是否已读失败");
  183. // }
  184. // }, executor);
  185. // futureList.add(completableFuture);
  186. // }
  187. //
  188. // futureList.forEach(CompletableFuture::join);
  189. //
  190. // ImapUtil.closeFolder(folder);
  191. // ImapUtil.closeStore(imapStore);
  192. return pageWrapper;
  193. }
  194. @SneakyThrows
  195. @Override
  196. public MessageDetailVo getMessageDetail(GetMessagePageDto dto) {
  197. Long messageId = dto.getMessageId();
  198. Integer type = dto.getType();
  199. Long mailboxId;
  200. Integer syncStatus;
  201. String folderName;
  202. Long uid;
  203. //发件人地址
  204. String fromEmail;
  205. if (type.equals(1)) {
  206. PersonalMessage personalMessage = personalMessageService.getById(messageId);
  207. if (personalMessage == null) {
  208. throw new ServiceException("没有找到邮箱");
  209. }
  210. fromEmail = personalMessage.getFromEmail();
  211. mailboxId = personalMessage.getMailboxId();
  212. syncStatus = personalMessage.getSyncStatus();
  213. folderName = personalMessage.getFolderName();
  214. uid = personalMessage.getUid();
  215. } else {
  216. EnterpriseMessage enterpriseMessage = enterpriseMessageService.getById(messageId);
  217. if (enterpriseMessage == null) {
  218. throw new ServiceException("没有找到邮箱");
  219. }
  220. fromEmail = enterpriseMessage.getFromEmail();
  221. mailboxId = enterpriseMessage.getMailboxId();
  222. syncStatus = enterpriseMessage.getSyncStatus();
  223. folderName = enterpriseMessage.getFolderName();
  224. uid = enterpriseMessage.getUid();
  225. }
  226. //设置已读
  227. CompletableFuture.runAsync(() -> {
  228. MailboxInfo mailboxInfo = getMailboxInfo(type, mailboxId);
  229. IMAPStore store = null;
  230. IMAPFolder folder = null;
  231. try {
  232. store = ImapUtil.getStore(
  233. mailboxInfo.getReceiveHost(),
  234. mailboxInfo.getMailUser(),
  235. mailboxInfo.getMailPassword()
  236. );
  237. folder = (IMAPFolder) store.getFolder(folderName);
  238. folder.open(Folder.READ_WRITE);
  239. IMAPMessage message = (IMAPMessage) folder.getMessageByUID(uid);
  240. if (message == null) {
  241. return;
  242. }
  243. // 设置已读
  244. ImapUtil.setSeen(message);
  245. String flags = ImapUtil.getFlags(message.getFlags());
  246. if (type.equals(1)) {
  247. PersonalMessage personalMessage = personalMessageService.getById(messageId);
  248. if (personalMessage != null) {
  249. personalMessage.setFlags(flags);
  250. personalMessageService.updateById(personalMessage);
  251. }
  252. } else {
  253. EnterpriseMessage enterpriseMessage = enterpriseMessageService.getById(messageId);
  254. if (enterpriseMessage != null) {
  255. enterpriseMessage.setFlags(flags);
  256. enterpriseMessageService.updateById(enterpriseMessage);
  257. }
  258. }
  259. } catch (Exception e) {
  260. log.error("修改已读异常" + e.getMessage());
  261. } finally {
  262. try {
  263. ImapUtil.closeFolder(folder);
  264. ImapUtil.closeStore(store);
  265. } catch (Exception e) {
  266. log.error("关闭链接失败");
  267. }
  268. }
  269. });
  270. MessageDetailVo messageDetailVo = new MessageDetailVo();
  271. messageDetailVo.setMessageId(messageId);
  272. messageDetailVo.setFromEmail(fromEmail);
  273. // 已同步
  274. if (syncStatus.equals(1)) {
  275. if (type.equals(1)) {
  276. setPersonalMessageDetailVo(messageDetailVo, messageId);
  277. } else {
  278. setEnterpriseMessageDetailVo(messageDetailVo, messageId);
  279. }
  280. }
  281. // 未同步
  282. else {
  283. MailboxInfo mailboxInfo = getMailboxInfo(type, mailboxId);
  284. IMAPStore store = ImapUtil.getStore(
  285. mailboxInfo.getReceiveHost(),
  286. mailboxInfo.getMailUser(),
  287. mailboxInfo.getMailPassword()
  288. );
  289. IMAPFolder folder = (IMAPFolder) store.getFolder(folderName);
  290. folder.open(Folder.READ_WRITE);
  291. IMAPMessage message = (IMAPMessage) folder.getMessageByUID(uid);
  292. if (message == null) {
  293. throw new ServiceException("没有找到邮件详情,此邮件可能已被删除");
  294. }
  295. // 赋值邮件 正文、附件
  296. CompletableFuture<Void> setTextAndAttachmentFuture = CompletableFuture.runAsync(() -> {
  297. try {
  298. setTextAndAttachment(message, messageDetailVo);
  299. } catch (Exception e) {
  300. throw new ServiceException("邮件加载失败");
  301. }
  302. }, executor);
  303. // 赋值邮件 收件人、抄送人、密送人、回复人
  304. CompletableFuture<Void> setAddressFuture = CompletableFuture.runAsync(() -> {
  305. try {
  306. setAddress(message, messageDetailVo);
  307. } catch (MessagingException e) {
  308. throw new ServiceException("邮件加载失败");
  309. }
  310. }, executor);
  311. // 设置已读
  312. CompletableFuture<Void> setSeenFuture = CompletableFuture.runAsync(() -> {
  313. try {
  314. ImapUtil.setSeen(message);
  315. } catch (MessagingException e) {
  316. throw new ServiceException("邮件加载失败");
  317. }
  318. }, executor);
  319. // 保存数据
  320. setSeenFuture.join();
  321. setAddressFuture.join();
  322. setTextAndAttachmentFuture.join();
  323. // 保存内容
  324. executor.execute(() -> {
  325. // 关闭连接
  326. try {
  327. ImapUtil.closeFolder(folder);
  328. ImapUtil.closeStore(store);
  329. } catch (Exception e) {
  330. log.error("关闭链接失败");
  331. }
  332. saveMessageDetail(messageId, messageDetailVo, type);
  333. });
  334. }
  335. // copy一份数据,防止多线程下把文件路径前缀保存到数据库中
  336. MessageDetailVo copy = JSONObject.parseObject(JSONObject.toJSONString(messageDetailVo), MessageDetailVo.class);
  337. for (MessageDetailVo.MessageAttachment messageAttachment : copy.getMessageAttachmentList()) {
  338. messageAttachment.setUrl(ObsFileUtil.getCompleteUrl(messageAttachment.getUrl()));
  339. }
  340. return copy;
  341. }
  342. @SneakyThrows
  343. @Override
  344. public void setUnreadMessageCount(List<MailboxInfo> mailboxInfoList) {
  345. List<Long> mailboxInfoIds = mailboxInfoList.stream().map(MailboxInfo::getId).collect(Collectors.toList());
  346. List<MessageVo> unreadMessageCount = mailMapper.getUnreadMessageCount(Wrappers.query()
  347. .in("m.mailbox_id", mailboxInfoIds)
  348. );
  349. Map<Long, MessageVo> unreadMessageCountMap = unreadMessageCount.stream().collect(Collectors.toMap(MessageVo::getFolderId, Function.identity()));
  350. for (MailboxInfo mailboxInfo : mailboxInfoList) {
  351. for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
  352. MessageVo messageVo = unreadMessageCountMap.get(mailFolderInfo.getId());
  353. int count = ObjectUtil.isEmpty(messageVo) ? 0 : messageVo.getCount();
  354. mailFolderInfo.setUnreadMessageCount(count);
  355. }
  356. // IMAPStore store = ImapUtil.getStore(
  357. // mailboxInfo.getReceiveHost(),
  358. // mailboxInfo.getMailUser(),
  359. // mailboxInfo.getMailPassword()
  360. // );
  361. //
  362. // for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
  363. // String name = mailFolderInfo.getName();
  364. // if (StrUtil.equalsAnyIgnoreCase(name, "inbox")) {
  365. // IMAPFolder folder = (IMAPFolder) store.getFolder(name);
  366. // folder.open(Folder.READ_WRITE);
  367. // int unreadMessageCount = folder.getUnreadMessageCount();
  368. // mailFolderInfo.setUnreadMessageCount(unreadMessageCount);
  369. // ImapUtil.closeFolder(folder);
  370. // break;
  371. // }
  372. // }
  373. //
  374. // ImapUtil.closeStore(store);
  375. // if (Objects.equals(mailboxInfo.getType(), 1)) {
  376. // //个人邮箱
  377. // Map<Long, List<PersonalMessage>> personalMessageMap = personalMessageService.mapKGroup(PersonalMessage::getFolderId, q -> q
  378. // .eq(PersonalMessage::getMailboxId, mailboxInfo.getId())
  379. // .and(q1 -> q1
  380. // .isNull(PersonalMessage::getFlags)
  381. // .or().eq(PersonalMessage::getFlags, "")
  382. // )
  383. // );
  384. // MessageVo messageVo = unreadMessageCountMap.get(mailboxInfo.getId());
  385. // for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
  386. // List<PersonalMessage> personalMessages = personalMessageMap.getOrDefault(mailFolderInfo.getId(), new ArrayList<>());
  387. // mailFolderInfo.setUnreadMessageCount(personalMessages.size());
  388. // }
  389. // } else {
  390. // //企业邮箱
  391. // Map<Long, List<EnterpriseMessage>> enterpriseMessageMap = enterpriseMessageService.mapKGroup(EnterpriseMessage::getFolderId, q -> q
  392. // .eq(EnterpriseMessage::getMailboxId, mailboxInfo.getId())
  393. // .and(q1 -> q1
  394. // .isNull(EnterpriseMessage::getFlags)
  395. // .or().eq(EnterpriseMessage::getFlags, "")
  396. // )
  397. // );
  398. // for (MailFolderInfo mailFolderInfo : mailboxInfo.getMailFolderInfoList()) {
  399. // List<EnterpriseMessage> personalMessages = enterpriseMessageMap.getOrDefault(mailFolderInfo.getId(), new ArrayList<>());
  400. // mailFolderInfo.setUnreadMessageCount(personalMessages.size());
  401. // }
  402. // }
  403. }
  404. }
  405. @Override
  406. public void setSeen(String host, String user, String password, SetSeenDto dto) throws MessagingException {
  407. IMAPStore store = ImapUtil.getStore(host, user, password);
  408. IMAPFolder folder = (IMAPFolder) store.getFolder(dto.getFolderName());
  409. folder.open(Folder.READ_WRITE);
  410. List<Long> uidList = dto.getUidList();
  411. long[] uids = new long[uidList.size()];
  412. for (int i = 0; i < uidList.size(); i++) {
  413. uids[i] = uidList.get(i);
  414. }
  415. Message[] messages = folder.getMessagesByUID(uids);
  416. for (Message message : messages) {
  417. Flags flags = message.getFlags();
  418. flags.add(Flags.Flag.SEEN);
  419. message.setFlags(flags, true);
  420. long uid = folder.getUID(message);
  421. if (dto.getType() == 1) {
  422. //个人邮箱
  423. personalMessageService.update(q -> q
  424. .eq(PersonalMessage::getUid, uid)
  425. .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
  426. );
  427. } else {
  428. //企业邮箱
  429. enterpriseMessageService.update(q -> q
  430. .eq(EnterpriseMessage::getUid, uid)
  431. .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
  432. );
  433. }
  434. }
  435. // Flags flags = new Flags();
  436. // flags.add(Flags.Flag.SEEN);
  437. //
  438. // folder.setFlags(messages, flags, true);
  439. //
  440. // if(dto.getType()==1){
  441. // //个人邮箱
  442. // personalMessageService.update(q->q
  443. // .in(PersonalMessage::getUid,uids)
  444. // .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
  445. // );
  446. // }else{
  447. // //企业邮箱
  448. // enterpriseMessageService.update(q->q
  449. // .in(EnterpriseMessage::getUid,uids)
  450. // .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
  451. // );
  452. // }
  453. }
  454. @Override
  455. public void cancelSeen(String host, String user, String password, SetSeenDto dto) throws MessagingException {
  456. IMAPStore store = ImapUtil.getStore(host, user, password);
  457. IMAPFolder folder = (IMAPFolder) store.getFolder(dto.getFolderName());
  458. folder.open(Folder.READ_WRITE);
  459. List<Long> uidList = dto.getUidList();
  460. long[] uids = new long[uidList.size()];
  461. for (int i = 0; i < uidList.size(); i++) {
  462. uids[i] = uidList.get(i);
  463. }
  464. Message[] messages = folder.getMessagesByUID(uids);
  465. for (Message message : messages) {
  466. Flags flags = message.getFlags();
  467. flags.remove(Flags.Flag.SEEN);
  468. message.setFlags(flags, true);
  469. long uid = folder.getUID(message);
  470. if (dto.getType() == 1) {
  471. //个人邮箱
  472. personalMessageService.update(q -> q
  473. .eq(PersonalMessage::getUid, uid)
  474. .set(PersonalMessage::getFlags, ImapUtil.getFlags(flags))
  475. );
  476. } else {
  477. //企业邮箱
  478. enterpriseMessageService.update(q -> q
  479. .eq(EnterpriseMessage::getUid, uid)
  480. .set(EnterpriseMessage::getFlags, ImapUtil.getFlags(flags))
  481. );
  482. }
  483. }
  484. }
  485. /**
  486. * 保存内容
  487. */
  488. private void saveMessageDetail(Long messageId, MessageDetailVo messageDetailVo, Integer type) {
  489. TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
  490. try {
  491. if (type == 1) {
  492. PersonalMessageContent personalMessageContent = new PersonalMessageContent();
  493. personalMessageContent.setMessageId(messageId);
  494. personalMessageContent.setContent(messageDetailVo.getContent());
  495. personalMessageContent.setMimeType(messageDetailVo.getMimeType());
  496. personalMessageContentService.save(personalMessageContent);
  497. List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
  498. List<PersonalMessageAddress> personalMessageContentService = messageAddressList.stream().map(item -> {
  499. PersonalMessageAddress personalMessageAddress = new PersonalMessageAddress();
  500. personalMessageAddress.setMessageId(messageId);
  501. personalMessageAddress.setPersonalName(item.getPersonalName());
  502. personalMessageAddress.setType(item.getType());
  503. personalMessageAddress.setEmail(item.getEmail());
  504. return personalMessageAddress;
  505. }).collect(Collectors.toList());
  506. personalMessageAddressService.saveBatch(personalMessageContentService);
  507. List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
  508. List<PersonalMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
  509. PersonalMessageAttachment personalMessageAttachment = new PersonalMessageAttachment();
  510. personalMessageAttachment.setName(item.getName());
  511. personalMessageAttachment.setUrl(item.getUrl());
  512. personalMessageAttachment.setMessageId(messageId);
  513. return personalMessageAttachment;
  514. }).collect(Collectors.toList());
  515. personalMessageAttachmentService.saveBatch(messageAttachments);
  516. personalMessageService.update(q -> q
  517. .eq(PersonalMessage::getId, messageId)
  518. .set(PersonalMessage::getSyncStatus, 1)
  519. .set(BaseEntity::getUpdateTime, new Date())
  520. );
  521. } else {
  522. EnterpriseMessageContent enterpriseMessageContent = new EnterpriseMessageContent();
  523. enterpriseMessageContent.setMessageId(messageId);
  524. enterpriseMessageContent.setContent(messageDetailVo.getContent());
  525. enterpriseMessageContent.setMimeType(messageDetailVo.getMimeType());
  526. enterpriseMessageContentService.save(enterpriseMessageContent);
  527. List<MessageDetailVo.MessageAddress> messageAddressList = messageDetailVo.getMessageAddressList();
  528. List<EnterpriseMessageAddress> enterpriseMessageAddressList = messageAddressList.stream().map(item -> {
  529. EnterpriseMessageAddress enterpriseMessageAddress = new EnterpriseMessageAddress();
  530. enterpriseMessageAddress.setMessageId(messageId);
  531. enterpriseMessageAddress.setPersonalName(item.getPersonalName());
  532. enterpriseMessageAddress.setType(item.getType());
  533. enterpriseMessageAddress.setEmail(item.getEmail());
  534. return enterpriseMessageAddress;
  535. }).collect(Collectors.toList());
  536. enterpriseMessageAddressService.saveBatch(enterpriseMessageAddressList);
  537. List<MessageDetailVo.MessageAttachment> messageAttachmentList = messageDetailVo.getMessageAttachmentList();
  538. List<EnterpriseMessageAttachment> messageAttachments = messageAttachmentList.stream().map(item -> {
  539. EnterpriseMessageAttachment enterpriseMessageAttachment = new EnterpriseMessageAttachment();
  540. enterpriseMessageAttachment.setName(item.getName());
  541. enterpriseMessageAttachment.setUrl(item.getUrl());
  542. enterpriseMessageAttachment.setMessageId(messageId);
  543. return enterpriseMessageAttachment;
  544. }).collect(Collectors.toList());
  545. enterpriseMessageAttachmentService.saveBatch(messageAttachments);
  546. enterpriseMessageService.update(q -> q
  547. .eq(EnterpriseMessage::getId, messageId)
  548. .set(EnterpriseMessage::getSyncStatus, 1)
  549. .set(BaseEntity::getUpdateTime, new Date())
  550. );
  551. }
  552. // 提交事务
  553. platformTransactionManager.commit(transactionStatus);
  554. } catch (Exception e) {
  555. // 回滚事务
  556. platformTransactionManager.rollback(transactionStatus);
  557. }
  558. }
  559. private MailboxInfo getMailboxInfo(Integer type, Long mailboxId) {
  560. MailboxInfo mailboxInfo = new MailboxInfo();
  561. if (type.equals(1)) {
  562. PersonalMailbox personalMailbox = personalMailboxService.getById(mailboxId);
  563. mailboxInfo.setReceiveHost(personalMailbox.getReceiveHost());
  564. mailboxInfo.setReceivePort(personalMailbox.getReceivePort());
  565. mailboxInfo.setMailUser(personalMailbox.getMailUser());
  566. mailboxInfo.setMailPassword(personalMailbox.getMailPassword());
  567. return mailboxInfo;
  568. }
  569. EnterpriseMailbox enterpriseMailbox = enterpriseMailboxService.getById(mailboxId);
  570. EnterpriseDomain enterpriseDomain = enterpriseDomainService.getById(enterpriseMailbox.getDomainId());
  571. mailboxInfo.setReceiveHost(enterpriseDomain.getReceiveHost());
  572. mailboxInfo.setReceivePort(enterpriseDomain.getReceivePort());
  573. mailboxInfo.setMailUser(enterpriseMailbox.getMailUserPrefix() + "@" + enterpriseDomain.getDomainName());
  574. mailboxInfo.setMailPassword(enterpriseMailbox.getMailPassword());
  575. return mailboxInfo;
  576. }
  577. /**
  578. * 保存个人邮件明细
  579. */
  580. private void setPersonalMessageDetailVo(MessageDetailVo vo, Long messageId) {
  581. List<PersonalMessageAddress> addressList = personalMessageAddressService.list(
  582. q -> q.eq(PersonalMessageAddress::getMessageId, messageId));
  583. vo.setMessageAddressList(BeanUtil.copyToList(addressList, MessageDetailVo.MessageAddress.class));
  584. List<PersonalMessageAttachment> attachmentList = personalMessageAttachmentService.list(
  585. q -> q.eq(PersonalMessageAttachment::getMessageId, messageId));
  586. vo.setMessageAttachmentList(BeanUtil.copyToList(attachmentList, MessageDetailVo.MessageAttachment.class));
  587. PersonalMessageContent content = personalMessageContentService.getOne(
  588. q -> q.eq(PersonalMessageContent::getMessageId, messageId));
  589. vo.setContent(content.getContent());
  590. }
  591. /**
  592. * 保存企业邮件明细
  593. */
  594. private void setEnterpriseMessageDetailVo(MessageDetailVo vo, Long messageId) {
  595. List<EnterpriseMessageAddress> addressList = enterpriseMessageAddressService.list(
  596. q -> q.eq(EnterpriseMessageAddress::getMessageId, messageId));
  597. vo.setMessageAddressList(BeanUtil.copyToList(addressList, MessageDetailVo.MessageAddress.class));
  598. List<EnterpriseMessageAttachment> attachmentList = enterpriseMessageAttachmentService.list(
  599. q -> q.eq(EnterpriseMessageAttachment::getMessageId, messageId));
  600. vo.setMessageAttachmentList(BeanUtil.copyToList(attachmentList, MessageDetailVo.MessageAttachment.class));
  601. EnterpriseMessageContent content = enterpriseMessageContentService.getOne(
  602. q -> q.eq(EnterpriseMessageContent::getMessageId, messageId));
  603. vo.setContent(content.getContent());
  604. }
  605. /**
  606. * 获取邮件 收件人、抄送人、密送人、回复人
  607. */
  608. private void setAddress(IMAPMessage message, MessageDetailVo messageDetailVo) throws MessagingException {
  609. List<MessageAddress> messageAddressList = ImapUtil.getMessageAddressList(message);
  610. List<MessageDetailVo.MessageAddress> list = messageAddressList
  611. .stream()
  612. .map(item -> {
  613. MessageDetailVo.MessageAddress messageAddress = new MessageDetailVo.MessageAddress();
  614. messageAddress.setType(item.getType());
  615. messageAddress.setEmail(item.getEmail());
  616. messageAddress.setPersonalName(item.getName());
  617. return messageAddress;
  618. })
  619. .collect(Collectors.toList());
  620. messageDetailVo.setMessageAddressList(list);
  621. }
  622. /**
  623. * 获取邮件正文以及附件
  624. */
  625. private void setTextAndAttachment(IMAPMessage message, MessageDetailVo vo) throws MessagingException, IOException {
  626. List<CompletableFuture<Void>> futureList = new ArrayList<>();
  627. List<MessageDetailVo.MessageAttachment> attachmentList = new ArrayList<>();
  628. ImapUtil.setTextAndAttachment(message, new TextAndAttachment() {
  629. @Override
  630. public void setPlain(String plain) {
  631. if (ObjectUtil.notEqual(vo.getMimeType(), "text/html")) {
  632. vo.setContent(plain);
  633. vo.setMimeType("text/plain");
  634. }
  635. }
  636. @Override
  637. public void setHtml(String html) {
  638. vo.setContent(html);
  639. vo.setMimeType("text/html");
  640. }
  641. @Override
  642. public void setAttachment(String fileName, InputStream is) {
  643. CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
  644. String url = ObsFileUtil.uploadFile(fileName, is);
  645. MessageDetailVo.MessageAttachment messageAttachment = new MessageDetailVo.MessageAttachment();
  646. messageAttachment.setUrl(url);
  647. messageAttachment.setName(fileName);
  648. attachmentList.add(messageAttachment);
  649. }, executor);
  650. futureList.add(future);
  651. }
  652. @Override
  653. public void unknown(Part part) throws MessagingException {
  654. log.error("id为 {} 的邮件存在未知类型:{}", vo.getMessageId(), part.getContentType());
  655. }
  656. });
  657. futureList.forEach(CompletableFuture::join);
  658. vo.setMessageAttachmentList(attachmentList);
  659. }
  660. }