package com.ots.project.monitor.job.task;
|
|
import cn.hutool.core.date.DateUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.ots.common.enums.SenderType;
|
import com.ots.common.enums.SendtaskStatus;
|
import com.ots.common.enums.SmsStatusEnum;
|
import com.ots.common.utils.bean.BeanUtils;
|
import com.ots.framework.web.service.ConfigService;
|
import com.ots.project.exam.domain.EntTestMember;
|
import com.ots.project.exam.domain.EntTestSendtask;
|
import com.ots.project.exam.domain.EntTestSendtaskMail;
|
import com.ots.project.exam.service.IEntTestSendtaskMailService;
|
import com.ots.project.exam.service.impl.EntTestMemberServiceImpl;
|
import com.ots.project.exam.service.impl.EntTestSendtaskServiceImpl;
|
import com.ots.project.tool.email.*;
|
import com.ots.project.tool.email.utils.BouncedUser;
|
import com.ots.project.tool.email.utils.DefaultConfigurer;
|
import com.ots.project.tool.email.utils.EmailUtil;
|
import com.ots.project.tool.sms.ResponseSms;
|
import com.ots.project.tool.sms.Returnsms;
|
import com.ots.project.tool.sms.ShortMessage;
|
import com.ots.project.tool.sms.Statusbox;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Arrays;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
import static com.ots.common.enums.SmsStatusEnum.*;
|
|
/**
|
* 邮件短信发送任务
|
*/
|
@Component("senderTask")
|
@Slf4j
|
public class SenderTask {
|
|
private static final String SMS_ZJCM = "SMS_ZJCM";
|
private static final String SMS_ZJCM_INTERNATIONAL = "SMS_ZJCM_INTERNATIONAL";
|
private static final String EMAIL_126 = "EMAIL_126";
|
@Autowired
|
EntTestSendtaskServiceImpl entTestSendtaskService;
|
@Autowired
|
EntTestMemberServiceImpl entTestMemberService;
|
@Autowired
|
ShortMessage shortMessage;
|
@Autowired
|
EmailMessage emailMessage;
|
@Autowired
|
IEntTestSendtaskMailService entTestSendtaskMailService;
|
|
@Autowired
|
private ConfigService configService;
|
|
public void senderTask(String type) {
|
EntTestSendtask testSendtask = new EntTestSendtask();
|
testSendtask.setStatus(SendtaskStatus.Untreated.getStatus());
|
testSendtask.setType(type);
|
List<EntTestSendtask> entTestSendtasks = entTestSendtaskService.selectEntTestSendtaskList(testSendtask);
|
if (SenderType.email.getType().equals(type)) {
|
//发送邮件
|
entTestSendtasks.stream().forEach(p -> sendEmail(p));
|
//邮件退信情况处理 异步
|
bounceStatusUpdate();
|
}
|
if (SenderType.sms.getType().equals(type)) {
|
//发送短信
|
entTestSendtasks.stream().forEach(p -> sendSms(p));
|
//短信下发状态跟进 异步
|
smsDeliveryStatus();
|
}
|
}
|
|
private void mailBounceInformationStorage(List<BouncedUser> bouncedUserList) {
|
try {
|
bouncedUserList.stream().forEach(user -> {
|
EntTestSendtaskMail mail = new EntTestSendtaskMail();
|
BeanUtils.copyProperties(user, mail);
|
mail.setCreateTime(new Date());
|
entTestSendtaskMailService.insertEntTestSendtaskMail(mail);
|
});
|
} catch (Exception e) {
|
log.error("记录退信信息失败:{}", e.getMessage(), e);
|
}
|
}
|
|
private void bounceStatusUpdate() {
|
String mailMode = configService.getKey("MailMode");
|
if (Objects.equals("RushMail", mailMode)) {
|
String rushMailRemoteUrl = configService.getKey("RushMailRemoteUrl");
|
SimpleMailSender sms = new SimpleMailSender();
|
RushMailResultCheck check = sms.mailResult(rushMailRemoteUrl + "mail/report", "rushmail", DateUtil.today());
|
if (Objects.nonNull(check.getData())) {
|
check.getData().stream().forEach(re -> {
|
String task_id = String.valueOf(re.get("task_id"));
|
String fail = String.valueOf(re.get("fail"));
|
String msg = String.valueOf(re.get("msg"));
|
String isOpen = String.valueOf(re.get("isOpen"));
|
if (!Objects.equals("0", fail)) {
|
EntTestSendtask entTestSendtask = new EntTestSendtask();
|
entTestSendtask.setRushtaskid(task_id);
|
List<EntTestSendtask> entTestSendtasks = entTestSendtaskService.selectEntTestSendtaskList(entTestSendtask);
|
if (Objects.nonNull(entTestSendtasks) && entTestSendtasks.size() > 0) {
|
EntTestSendtask task = entTestSendtasks.get(0);
|
if (Objects.equals("1", fail)) {
|
task.setStatus(invalid_address.getCode());
|
} else if (Objects.equals("2", fail)) {
|
task.setStatus(not_enough_space.getCode());
|
} else if (Objects.equals("3", fail)) {
|
task.setStatus(DISHONOR.getCode());
|
} else {
|
task.setStatus(SENDFAILD_3.getCode());
|
}
|
task.setMessage(msg);
|
entTestSendtaskService.updateEntTestSendtask(task);
|
}
|
}
|
if (Objects.equals("true", isOpen)) {
|
EntTestSendtask entTestSendtask = new EntTestSendtask();
|
entTestSendtask.setRushtaskid(task_id);
|
List<EntTestSendtask> entTestSendtasks = entTestSendtaskService.selectEntTestSendtaskList(entTestSendtask);
|
if (Objects.nonNull(entTestSendtasks) && entTestSendtasks.size() > 0) {
|
EntTestSendtask testSendtask = entTestSendtasks.get(0);
|
testSendtask.setStatus(ISOPEN.getCode());
|
testSendtask.setMessage(msg);
|
entTestSendtaskService.updateEntTestSendtask(testSendtask);
|
}
|
}
|
});
|
}
|
} else {
|
EmailUtil eu = new EmailUtil(EmailMessageImpl.userName, EmailMessageImpl.password);
|
List<BouncedUser> bouncedUserList = eu.receiveMail(DefaultConfigurer.getIMAP(), "imap");// imap收信
|
//邮件退信数据入库
|
mailBounceInformationStorage(bouncedUserList);
|
bouncedUserList.stream().forEach(user -> {
|
EntTestSendtask entTestSendtask = new EntTestSendtask();
|
String content = user.getContent();
|
String substring = content.substring(content.indexOf("收件人邮件地址(") + "收件人邮件地址(".length(), content.indexOf(")不存在,邮件无法送达"));
|
entTestSendtask.setAddressee(substring);
|
entTestSendtask.setSendExtendTime(user.getSentDateExtend());
|
entTestSendtask.setType("email");
|
List<EntTestSendtask> sendtasks = entTestSendtaskService.selectEntTestSendtaskList(entTestSendtask);
|
sendtasks.stream().forEach(obj -> {
|
obj.setStatus(RET_4.getCode());
|
obj.setMessage(user.getReason());
|
entTestSendtaskService.updateEntTestSendtask(obj);
|
});
|
});
|
}
|
}
|
|
public static void main(String[] args) {
|
String str = "12321231232131 nihaodfdfdl 收件人邮件地址(ljhua@bydq.com.cn)不存在,邮件无法送达。 ";
|
String substring = str.substring(str.indexOf("收件人邮件地址(") + "收件人邮件地址(".length(), str.indexOf(")不存在,邮件无法送达"));
|
System.out.println(substring);
|
}
|
|
private void smsDeliveryStatus() {
|
List<Statusbox> statusboxList = shortMessage.getReport();
|
if (Objects.isNull(statusboxList) || statusboxList.size() == 0) {
|
return;
|
}
|
System.out.println(JSON.toJSON(statusboxList));
|
for (int i = 0; i < statusboxList.size(); i++) {
|
Statusbox statusbox = statusboxList.get(i);
|
if (Objects.equals(statusbox.getStatus(), "20")) {
|
String taskid = statusbox.getTaskid();
|
EntTestSendtask entTestSendtask = new EntTestSendtask();
|
entTestSendtask.setTaskId(taskid);
|
List<EntTestSendtask> sendtasks = entTestSendtaskService.selectEntTestSendtaskList(entTestSendtask);
|
sendtasks.stream().forEach(obj -> {
|
obj.setStatus(RET_4.getCode());
|
obj.setMessage(statusbox.getErrorcode());
|
entTestSendtaskService.updateEntTestSendtask(obj);
|
});
|
}
|
}
|
}
|
|
/**
|
* 发邮件
|
*
|
* @param testSendtask
|
*/
|
public void sendEmail(EntTestSendtask testSendtask) {
|
if (Objects.equals(EMAIL_126, testSendtask.getPlatform())) {
|
RushMailResult result = emailMessage.sendEmail(testSendtask.getAddressee(), testSendtask.getTitle(), testSendtask.getContent());
|
if (result.isResult()) {
|
testSendtask.setStatus(SmsStatusEnum.issent_1.getCode());
|
testSendtask.setSendTime(new Date());
|
if (Objects.nonNull(result.getData()) && Objects.nonNull(result.getData().get("taskid"))) {
|
testSendtask.setRushtaskid(String.valueOf(result.getData().get("taskid")));
|
}
|
} else {
|
testSendtask.setStatus(SENDFAILD_3.getCode());
|
testSendtask.setMessage(result.getMessage());
|
}
|
} else {
|
testSendtask.setStatus(RET_4.getCode());
|
testSendtask.setMessage(testSendtask.getPlatform() + "邮箱平台未注册");
|
}
|
EntTestMember entTestMember = entTestMemberService.selectEntTestMemberById(testSendtask.getMemberId());
|
entTestMember.setEmailStatus(testSendtask.getStatus());
|
entTestMember.setEmailTime(new Date());
|
entTestMemberService.updateEntTestMember(entTestMember);
|
entTestSendtaskService.updateEntTestSendtask(testSendtask);
|
}
|
|
/**
|
* 发短信
|
*
|
* @param testSendtask
|
*/
|
public void sendSms(EntTestSendtask testSendtask) {
|
if (Objects.equals(SMS_ZJCM, testSendtask.getPlatform())) {
|
Returnsms returnsms = shortMessage.sendSms(Arrays.asList(testSendtask.getAddressee()), "【TAI测评】", testSendtask.getContent());
|
if (Objects.equals(Returnsms.RET_SUCCESS, returnsms.getReturnstatus())) {
|
log.debug("{}【短信发送成功!】", testSendtask.getAddressee());
|
testSendtask.setStatus(SmsStatusEnum.issent_1.getCode());
|
testSendtask.setNumber(Long.parseLong(returnsms.getSuccessCounts()));
|
testSendtask.setMessage("短信发送成功");
|
String taskId = returnsms.getTaskID();
|
if (Objects.nonNull(taskId)) {
|
testSendtask.setTaskId(taskId);
|
}
|
} else {
|
log.error("{}【短信发送失败!】: {}", testSendtask.getAddressee(), returnsms.getMessage());
|
testSendtask.setStatus(SENDFAILD_3.getCode());
|
testSendtask.setMessage(returnsms.getMessage());
|
}
|
} else if (Objects.equals(SMS_ZJCM_INTERNATIONAL, testSendtask.getPlatform())) {
|
ResponseSms responseSms = shortMessage.sendInternationalSms(Arrays.asList(testSendtask.getAddressee()), testSendtask.getContent());
|
if (Objects.equals(ResponseSms.Mterrcode.RET_000.getCode(), responseSms.getMterrcode())) {
|
log.debug("{}【国际短信发送成功!】", testSendtask.getAddressee());
|
testSendtask.setStatus(SmsStatusEnum.issent_1.getCode());
|
testSendtask.setNumber(new Long(1));
|
testSendtask.setMessage("国际短信发送成功");
|
} else {
|
log.error("{}【短信发送失败!】: {}", testSendtask.getAddressee(), responseSms.getMterrcode());
|
testSendtask.setStatus(SENDFAILD_3.getCode());
|
testSendtask.setMessage(responseSms.getMterrcode());
|
}
|
} else {
|
testSendtask.setStatus(RET_4.getCode());
|
testSendtask.setMessage(testSendtask.getPlatform() + "短信平台未注册");
|
}
|
EntTestMember entTestMember = entTestMemberService.selectEntTestMemberById(testSendtask.getMemberId());
|
entTestMember.setSmsStatus(testSendtask.getStatus());
|
entTestMember.setSmsTime(new Date());
|
entTestMemberService.updateEntTestMember(entTestMember);
|
entTestSendtaskService.updateEntTestSendtask(testSendtask);
|
}
|
}
|