Java短信邮箱消息发送从零开始,一篇解决一切乌漆嘛黑的问题
廢話不多說,直接開干
項目框架采用spring boot
Conteller層:
public PlainResult<Boolean> messageSend(@RequestBody SendMessageRequest sendMessageRequest) { return messageSendService.messageSend(sendMessageRequest); }
請求體入參:SendMessageRequest對象
public class SendMessageRequest {private SendMessageMRequest sendMessageMRequest;//郵箱private SendMessagePRequest sendMessagePRequest;//手機 }請求體入參之手機對象:SendMessagePRequest
//根據個人需求,有些字段可能不需要
public class SendMessagePRequest {
}
請求體入參之手機對象:SendMessageMRequest
//根據個人需求,有些字段可能不需要
public class SendMessageMRequest {
}
Service層:
public PlainResult<Boolean> messageSend(SendMessageRequest sendMessageRequest) {SendMessageMRequest sendMessageMRequest = sendMessageRequest.getSendMessageMRequest();SendMessagePRequest sendMessagePRequest = sendMessageRequest.getSendMessagePRequest();// 參數判斷if (sendMessageMRequest.getTemplateName() == null && CollUtil.isEmpty(sendMessageMRequest.getReceivers())&& sendMessagePRequest.getTemplateName() == null && CollUtil.isEmpty(sendMessagePRequest.getReceivers())) {throw new McException(MessageExceptionEnum.PARAM_ERROR.getCode(), "短信模板名稱與接收方均不能為空");}if (sendMessagePRequest.getTemplateName() != null && CollUtil.isEmpty(sendMessagePRequest.getReceivers())) {throw new McException(MessageExceptionEnum.PARAM_ERROR.getCode(), "接收方手機號不能為空");}if (sendMessagePRequest.getTemplateName() == null && CollUtil.isNotEmpty(sendMessagePRequest.getReceivers())) {throw new McException(MessageExceptionEnum.PARAM_ERROR.getCode(), "短信模板名稱不能為空");}if (sendMessageMRequest.getTemplateName() != null && CollUtil.isEmpty(sendMessageMRequest.getReceivers())) {throw new McException(MessageExceptionEnum.PARAM_ERROR.getCode(), "接收方郵箱不能為空");}if (sendMessageMRequest.getTemplateName() == null && CollUtil.isNotEmpty(sendMessageMRequest.getReceivers())) {throw new McException(MessageExceptionEnum.PARAM_ERROR.getCode(), "短信模板名稱不能為空");}//存在手機號發短信if (CollUtil.isNotEmpty(sendMessagePRequest.getReceivers())) {Arguments.strIsNull(sendMessagePRequest.getBizName(), "業務類型不能為空");messagePSend(sendMessagePRequest);}//存在郵箱發郵件if (CollUtil.isNotEmpty(sendMessageMRequest.getReceivers())) {Arguments.strIsNull(sendMessageMRequest.getBizName(), "業務類型不能為空");Boolean messageMSendResult = messageMSend(sendMessageMRequest);log.info("郵箱消息發送響應:response = {}", messageMSendResult);}return PlainResult.successResult(Boolean.TRUE);}繼續擼,messagePSend --手機發送短信
public Boolean messagePSend(SendMessagePRequest sendMessagePRequest) {//一次插入不能超過1000 TOTAL=1000if (sendMessagePRequest.getReceivers().size() > TOTAL) {throw new McException(SMS_RECEIVER_TOO_MANY);}if (sendMessagePRequest.getIsMarketSms() == 0) {Boolean messagePSendResult = PsendResult(sendMessagePRequest);log.info("手機短信發送響應:response = {}", messagePSendResult);}if (sendMessagePRequest.getIsMarketSms() == 1) {Boolean messagePSendResult = PYXsendResult(sendMessagePRequest);log.info("手機營銷短信發送響應:response = {}", messagePSendResult);}return Boolean.TRUE;}手機發送普通短信:PsendResult
public Boolean PsendResult(SendMessagePRequest sendMessagePRequest) {//校驗模板McTemplate mcTemplate = mcTemplateMapper.selectOne(new QueryWrapper<McTemplate>().eq(McTemplate.NAME, sendMessagePRequest.getTemplateName()).eq(McTemplate.STATUS, 1).eq(McTemplate.IS_DELETED, 0).last("limit 1"));Arguments.objIsNull(mcTemplate, "該模板不存在");//發短信還是發郵件message,傳入誰,走send(誰);Message message = MessageContext.getInstance(sendMessagePRequest.getMessageType());//構建短信對象String receivers = Joiners.COMMA.join(sendMessagePRequest.getReceivers());MessageRequest messageRequest = new MessageRequest();messageRequest.setBizName(sendMessagePRequest.getBizName());messageRequest.setReceiver(receivers);messageRequest.setTemplateName(sendMessagePRequest.getTemplateName());messageRequest.setType(sendMessagePRequest.getMessageType());messageRequest.setIsMarketSms(MarketSmsTypeEnum.NO.getType());//先入庫,狀態為未發送,在發短信,狀態為已經發送System.out.println("發送前messageRequest:" + messageRequest);webMessageService.record(messageRequest, mcTemplate);//依據type類型選擇郵箱或者短信發送,短信發送類型有營銷短信和普通短信//定時發送短信,這個還沒有寫,Boolean result = message.send(messageRequest, mcTemplate);//短信發送異常直接拋出錯誤if (!result && MessageTypeEnum.SMS_MESSAGE.getCode().equals(messageRequest.getType())) {throw new McException(MessageExceptionEnum.SMS_SEND_ERROR);}//短信發送完畢,更改狀態webMessageService.recordOut(messageRequest, mcTemplate);return Boolean.TRUE;}先將待發短信插入數據庫,然后去數據庫尋找statue=未發送的短信,進行發送
record()—入庫
//入庫后開始依據個人的需求發送短信
message.send(messageRequest, mcTemplate);
發短信 sendSms(smsParam);
private Boolean sendSms(SmsParam smsParam) {try {Map<String, Object> paramMap = new LinkedHashMap<>();// 發送內容paramMap.put("content", zxSmsConfig.getSignature() + FormatUtils.formatTemplate(smsParam.getContent(), smsParam.getTemplateMaps()));// 短信接收方paramMap.put("mobile", smsParam.getPhone());// 密碼paramMap.put("pwd", SecureUtil.md5(zxSmsConfig.getPwd()).toUpperCase());// 用戶名paramMap.put("username", zxSmsConfig.getUsername());// 定義加密的數據StringBuilder sb = new StringBuilder();// 獲取簽名認證參數String data = sb.append("content").append("=").append(paramMap.get("content")).append("&").append("mobile").append("=").append(paramMap.get("mobile")).append("&").append("pwd").append("=").append(paramMap.get("pwd")).append("&").append("username").append("=").append(paramMap.get("username")).toString();// 簽名認證參數paramMap.put("tempsign", SecureUtil.sha256(data).toUpperCase());String post = HttpUtil.post(zxSmsConfig.getUrl(), paramMap);log.info("短信發送響應:response = {}", post);ZXSmsResponse response = JSONUtil.toBean(post, ZXSmsResponse.class);if (!"0".equals(response.getCode())) {log.info("短信發送異常:errorMsg = {}", response.getCodeInfo());return Boolean.FALSE;}} catch (Exception e) {log.error("短信發送失敗:smsParam = {}", smsParam);e.printStackTrace();return false;}return true;} }短信發送完畢后,再次回到**PsendResult(SendMessagePRequest sendMessagePRequest)**執行更新短信發送狀態satue為已經發送
public void recordOut(MessageRequest messageRequest, McTemplate mcTemplate) {executor.execute(() -> {List<String> lists = Splitters.splitToString(messageRequest.getReceiver(), Splitters.COMMA);if (CollectionUtil.isNotEmpty(lists)) {McMessageLog messageLog = new McMessageLog();messageLog.setStatus(EmailStatusTypeEnum.SUCCESS_SEND.getStatus());//已經發送的狀態for (String list : lists) {// 執行成功后寫入日志表 UPDATE log SET status=? WHERE statue = and receive=LambdaQueryWrapper<McMessageLog> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(McMessageLog::getStatus, EmailStatusTypeEnum.WAIT_SEND.getStatus());queryWrapper.eq(McMessageLog::getReceiver, list);// 更新狀態if (1 != mcMessageLogMapper.update(messageLog, queryWrapper)) {log.error("短信日志修改失敗data = {}", messageLog);}}}});}發郵箱后面附上,,,,未完待續
繼續干
完成發郵件
/*** 核對模板及郵箱發送** @return*/public Boolean MsendResult(SendMessageMRequest sendMessageMRequest) {//校驗模板McTemplate mcTemplate = mcTemplateMapper.selectOne(new QueryWrapper<McTemplate>().eq(McTemplate.NAME, sendMessageMRequest.getTemplateName()).eq(McTemplate.STATUS, 1).eq(McTemplate.IS_DELETED, 0).last("limit 1"));Arguments.objIsNull(mcTemplate, "該模板不存在");//構建短信對象String receivers = Joiners.COMMA.join(sendMessageMRequest.getReceivers());//依據type類型選擇郵箱發送EmailParam emailParam = new EmailParam();emailParam.setContent(mcTemplate.getContent());emailParam.setTitle(sendMessageMRequest.getTemplateName());emailParam.setEmails(receivers);//插入數據庫郵件日志executor.execute(() -> {List<String> lists = Splitters.splitToString(receivers, Splitters.COMMA);if (CollectionUtil.isNotEmpty(lists)) {McMailJob mcMailJob = new McMailJob();mcMailJob.setTemplateName(FormatUtils.formatTemplate(mcTemplate.getContent(), sendMessageMRequest.getTemplateParams()));mcMailJob.setStatus(SMSStatusTypeEnum.WAIT_SEND.getStatus());//未發送for (String list : lists) {// 執行成功后寫入日志表mcMailJob.setEmail(list);System.out.println(mcMailJobMapper.insert(mcMailJob)+"333");// 數據寫入if (1 != mcMailJobMapper.insert(mcMailJob)) {log.error("短信日志寫入失敗data = {}", mcMailJob);}}}});//發送郵件Boolean result = emailMarketService.send(emailParam);//郵箱發送異常直接拋出錯誤if (!result) {throw new McException(MessageExceptionEnum.EMAIL_SEND_ERROR);}//更新郵件日志表狀態為已經發送webMessageService.record(messageRequest, mcTemplate);return Boolean.TRUE;}郵件對象:
public class EmailParam {/*** 郵件(多個手機號使用逗號隔開)*/private String emails;/*** 標題*/private String title;/*** 內容*/private String content;/*** 附件*/private File file;}郵件發送方法 send()
public Boolean send(EmailParam emailParam) {if (null == emailParam.getEmails()) {log.info("郵件接收人為空,request = {}", emailParam);return true;}List<String> mailUsers = Splitter.on(",").omitEmptyStrings().splitToList(emailParam.getEmails());if (CollectionUtil.isEmpty(mailUsers)) {return true;}// 最多一次發送40個Arguments.isTrue(mailUsers.size() > MAX_TOTAL, "郵件接收方最多40個");mailUsers.forEach(mall -> Arguments.isTrue(!Validator.isEmail(mall), "郵箱格式有誤" + mall));//密送if (null != emailParam.getFile()) {//package cn.hutool.extra.mail; ----MailUtil.sendMailUtil.send(Lists.newArrayList(), null, mailUsers, emailParam.getTitle(), emailParam.getContent(), true, emailParam.getFile());// 刪除文件emailParam.getFile().delete();} else {MailUtil.send(Lists.newArrayList(), null, mailUsers, emailParam.getTitle(), emailParam.getContent(), true);}log.info("郵箱消息發送成功");return true;}總結
以上是生活随笔為你收集整理的Java短信邮箱消息发送从零开始,一篇解决一切乌漆嘛黑的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac 安装使用 OpenCV 图像处理
- 下一篇: java实践课程感想_Java课程总结与