修改dmp邮件

master
bynt 2 years ago
parent 438e014df1
commit 3f36dcbf51

@ -123,6 +123,10 @@
<artifactId>mail</artifactId>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
</dependency>
</dependencies>

@ -56,4 +56,10 @@ public interface CacheKey {
*
*/
String DICT_NAME = "dict::name:";
/**
* dmp
*/
String DMP_REQUEST_ID = "dmp::request::id";
}

@ -0,0 +1,83 @@
package com.baiye.util;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;
import java.util.ArrayList;
/**
* @author Enzo
* @date : 2022/10/24
*/
public class CompressUtil {
private CompressUtil() {
}
/**
* @param zipPath
* @param filepath
* @param password
*/
public static void decryptionCompression(String zipPath, String filepath, String password) {
try {
//创建压缩文件
ZipFile zipFile = new ZipFile(zipPath);
ArrayList<File> files = new ArrayList<>();
files.add(new File(filepath));
//设置压缩文件参数
ZipParameters parameters = new ZipParameters();
//设置压缩方法
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
//设置压缩级别
//DEFLATE_LEVEL_FASTEST - Lowest compression level but higher speed of compression
//DEFLATE_LEVEL_FAST - Low compression level but higher speed of compression
//DEFLATE_LEVEL_NORMAL - Optimal balance between compression level/speed
//DEFLATE_LEVEL_MAXIMUM - High compression level with a compromise of speed
//DEFLATE_LEVEL_ULTRA - Highest compression level but low speed
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
//设置压缩文件加密
parameters.setEncryptFiles(true);
//设置加密方法
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
//设置aes加密强度
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
//设置密码
parameters.setPassword(password);
//添加文件到压缩文件
zipFile.addFiles(files, parameters);
} catch (ZipException e) {
e.printStackTrace();
}
}
public static String unzipFiles(String fileUrl, String zipPath, String password) throws ZipException {
File file = new File(zipPath);
ZipFile zipFile = new ZipFile(file);
//设置文件编码,根据实际场景
zipFile.setFileNameCharset(CharsetUtil.GBK);
if (zipFile.isEncrypted()) {
zipFile.setPassword(password);
}
String uuid = IdUtil.randomUUID();
String filePath
= fileUrl.concat(StrPool.SLASH).concat(uuid);
zipFile.extractAll(filePath);
return filePath;
}
}

@ -1,10 +1,14 @@
package com.baiye.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.CharsetUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.exception.CallException;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
@ -12,12 +16,16 @@ import javax.mail.*;
import javax.mail.internet.*;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Properties;
/**
* @author Enzo
* @date 2022-10-22 13:49:33
*/
@Slf4j
public class MailUtil {
private MailUtil() {
@ -25,6 +33,7 @@ public class MailUtil {
/**
*
*
* @param username
* @param password
* @return
@ -43,11 +52,11 @@ public class MailUtil {
Message[] messages = inbox.getMessages();
list.addAll(Arrays.asList(messages));
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.exit(1);
log.error("======================= open mail error time {} ==================", DateUtil.date());
throw new CallException("没有找到该服务");
} catch (MessagingException e) {
e.printStackTrace();
System.exit(2);
log.error("======================= open mail error time {} ==================", DateUtil.date());
throw new CallException("获取邮箱失败");
}
return list;
}
@ -55,7 +64,7 @@ public class MailUtil {
/**
* ++
*/
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String filename, String taskName, String customerId) throws Exception {
public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String filename, String taskName) throws Exception {
// 1. 创建邮件对象
MimeMessage message = new MimeMessage(session);
@ -66,14 +75,14 @@ public class MailUtil {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail, receiveMail, CharsetUtil.UTF_8));
// 4. Subject: 邮件主题
message.setSubject(customerId, CharsetUtil.UTF_8);
message.setSubject(taskName, CharsetUtil.UTF_8);
/*
* :
*/
// 6. 创建文本“节点”
MimeBodyPart text = new MimeBodyPart();
/*MimeBodyPart text = new MimeBodyPart();
// 这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
text.setContent(taskName, "text/html;charset=UTF-8");
@ -87,7 +96,7 @@ public class MailUtil {
// 最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
// 上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
MimeBodyPart textImage = new MimeBodyPart();
textImage.setContent(mmTextImage);
textImage.setContent(mmTextImage);*/
// 9. 创建附件“节点”
MimeBodyPart attachment = new MimeBodyPart();
@ -100,7 +109,7 @@ public class MailUtil {
// 10. 设置(文本+图片)和 附件 的关系(合成一个大的混合“节点” / Multipart
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(textImage);
// mm.addBodyPart(textImage);
// 如果有多个附件,可以创建多个多次添加
mm.addBodyPart(attachment);
// 混合关系
@ -118,7 +127,7 @@ public class MailUtil {
return message;
}
public static void sendMail(String username, String password, String toUsername, String fileName, String customerId, String taskName) {
public static void sendMail(String username, String password, String toUsername, String fileName, String taskName) {
try {
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
@ -141,7 +150,7 @@ public class MailUtil {
session.setDebug(Boolean.FALSE);
// 3. 创建一封邮件
MimeMessage message = createMimeMessage(session, username, toUsername, fileName, taskName, customerId);
MimeMessage message = createMimeMessage(session, username, toUsername, fileName, taskName);
// 4. 根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
@ -175,7 +184,7 @@ public class MailUtil {
}
}
}
return "";
return CharSequenceUtil.EMPTY;
}
@ -215,7 +224,10 @@ public class MailUtil {
private static String saveFile(String fileName, InputStream in, String path) {
String osName = System.getProperty("os.name");
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
String separator;
if (osName == null) {
osName = "";
@ -226,7 +238,8 @@ public class MailUtil {
separator = "/";
}
File storeFile = new File(path + separator + fileName);
try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(storeFile.toPath())); BufferedInputStream bis = new BufferedInputStream(in)) {
try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(storeFile.toPath()));
BufferedInputStream bis = new BufferedInputStream(in)) {
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
@ -238,4 +251,20 @@ public class MailUtil {
return storeFile.getPath();
}
/**
*
*
* @param msg
* @return <Email>
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public static String getFrom(MimeMessage msg) throws MessagingException {
Address[] froms = msg.getFrom();
if (froms.length < DefaultNumberConstants.ONE_NUMBER)
throw new MessagingException("没有发件人!");
InternetAddress address = (InternetAddress) froms[DefaultNumberConstants.ZERO_NUMBER];
return address.getAddress();
}
}

@ -55,9 +55,7 @@ public class MobileUtil {
public static boolean checkChinaMobile(String phone) {
if (StringUtils.isNotBlank(phone)) {
Pattern regexp = Pattern.compile(CHINA_MOBILE_PATTERN);
if (regexp.matcher(phone).matches()) {
return true;
}
return regexp.matcher(phone).matches();
}
return false;
}

@ -17,6 +17,9 @@ public class DeliveryProperties {
@ApiModelProperty("文件地址")
private String fileUrl;
@ApiModelProperty("压缩密码")
private String zipPassword;
@ApiModelProperty("customerId")
private String customerId;

@ -2,19 +2,23 @@ package com.baiye.timed;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.config.properties.DeliveryProperties;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.modules.system.domain.*;
import com.baiye.modules.system.service.*;
import com.baiye.modules.system.domain.Company;
import com.baiye.modules.system.domain.PayFatherTemplate;
import com.baiye.modules.system.domain.TaskImei;
import com.baiye.modules.system.service.CompanyService;
import com.baiye.modules.system.service.DeliveryRecordService;
import com.baiye.modules.system.service.PayFatherTemplateService;
import com.baiye.modules.system.service.TaskImeiService;
import com.baiye.modules.system.service.dto.ImeiDTO;
import com.baiye.util.CSVFileUtil;
import com.baiye.util.MailUtil;
import com.baiye.util.*;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -25,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@ -36,10 +41,14 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class DeliveryBalanceTask {
private final RedisUtils redisUtils;
private final CompanyService companyService;
private final TaskImeiService taskImeiService;
private final DeliveryProperties deliveryProperties;
private final DeliveryRecordService deliveryRecordService;
@ -59,6 +68,7 @@ public class DeliveryBalanceTask {
for (Map.Entry<Long, List<TaskImei>> map : listMap.entrySet()) {
Long taskId = map.getKey();
List<TaskImei> list = listMap.get(taskId);
log.info("=================== the task Id as {},upload size as {} ====================", taskId, list.size());
Long userId = list.get(DefaultNumberConstants.ZERO_NUMBER).getUserId();
Company companyByUserId = companyService.findCompanyByUserId(userId);
if (ObjectUtil.isNotNull(companyByUserId)
@ -83,23 +93,36 @@ public class DeliveryBalanceTask {
continue;
}
String fileUrl = deliveryProperties.getFileUrl();
Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID);
// 转换DTO
List<ImeiDTO> toList = Convert.toList(ImeiDTO.class, taskImeiList);
String taskImeiName = IdUtil.fastUUID();
String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
Integer batch = ObjectUtil.isNull(num) ? DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
String taskImeiName = "BY".concat(StrPool.UNDERLINE).concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch));
String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName);
// 保存文件
String filePath = fileUrl.concat(StrPool.SLASH).concat(taskImeiName).concat(".csv");
CSVFileUtil.createCsvFile(toList, filePath);
String csvPath = file.concat(".csv");
CSVFileUtil.createCsvFile(toList, csvPath);
String zipPath = file.concat(".zip");
// 设置压缩文件
CompressUtil.decryptionCompression
(zipPath, csvPath, deliveryProperties.getZipPassword());
// 发送邮件
MailUtil.sendMail(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword(),
deliveryProperties.getToEmailAddress(), filePath,
deliveryProperties.getCustomerId(), taskImeiName);
deliveryProperties.getToEmailAddress(), zipPath, taskImeiName);
// 保存批次号
redisUtils.set(CacheKey.DMP_REQUEST_ID, batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS);
// 修改状态 修改余额
taskImeiService.updateBath(taskId, taskImeiName, DefaultNumberConstants.ONE_NUMBER);
deliveryRecordService.saveDeliveryRecord(filePath, taskImeiName, taskImeiList.size(), taskId, userId);
deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, taskImeiList.size(), taskId, userId);
companyService.updateUserBalanceByCompanyId(sub.doubleValue(), companyByUserId.getId());
// 删除文件
FileUtil.del(filePath);
FileUtil.del(csvPath);
FileUtil.del(zipPath);
log.info("=========================== the csv path as {}, zip path as {} ========================", csvPath, zipPath);
}
}
}

@ -173,11 +173,12 @@ debt:
platform:
authToken: JI8AeA7POKsdGcBC
zipPassword: DB2022hjk213v1...
fileUrl: /home/eladmin/mail/upload
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
toEmailAddress: ggggod_2022@outlook.com
customerId: QISX0xz4l6fR3YL2sUNSpzM2
toEmailAddress: ggggod_2022@outlook.com
# 巨量引擎配置
ocean:

@ -173,6 +173,7 @@ debt:
platform:
authToken: nqJpVSf3UcrEcVIH
zipPassword: DB2022hjk213v1...
fileUrl: /home/eladmin/mail/upload
emailAddress: ensoze@outlook.com
emailPassword: baiye2022

@ -37,6 +37,7 @@
<guava.version>23.0</guava.version>
<yauaa.version>5.23</yauaa.version>
<jjwt.version>0.11.1</jjwt.version>
<zip4j.version>1.3.2</zip4j.version>
<emoji.version>5.1.1</emoji.version>
<orika.version>1.5.4</orika.version>
<druid.version>1.1.24</druid.version>
@ -247,6 +248,12 @@
<artifactId>mail</artifactId>
<version>${mail.version}</version>
</dependency>
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>${zip4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

@ -14,6 +14,9 @@ import org.springframework.context.annotation.Configuration;
@ConfigurationProperties(prefix = "platform")
public class DeliveryProperties {
@ApiModelProperty("压缩密码")
private String zipPassword;
@ApiModelProperty("文件地址")
private String fileUrl;

@ -202,11 +202,7 @@ public class ClueController {
return clueService.reportClueStageAndTurnover(reportStageAndTurnoverDto);
}
@PostMapping("/dmp/exchange")
@ApiOperation("dmp资源兑换")
public CommonResponse<Object> dmpClueExchange() {
return clueService.dmpClueExchange();
}
@PostMapping("/count/memberStatus")
@ApiOperation("未分配线索的总条数")

@ -3,6 +3,10 @@ package com.baiye.module.dao;
import com.baiye.module.entity.DeliveryRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* @author Enzo
@ -15,5 +19,16 @@ public interface DeliveryRecordRepository extends JpaRepository<DeliveryRecord,
* @param taskName
* @return
*/
DeliveryRecord findByTaskName(String taskName);
@Query(value = "from DeliveryRecord where taskName = ?1 order by id desc ")
List<DeliveryRecord> findByTaskName(String taskName);
/**
*
* @param num
* @param taskName
* @return
*/
@Modifying
@Query("UPDATE DeliveryRecord d set d.status = ?1 where d.taskName = ?2")
int updateStatus(Integer num, String taskName);
}

@ -232,12 +232,6 @@ public interface ClueService {
*/
CommonResponse<Object> reportClueStageAndTurnover(ReportStageAndTurnoverDto reportStageAndTurnoverDto);
/**
* dmp
*
* @return
*/
CommonResponse<Object> dmpClueExchange();
/**
* 线
@ -249,12 +243,21 @@ public interface ClueService {
/**
*
*
* @param taskId
* @return
*/
Integer findTaskNum(Long taskId);
/**
* 线
*
* @param phoneList
* @param taskId
* @param userId
* @param num
*/
void saveClue(List<String> phoneList, Long taskId, Long userId, Integer num);
/**
* 线crm
*

@ -10,8 +10,16 @@ public interface DeliveryRecordService {
/**
*
* @param taskName taskName
* @return
*/
DeliveryRecord findByTaskName(String taskName);
/**
*
* @param num num
* @param taskName
* @return
*/
DeliveryRecord findByTaskName(String taskName);
Boolean updateStatusByTaskName(Integer num, String taskName);
}

@ -704,40 +704,6 @@ public class ClueServiceImpl implements ClueService {
return CommonResponse.createBySuccess(list);
}
@Override
@Transactional(rollbackFor = Exception.class)
public CommonResponse<Object> dmpClueExchange() {
/*//条件 任务id
Long taskId = null;
List<TaskImei> taskImeiList = taskImeiRepository.findAllByTaskId(taskId);
if (CollUtil.isNotEmpty(taskImeiList)) {
List<Clue> clues = new ArrayList<>();
//需要业务管理员用户id
Long userId = null;
for (TaskImei taskImei : taskImeiList) {
String imei = taskImei.getImei();
//TODO imei解密
String nid = "";
Clue clue = new Clue();
clue.setNid(nid);
clue.setOrigin(5);
clue.setCreateBy(userId);
clues.add(clue);
}
//将imei转为线索
saveClue(clues, taskId, DefaultNumberConstants.FOUR_NUMBER);
//修改任务总条数
Integer taskNum = clueMiddleRepository.findTaskNum(taskId);
Task task = new Task();
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(1);
taskClient.updateTask(task);
}
*/
return null;
}
@Override
public Map<Long, Integer> countClueByMemberStatus(ClueQueryCriteria clueQueryCriteria) {
@ -799,6 +765,7 @@ public class ClueServiceImpl implements ClueService {
taskClient.updateTask(task);
}
private List<HashMap<String, Object>> getOrganizeInfo(String startTime, String endTime, List<Long> organizeIds) {
List<ClueMiddle> clueMiddles = clueMiddleRepository.queryAllByTimeAndorganizeIds(startTime, endTime, organizeIds);
Set<Long> ids = clueMiddles.stream().map(ClueMiddle::getOrganizeId).collect(Collectors.toSet());
@ -1003,4 +970,32 @@ public class ClueServiceImpl implements ClueService {
}
return str;
}
@Override
public void saveClue(List<String> phoneList, Long taskId, Long userId, Integer num) {
if (CollUtil.isNotEmpty(phoneList)) {
for (String phone : phoneList) {
if (StringUtils.isNotBlank(phone)) {
boolean bool = MobileUtil.checkPhone(phone);
if (bool) {
Clue clue = new Clue();
clue.setNid(phone);
clue.setCreateBy(userId);
clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER);
Clue save = clueRepository.save(clue);
ClueMiddle clueMiddle = new ClueMiddle();
clueMiddle.setClueId(save.getId());
clueMiddle.setClueType(num);
clueMiddle.setTaskId(taskId);
clueMiddle.setClueStage(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setMemberStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setClueCallStatus(DefaultNumberConstants.ZERO_NUMBER);
clueMiddle.setOptimisticVersion(DefaultNumberConstants.ZERO_NUMBER);
clueMiddleRepository.save(clueMiddle);
}
}
}
}
}
}

@ -1,5 +1,7 @@
package com.baiye.module.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.module.dao.DeliveryRecordRepository;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.service.DeliveryRecordService;
@ -7,6 +9,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Enzo
* @date : 2022/10/22
@ -20,7 +24,18 @@ public class DeliveryRecordServiceImpl implements DeliveryRecordService {
@Override
public DeliveryRecord findByTaskName(String taskName) {
return deliveryRecordRepository.findByTaskName(taskName);
// 防止重复提交数据
List<DeliveryRecord> byTaskName =
deliveryRecordRepository.findByTaskName(taskName);
if (CollUtil.isNotEmpty(byTaskName)) {
return byTaskName.get(DefaultNumberConstants.ZERO_NUMBER);
}
return null;
}
@Override
public Boolean updateStatusByTaskName(Integer num, String taskName) {
return deliveryRecordRepository.updateStatus(num, taskName) > DefaultNumberConstants.ZERO_NUMBER;
}
}

@ -1,35 +1,43 @@
package com.baiye.task;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.text.csv.CsvData;
import cn.hutool.core.text.csv.CsvReader;
import cn.hutool.core.text.csv.CsvRow;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.config.properties.DeliveryProperties;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.feign.TaskClient;
import com.baiye.module.entity.Clue;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.entity.Task;
import com.baiye.module.service.ClueService;
import com.baiye.module.service.DeliveryRecordService;
import com.baiye.module.service.dto.SecretResponseBean;
import com.baiye.util.CompressUtil;
import com.baiye.util.DecryptPnoUtil;
import com.baiye.util.MailUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.mail.Flags;
import javax.mail.Message;
import java.util.Date;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;
import java.util.Objects;
/**
* @author Enzo
@ -49,58 +57,71 @@ public class MailSourceTask {
private final DeliveryRecordService deliveryRecordService;
@Scheduled(cron = "0 0/1 * * * ? ")
@Scheduled(cron = "0 0/10 * * * ? ")
@Transactional(rollbackFor = Exception.class)
public void receiveMail() {
// 获取邮件内容
List<Message> list = MailUtil.readMailByIMAP
(deliveryProperties.getEmailAddress(),
deliveryProperties.getEmailPassword());
(deliveryProperties.getEmailAddress(), deliveryProperties.getEmailPassword());
if (CollUtil.isNotEmpty(list)) {
try {
for (Message message : list) {
// 获取邮件的状态
Flags flags = message.getFlags();
// 获取未读的邮件内容 且与之对应
if (!flags.contains(Flags.Flag.SEEN)
&& deliveryProperties.getCustomerId().equals(message.getSubject())) {
String body = MailUtil.getBody(message);
// 获取文件内容
String taskName = body.substring
(body.indexOf(">") + DefaultNumberConstants.ONE_NUMBER);
if (!flags.contains(Flags.Flag.SEEN) &&
deliveryProperties.getToEmailAddress().equalsIgnoreCase
(MailUtil.getFrom((MimeMessage) message))) {
String taskName = message.getSubject();
// 内容获取发送请求
DeliveryRecord byTaskName =
deliveryRecordService.findByTaskName(taskName);
if (ObjectUtil.isNotNull(byTaskName)) {
DeliveryRecord byTaskName = deliveryRecordService.findByTaskName(taskName);
if (ObjectUtil.isNotNull(byTaskName)
&& byTaskName.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
Task task = new Task();
Long taskId = byTaskName.getTaskId();
CsvReader reader = CsvUtil.getReader();
List<Clue> clues = Lists.newArrayList();
List<String> phoneList = Lists.newArrayList();
List<String> decryptionList = Lists.newArrayList();
// 解析附件内容并保存文件
String path = MailUtil.saveAttachMent
(message, deliveryProperties.getFileUrl());
// 解压文件
String unzipPath =
CompressUtil.unzipFiles(deliveryProperties.getFileUrl(),
path, deliveryProperties.getZipPassword());
File file = new File(unzipPath);
File parseFile = Objects.requireNonNull
(file.listFiles())[DefaultNumberConstants.ZERO_NUMBER];
// 解析文件
CsvData data = reader.read(FileUtil.file(path));
List<CsvRow> rows = data.getRows();
for (CsvRow row : rows) {
Clue clue = new Clue();
clue.setNid(row.get(DefaultNumberConstants.ZERO_NUMBER));
clue.setOrigin(DefaultNumberConstants.FIVE_NUMBER);
clue.setCreateBy(byTaskName.getUserId());
clues.add(clue);
CsvData data = reader.read(parseFile);
data.getRows().forEach(clue -> decryptionList.add
(clue.get(DefaultNumberConstants.ZERO_NUMBER)));
List<List<String>> partitions = ListUtil.partition
(decryptionList, DefaultNumberConstants.TWO_HUNDRED);
for (List<String> partition : partitions) {
String join = Joiner.on(StrPool.COMMA).join(partition);
SecretResponseBean responseBean
= DecryptPnoUtil.batchDecryptPno(Base64.encode
(StringUtils.substringBeforeLast(join, StrPool.COMMA)));
String phoneStr = Base64.decodeStr(responseBean.getTels());
phoneList.addAll(Splitter.on(StrPool.COMMA).splitToList(phoneStr));
}
// 将imei转为线索
clueService.saveClue(clues, byTaskName.getTaskId(), DefaultNumberConstants.FOUR_NUMBER);
clueService.saveClue(phoneList, byTaskName.getTaskId(),
byTaskName.getUserId(), DefaultNumberConstants.FOUR_NUMBER);
// 修改任务总条数
Integer taskNum = clueService.findTaskNum(taskId);
task.setId(taskId);
task.setTotalNumber(taskNum);
task.setIsDistribution(DefaultNumberConstants.ONE_NUMBER);
// 删除邮件 删除文件
FileUtil.del(path);
FileUtil.del(unzipPath);
taskClient.updateTask(task);
// 删除邮件
message.setFlag(Flags.Flag.DELETED, Boolean.TRUE);
FileUtil.del(path);
deliveryRecordService.updateStatusByTaskName(DefaultNumberConstants.ONE_NUMBER, taskName);
}
}
}

@ -2,6 +2,7 @@ package com.baiye.util;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.Header;
@ -58,4 +59,33 @@ public class DecryptPnoUtil {
+ SecretConstant.SECRET_DECRYPT_YY_SIG
+ DateUtil.format(new Date(), SecretConstant.SECRET_DECRYPT_TIME_FORMATE));
}
/**
*
*
* @param origins
* @return
*/
public static SecretResponseBean batchDecryptPno(String origins) {
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("sig", createSig());
paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID);
paramMap.put("tels", origins);
//链式构建请求
String result = HttpRequest.post(SecretConstant.SECRET_DECRYPT_YY_URL)
.header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE)
.form(paramMap)
.timeout(2_000)
.execute().body();
Console.log(result);
// 解析响应内容
return JSONUtil.toBean(result, SecretResponseBean.class);
}
}

@ -80,8 +80,9 @@ save:
ThreadNamePrefix: SaveFileTaskExecutor-
platform:
zipPassword: DB2022hjk213v1...
fileUrl: /home/eladmin/mail/down
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
customerId: QISX0xz4l6fR3YL2sUNSpzM2
toEmailAddress: ggggod_2022@outlook.com

@ -80,7 +80,9 @@ save:
ThreadNamePrefix: SaveFileTaskExecutor-
platform:
zipPassword: DB2022hjk213v1...
fileUrl: /home/eladmin/mail/down
emailAddress: ensoze@outlook.com
emailPassword: baiye2022
customerId: QISX0xz4l6fR3YL2sUNSpzM2
toEmailAddress: ggggod_2022@outlook.com

Loading…
Cancel
Save