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 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 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 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 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 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 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 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 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); } }