日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java短信邮箱消息发送从零开始,一篇解决一切乌漆嘛黑的问题

發布時間:2023/12/20 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 {

/*** 消息類型(1-短信)* {@link MessageTypeEnum}*/ private Integer messageType;/*** 業務類型*/ private String bizName;/*** 批次號*/ private String batchNo;/*** 接收方手機號*/ private List<String> receivers;/*** 模板名字*/ private String templateName;/*** 模版填充參數*/ private Map<String, String> templateParams;/*** 是否營銷短信,0:不是,1:是,(不同的短信類型發送內容不一樣)*/ private Integer isMarketSms;/*** 擴展字段(如:短信里會有文字短信或語音短信)* {@link MessageExtendConstant}*/ private Map<String, String> extendParams;

}
請求體入參之手機對象:SendMessageMRequest
//根據個人需求,有些字段可能不需要
public class SendMessageMRequest {

/*** 消息類型(2-郵箱)* {@link MessageTypeEnum}*/ private Integer messageType;/*** 業務類型*/ private String bizName;/*** 批次號*/ private String batchNo;/*** 接收方郵箱*/ private List<String> receivers;/*** 模板名字*/ private String templateName;/*** 模版填充參數*/ private Map<String, String> templateParams;/*** 擴展字段(如:短信里會有文字短信或語音短信)* {@link MessageExtendConstant}*/ private Map<String, String> extendParams;

}

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()—入庫

public void record(MessageRequest messageRequest, McTemplate mcTemplate) {executor.execute(() -> {List<String> lists = Splitters.splitToString(messageRequest.getReceiver(), Splitters.COMMA);if (CollectionUtil.isNotEmpty(lists)) {McMessageLog messageLog = new McMessageLog();messageLog.setBizName(messageRequest.getBizName());messageLog.setTemplateName(messageRequest.getTemplateName());messageLog.setMessageType(messageRequest.getType());messageLog.setMessageContent(FormatUtils.formatTemplate(mcTemplate.getContent(), messageRequest.getTemplateParams()));messageLog.setBatchNo(DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN) + "-" + messageRequest.getTemplateName());messageLog.setStatus(EmailStatusTypeEnum.WAIT_SEND.getStatus());//未發送messageLog.setIsMarketSms(messageRequest.getIsMarketSms());for (String list : lists) {// 執行成功后寫入日志表messageLog.setReceiver(list);// 數據寫入if (1 != mcMessageLogMapper.insert(messageLog)) {log.error("短信日志寫入失敗data = {}", messageLog);}}}});}

//入庫后開始依據個人的需求發送短信
message.send(messageRequest, mcTemplate);

public Boolean send(MessageRequest messageRequest, McTemplate mcTemplate) {// 驗證短信參數是否正確String param = mcTemplate.getParam();Map<String, Object> map = JSONUtil.parseObj(param);// 模版參數key集合Set<String> origKey = map.keySet();// 傳參key集合Map<String, String> templateParams = messageRequest.getTemplateParams();Set<String> paramKey = null == templateParams ? new HashSet<>() : templateParams.keySet();Collection<String> intersection = CollectionUtil.intersection(origKey, paramKey);// 參數有誤if (intersection.size() != origKey.size()) {log.error("參數有誤paramKey = {},origKey = {}", paramKey, origKey);throw new McException(MessageExceptionEnum.TEMPLATE_PARAM_WRONG);}// 參數無誤,繼續執行// 查詢該模版的模版idMap<String, Object> extraMap = JSONUtil.parseObj(mcTemplate.getExtraInfo());String templateId = (String) extraMap.get(TemplateConstant.TEMPLATE_ID); // if (StrUtil.isNotEmpty(templateId)) {// 判斷是文字短信還是語音短信// 默認文字短信String smsType = SmsTypeEnum.TEXT.getCode();// 查詢擴展參數不為空替換Map<String, String> extendParams = messageRequest.getExtendParams();if (null != extendParams) {String code = extendParams.get(MessageExtendConstant.SMS_TYPE);if (StrUtil.isNotBlank(code) && SmsTypeEnum.isExists(code)) {smsType = code;}}// 判斷發送什么類型的短信if (smsType.endsWith(SmsTypeEnum.VOICE.getCode())) {// TODO 語音短信log.info("發送語音短信");}if (smsType.endsWith(SmsTypeEnum.TEXT.getCode())) {// TODO 文字短信log.info("發送文字短信");SmsParam smsParam = SmsParam.builder().phone(messageRequest.getReceiver()).templateId(templateId).content(mcTemplate.getContent()).templateMaps(templateParams).build();return sendSms(smsParam); // return sendSms(new SmsParam(messageRequest.getReceiver(), templateId, messageRequest.getTemplateParams()));} // }return true;}

發短信 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短信邮箱消息发送从零开始,一篇解决一切乌漆嘛黑的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。