|
@@ -16,6 +16,7 @@ import org.springframework.stereotype.Component;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
import org.springframework.util.LinkedMultiValueMap;
|
|
|
import org.springframework.util.MultiValueMap;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import javax.mail.*;
|
|
@@ -41,6 +42,9 @@ public class EmailListener {
|
|
|
private String user;
|
|
|
@Value("${workflow.customer_email.appPassword}")
|
|
|
private String appPassword;
|
|
|
+ @Value("${workflow.customer_email.folder}")
|
|
|
+ private String folderStr;
|
|
|
+
|
|
|
@Value("${workflow.customer_email.authorization}")
|
|
|
private String authorization;
|
|
|
@Value("${workflow.customer_email.channelId}")
|
|
@@ -51,7 +55,7 @@ public class EmailListener {
|
|
|
private String postUrl;
|
|
|
|
|
|
// 每小时执行一次,cron 表达式:"0 0 * * * ?"
|
|
|
- @Scheduled(cron = "0 * * * * ?")
|
|
|
+ @Scheduled(cron = "0 0 * * * ?")
|
|
|
public void executeTask() {
|
|
|
log.info("定时监听邮件收件箱: {}", new Date());
|
|
|
// 设置邮件服务器属性
|
|
@@ -69,29 +73,39 @@ public class EmailListener {
|
|
|
// 使用应用专用密码
|
|
|
store.connect(user, appPassword);
|
|
|
// 打开收件箱,用户反馈,INBOX
|
|
|
- Folder folder = store.getFolder("用户反馈");
|
|
|
+ Folder folder = store.getFolder(folderStr);
|
|
|
folder.open(Folder.READ_ONLY);
|
|
|
Message[] totalMessages = folder.getMessages();
|
|
|
- log.info("用户反馈收件箱总计邮件数: {}", totalMessages.length);
|
|
|
- // 过滤时间,获取当前时间和一小时前的时间
|
|
|
+ log.info("打开收件箱完成,{}收件箱总计邮件数: {}", folderStr, totalMessages.length);
|
|
|
+ Calendar calendar1 = Calendar.getInstance();
|
|
|
+ calendar1.add(Calendar.HOUR_OF_DAY, -48);
|
|
|
+ Date folderTime = calendar1.getTime();
|
|
|
+ // 获取近两天邮件
|
|
|
+ ReceivedDateTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE, folderTime);
|
|
|
+ Message[] messages = folder.search(searchTerm);
|
|
|
+ log.info("近两天收件箱邮件数: {}", messages.length);
|
|
|
+ if(messages.length <= 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 过滤时间,获取一小时前的时间 和 前两天的时间
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
- Date endTime = calendar.getTime();
|
|
|
calendar.add(Calendar.HOUR_OF_DAY, -1);
|
|
|
Date startTime = calendar.getTime();
|
|
|
- // 使用 ReceivedDateTerm 获取邮件
|
|
|
- ReceivedDateTerm searchTerm = new ReceivedDateTerm(ComparisonTerm.GE, startTime);
|
|
|
- Message[] messages = folder.search(searchTerm);
|
|
|
- log.info("收件箱最近邮件数: {}", messages.length);
|
|
|
+ log.info("查询邮件开始时间: {}", startTime);
|
|
|
// 遍历条件获取到的邮件
|
|
|
for (Message message : messages) {
|
|
|
Date receivedDate = message.getReceivedDate();
|
|
|
- // 再次过滤(防止搜索条件不精确导致包含一小时之前的邮件)
|
|
|
- if (receivedDate == null || receivedDate.before(startTime) || receivedDate.after(endTime)) {
|
|
|
+ // 再次过滤,因为上面的邮件搜索只能按天,这次过滤最近一小时
|
|
|
+ if (receivedDate == null || receivedDate.before(startTime)) {
|
|
|
continue;
|
|
|
}
|
|
|
// 处理查找到的邮件
|
|
|
log.info("处理邮件,MessageNumber:{}", message.getMessageNumber());
|
|
|
String subject = message.getSubject();
|
|
|
+ if (StringUtils.isEmpty(subject)) {
|
|
|
+ log.warn("邮件主题为空,跳过");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
log.info("过滤邮件主题: {}", subject);
|
|
|
// 过滤邮件主题 和 反馈类型
|
|
|
EmailSubjectEnum emailSubjectEnum = EmailSubjectEnum.getByLikeValue(subject);
|
|
@@ -125,9 +139,9 @@ public class EmailListener {
|
|
|
mattermostCreatePost.setChannel_id(channelId);
|
|
|
String content = "### 收到一封新邮件"
|
|
|
+ "\n**From: **" + EmailUtil.extractTargetEmail(message.getFrom()[0].toString())
|
|
|
- + "\n**Subject: **" + subject
|
|
|
- + "\n**ReceivedDate: **" + receivedDate
|
|
|
- + "\n**Content: **" + EmailUtil.getTextFromMessage(message)
|
|
|
+ + "\n**邮件主题: **" + subject
|
|
|
+ + "\n**收件时间: **" + receivedDate
|
|
|
+ + "\n**内容: **" + EmailUtil.getTextFromMessage(message)
|
|
|
+ "\n" + atPeople;
|
|
|
mattermostCreatePost.setMessage(content);
|
|
|
|