mirror of
https://gitee.com/dromara/sms4j.git
synced 2025-12-06 17:08:40 +08:00
Merge branch 'dev-3.0.x' into oa-plugin
This commit is contained in:
commit
1214672d4d
@ -139,7 +139,7 @@ sms:
|
||||
1. Fork 本仓库
|
||||
2. 新建 Feat_xxx 分支
|
||||
3. 提交代码
|
||||
4. 新建 Pull Request 到 dev-3.x 分支
|
||||
4. 新建 Pull Request 到 dev-3.0.x 分支
|
||||
```
|
||||
## 贡献原则
|
||||
- 我们原则上欢迎任何人为sms4j添加加瓦贡献代码
|
||||
|
||||
4
pom.xml
4
pom.xml
@ -57,10 +57,10 @@
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<spring.boot.version>2.7.18</spring.boot.version>
|
||||
<solon.version>2.5.4</solon.version>
|
||||
<solon.version>2.6.5</solon.version>
|
||||
<redisson.version>3.17.0</redisson.version>
|
||||
<jdcloud.version>1.3.3</jdcloud.version>
|
||||
<hutool.version>5.8.24</hutool.version>
|
||||
<hutool.version>5.8.25</hutool.version>
|
||||
<xmlblend.version>2.3.0</xmlblend.version>
|
||||
<activation.version>1.1.1</activation.version>
|
||||
<mail.version>1.6.2</mail.version>
|
||||
|
||||
@ -26,6 +26,11 @@ public class MailSmtpConfig {
|
||||
* */
|
||||
private String fromAddress;
|
||||
|
||||
/**
|
||||
* 发送人昵称
|
||||
* */
|
||||
private String nickName;
|
||||
|
||||
/**
|
||||
* 服务器地址
|
||||
* */
|
||||
@ -45,23 +50,23 @@ public class MailSmtpConfig {
|
||||
* 是否开启ssl 默认开启
|
||||
* */
|
||||
@Builder.Default
|
||||
private String isSSL = "true";
|
||||
private final String isSSL = "true";
|
||||
|
||||
/**
|
||||
* 是否开启验证 默认开启
|
||||
* */
|
||||
@Builder.Default
|
||||
private String isAuth = "true";
|
||||
private final String isAuth = "true";
|
||||
|
||||
/**
|
||||
* 重试间隔(单位:秒),默认为5秒
|
||||
*/
|
||||
@Builder.Default
|
||||
private int retryInterval = 5;
|
||||
private final int retryInterval = 5;
|
||||
|
||||
/**
|
||||
* 重试次数,默认为1次
|
||||
*/
|
||||
@Builder.Default
|
||||
private int maxRetries = 1;
|
||||
private final int maxRetries = 1;
|
||||
}
|
||||
|
||||
@ -22,8 +22,6 @@ import java.util.Objects;
|
||||
**/
|
||||
public final class HtmlUtil {
|
||||
|
||||
private static final HtmlUtil htmlUtil = new HtmlUtil();
|
||||
|
||||
private HtmlUtil() {
|
||||
}
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ import java.util.Map;
|
||||
**/
|
||||
public class MonitorFactory {
|
||||
|
||||
private final static Map<String, MonitorService> services = new HashMap<>();
|
||||
private final static Map<String, MonitorService> SERVICES = new HashMap<>();
|
||||
|
||||
/**
|
||||
* put
|
||||
@ -30,7 +30,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void put(String key, MailImapConfig config, Monitor monitor){
|
||||
services.put(key,new MonitorService(config,monitor));
|
||||
SERVICES.put(key,new MonitorService(config,monitor));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -40,7 +40,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void start(String key){
|
||||
services.get(key).start();
|
||||
SERVICES.get(key).start();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -50,7 +50,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void stop(String key){
|
||||
services.get(key).stop();
|
||||
SERVICES.get(key).stop();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -60,6 +60,6 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static MailImapConfig getConfig(String key) {
|
||||
return services.get(key).getMailImapConfig();
|
||||
return SERVICES.get(key).getMailImapConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.email.core.service;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.Data;
|
||||
import org.dromara.email.api.Blacklist;
|
||||
import org.dromara.email.api.MailClient;
|
||||
@ -15,6 +16,7 @@ import javax.mail.Session;
|
||||
import javax.mail.internet.AddressException;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@ -43,12 +45,21 @@ public class MailBuild {
|
||||
props.put("mail.smtp.ssl.enable", config.getIsSSL());
|
||||
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
|
||||
this.session = Session.getInstance(props, new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(config.getUsername(), config.getPassword());
|
||||
}
|
||||
});
|
||||
this.message = new MimeMessage(session);
|
||||
try {
|
||||
if (StrUtil.isEmpty(config.getNickName())){
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress()));
|
||||
}else {
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new MailException(e);
|
||||
}
|
||||
this.config = config;
|
||||
this.retryInterval = config.getRetryInterval();
|
||||
this.maxRetries = config.getMaxRetries();
|
||||
@ -63,12 +74,21 @@ public class MailBuild {
|
||||
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
|
||||
this.session = Session.getInstance(props,
|
||||
new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(config.getUsername(), config.getPassword());
|
||||
}
|
||||
});
|
||||
this.message = new MimeMessage(session);
|
||||
try {
|
||||
if (StrUtil.isEmpty(config.getNickName())){
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress()));
|
||||
}else {
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new MailException(e);
|
||||
}
|
||||
this.config = config;
|
||||
this.blacklist = blacklist;
|
||||
this.retryInterval = config.getRetryInterval();
|
||||
@ -94,8 +114,9 @@ public class MailBuild {
|
||||
if (Objects.isNull(blacklist)) {
|
||||
return InternetAddress.parse(Objects.requireNonNull(CollUtil.join(source, ",")));
|
||||
}
|
||||
for (String s : blacklist.getBlacklist()) {
|
||||
if (!source.contains(s)) {
|
||||
List<String> black = blacklist.getBlacklist();
|
||||
for (String s : source) {
|
||||
if (!black.contains(s)) {
|
||||
list.add(s);
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,8 +34,8 @@ import java.util.logging.Logger;
|
||||
|
||||
public class MailService implements MailClient {
|
||||
|
||||
private static Logger logger = Logger.getLogger("mailLog");
|
||||
private MailBuild mailBuild;
|
||||
private static final Logger logger = Logger.getLogger("mailLog");
|
||||
private final MailBuild mailBuild;
|
||||
|
||||
private MailService(MailBuild mailBuild) {
|
||||
this.mailBuild = mailBuild;
|
||||
@ -137,7 +137,8 @@ public class MailService implements MailClient {
|
||||
List<String> cc,
|
||||
List<String> bcc) {
|
||||
int maxRetries = mailBuild.getMaxRetries();
|
||||
int retryCount = 1; // 初始值为1;则while循环中少发送一次,最后一次发送在判断 retryCount >= maxRetries 这里。
|
||||
// 初始值为1;则while循环中少发送一次,最后一次发送在判断 retryCount >= maxRetries 这里。
|
||||
int retryCount = 1;
|
||||
boolean retryOnFailure = true;
|
||||
|
||||
while (retryOnFailure && retryCount < maxRetries) {
|
||||
@ -150,7 +151,8 @@ public class MailService implements MailClient {
|
||||
message = messageBuild(mailAddress, title, body, null, null, zipName, cc, bcc, files);
|
||||
}
|
||||
Transport.send(message);
|
||||
retryOnFailure = false; // 发送成功,停止重试
|
||||
// 发送成功,停止重试
|
||||
retryOnFailure = false;
|
||||
} catch (MessagingException | IOException e) {
|
||||
retryCount++;
|
||||
try {
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.dromara.email.core.service;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.dromara.email.api.Monitor;
|
||||
import org.dromara.email.comm.config.MailImapConfig;
|
||||
import org.dromara.email.comm.entity.MonitorMessage;
|
||||
@ -32,6 +33,7 @@ import java.util.TimerTask;
|
||||
public class MonitorService{
|
||||
private final Store store;
|
||||
private Monitor monitor;
|
||||
@Getter
|
||||
private MailImapConfig mailImapConfig;
|
||||
private Timer timer;
|
||||
|
||||
@ -127,7 +129,4 @@ public class MonitorService{
|
||||
timer.cancel();
|
||||
}
|
||||
|
||||
public MailImapConfig getMailImapConfig() {
|
||||
return mailImapConfig;
|
||||
}
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import java.util.List;
|
||||
* @since 2023/10/27 13:03
|
||||
*/
|
||||
public interface CoreMethodProcessor extends SmsProcessor {
|
||||
@Override
|
||||
default Object[] preProcessor(Method method, Object source, Object[] param) {
|
||||
String name = method.getName();
|
||||
int parameterCount = method.getParameterCount();
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
package org.dromara.sms4j.api.proxy;
|
||||
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
/**
|
||||
* 执行器接口
|
||||
@ -18,7 +17,7 @@ public interface SmsProcessor extends Order {
|
||||
return null;
|
||||
}
|
||||
|
||||
default Object exceptionHandleProcessor(Method method, Object source, Object[] param,Exception exception) throws InvocationTargetException, IllegalAccessException {
|
||||
default Object exceptionHandleProcessor(Method method, Object source, Object[] param,Exception exception) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
package org.dromara.sms4j.comm.constant;
|
||||
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* NumberOfParasmeters
|
||||
* <p> 重载方法的参数个数
|
||||
@ -8,6 +11,8 @@ package org.dromara.sms4j.comm.constant;
|
||||
* @author :sh1yu
|
||||
* 2023/11/01 19:33
|
||||
**/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum NumberOfParasmeters {
|
||||
//一个参数
|
||||
ONE(1),
|
||||
@ -15,11 +20,7 @@ public enum NumberOfParasmeters {
|
||||
TWO(2),
|
||||
//三个参数
|
||||
THREE(3);
|
||||
private int code;
|
||||
|
||||
NumberOfParasmeters(int code) {
|
||||
this.code = code;
|
||||
}
|
||||
private final int code;
|
||||
|
||||
public static NumberOfParasmeters getNumberOfParasmetersEnum(int index) {
|
||||
switch (index) {
|
||||
@ -29,7 +30,10 @@ public enum NumberOfParasmeters {
|
||||
return NumberOfParasmeters.TWO;
|
||||
case 3:
|
||||
return NumberOfParasmeters.THREE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
throw new IllegalArgumentException("building enum NumberOfParasmeters error,param not match");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -59,5 +59,6 @@ public abstract class SupplierConstant {
|
||||
* 鼎众
|
||||
*/
|
||||
public static final String DINGZHONG = "dingzhong";
|
||||
public static final String QINIU = "qiniu";
|
||||
|
||||
}
|
||||
|
||||
@ -6,8 +6,13 @@ import java.util.TimerTask;
|
||||
|
||||
@Data
|
||||
public class Task {
|
||||
|
||||
private TimerTask runnable;//描述要执行的任务
|
||||
private Long time;//什么时间执行,用时间戳来表示
|
||||
/**
|
||||
* 描述要执行的任务
|
||||
*/
|
||||
private TimerTask runnable;
|
||||
/**
|
||||
* 什么时间执行,用时间戳来表示
|
||||
*/
|
||||
private Long time;
|
||||
|
||||
}
|
||||
|
||||
@ -1,11 +1,14 @@
|
||||
package org.dromara.sms4j.comm.enumerate;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* ConfigType
|
||||
* <p>配置文件类型
|
||||
* @author :Wind
|
||||
* 2023/4/5 19:08
|
||||
**/
|
||||
@Getter
|
||||
public enum ConfigType {
|
||||
/** yaml配置文件 */
|
||||
YAML("yaml"),
|
||||
@ -18,7 +21,4 @@ public enum ConfigType {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@ package org.dromara.sms4j.comm.exception;
|
||||
|
||||
public class SmsBlendException extends RuntimeException{
|
||||
public String code;
|
||||
public String message;
|
||||
public final String message;
|
||||
public String requestId;
|
||||
|
||||
public SmsBlendException(String message) {
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
package org.dromara.sms4j.comm.exception;
|
||||
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
public class SmsSqlException extends RuntimeException{
|
||||
/**
|
||||
* -- SETTER --
|
||||
* 设置 message
|
||||
*/
|
||||
private String message;
|
||||
@Override
|
||||
public String getMessage() {
|
||||
@ -11,10 +18,4 @@ public class SmsSqlException extends RuntimeException{
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置 message
|
||||
*/
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,7 +33,7 @@ public abstract class SmsFactory {
|
||||
* <p>key: configId,短信服务对象的唯一标识</p>
|
||||
* <p>value: 短信服务对象</p>
|
||||
*/
|
||||
private final static Map<String, SmsBlend> blends = new ConcurrentHashMap<>();
|
||||
private final static Map<String, SmsBlend> BLENDS = new ConcurrentHashMap<>();
|
||||
|
||||
private SmsFactory() {
|
||||
}
|
||||
@ -170,7 +170,7 @@ public abstract class SmsFactory {
|
||||
* @return 返回短信服务对象。如果未找到则返回null
|
||||
*/
|
||||
public static SmsBlend getSmsBlend(String configId) {
|
||||
return blends.get(configId);
|
||||
return BLENDS.get(configId);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -184,7 +184,7 @@ public abstract class SmsFactory {
|
||||
if (StrUtil.isEmpty(supplier)) {
|
||||
throw new SmsBlendException("供应商标识不能为空");
|
||||
}
|
||||
return blends.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).findFirst().orElse(null);
|
||||
return BLENDS.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,7 +198,7 @@ public abstract class SmsFactory {
|
||||
if (StrUtil.isEmpty(supplier)) {
|
||||
throw new SmsBlendException("供应商标识不能为空");
|
||||
}
|
||||
list = blends.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).collect(Collectors.toList());
|
||||
list = BLENDS.values().stream().filter(smsBlend -> supplier.equals(smsBlend.getSupplier())).collect(Collectors.toList());
|
||||
return list;
|
||||
}
|
||||
|
||||
@ -208,7 +208,7 @@ public abstract class SmsFactory {
|
||||
* @return 短信服务对象列表
|
||||
*/
|
||||
public static List<SmsBlend> getAll() {
|
||||
return new ArrayList<>(blends.values());
|
||||
return new ArrayList<>(BLENDS.values());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -220,7 +220,7 @@ public abstract class SmsFactory {
|
||||
if (smsBlend == null) {
|
||||
throw new SmsBlendException("短信服务对象不能为空");
|
||||
}
|
||||
blends.put(smsBlend.getConfigId(), smsBlend);
|
||||
BLENDS.put(smsBlend.getConfigId(), smsBlend);
|
||||
SmsLoad.starConfig(smsBlend, 1);
|
||||
}
|
||||
|
||||
@ -233,7 +233,7 @@ public abstract class SmsFactory {
|
||||
if (smsBlend == null) {
|
||||
throw new SmsBlendException("短信服务对象不能为空");
|
||||
}
|
||||
blends.put(smsBlend.getConfigId(), smsBlend);
|
||||
BLENDS.put(smsBlend.getConfigId(), smsBlend);
|
||||
SmsLoad.starConfig(smsBlend, weight);
|
||||
}
|
||||
|
||||
@ -250,10 +250,10 @@ public abstract class SmsFactory {
|
||||
throw new SmsBlendException("短信服务对象不能为空");
|
||||
}
|
||||
String configId = smsBlend.getConfigId();
|
||||
if (blends.containsKey(configId)) {
|
||||
if (BLENDS.containsKey(configId)) {
|
||||
return false;
|
||||
}
|
||||
blends.put(configId, smsBlend);
|
||||
BLENDS.put(configId, smsBlend);
|
||||
SmsLoad.starConfig(smsBlend, 1);
|
||||
return true;
|
||||
}
|
||||
@ -274,10 +274,10 @@ public abstract class SmsFactory {
|
||||
throw new SmsBlendException("短信服务对象不能为空");
|
||||
}
|
||||
String configId = smsBlend.getConfigId();
|
||||
if (blends.containsKey(configId)) {
|
||||
if (BLENDS.containsKey(configId)) {
|
||||
return false;
|
||||
}
|
||||
blends.put(configId, smsBlend);
|
||||
BLENDS.put(configId, smsBlend);
|
||||
SmsLoad.starConfig(smsBlend, weight);
|
||||
return true;
|
||||
}
|
||||
@ -292,7 +292,7 @@ public abstract class SmsFactory {
|
||||
* <p>当configId不存在时,返回false</p>
|
||||
*/
|
||||
public static boolean unregister(String configId) {
|
||||
SmsBlend blend = blends.remove(configId);
|
||||
SmsBlend blend = BLENDS.remove(configId);
|
||||
SmsLoad.getBeanLoad().removeLoadServer(blend);
|
||||
return blend != null;
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.universal.SupplierConfig;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -49,9 +50,11 @@ public class SmsLoad {
|
||||
* @author :Wind
|
||||
*/
|
||||
public void removeLoadServer(SmsBlend LoadServer) {
|
||||
for (int i = 0; i < LoadServers.size(); i++) {
|
||||
if (LoadServers.get(i).getSmsServer().equals(LoadServer)) {
|
||||
LoadServers.remove(i);
|
||||
Iterator<LoadServer> iterator = LoadServers.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
LoadServer server = iterator.next();
|
||||
if (server.getSmsServer().getConfigId().equals(LoadServer.getConfigId())) {
|
||||
iterator.remove();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,13 +3,10 @@ package org.dromara.sms4j.core.proxy;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.proxy.SmsProcessor;
|
||||
import org.dromara.sms4j.api.proxy.SuppotFilter;
|
||||
|
||||
import java.lang.reflect.InvocationHandler;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
@ -30,7 +27,7 @@ public class SmsInvocationHandler implements InvocationHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
|
||||
public Object invoke(Object o, Method method, Object[] objects) {
|
||||
Object result = null;
|
||||
//前置执行器
|
||||
objects = doPreProcess(smsBlend, method, objects);
|
||||
@ -52,7 +49,7 @@ public class SmsInvocationHandler implements InvocationHandler {
|
||||
return objects;
|
||||
}
|
||||
|
||||
public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) throws InvocationTargetException, IllegalAccessException {
|
||||
public void doErrorHandleProcess(Object o, Method method, Object[] objects,Exception e) {
|
||||
for (SmsProcessor processor : processors) {
|
||||
processor.exceptionHandleProcessor(method, o, objects,e);
|
||||
}
|
||||
|
||||
@ -8,8 +8,8 @@ import org.dromara.sms4j.api.proxy.Order;
|
||||
import org.dromara.sms4j.api.proxy.SmsProcessor;
|
||||
import org.dromara.sms4j.api.proxy.SuppotFilter;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsBlendConfigAware;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsConfigAware;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@ -52,10 +52,8 @@ public abstract class SmsProxyFactory {
|
||||
//判断当前的执行器有没有开厂商过滤,支不支持当前厂商
|
||||
if (processor instanceof SuppotFilter) {
|
||||
List<String> supports = ((SuppotFilter) processor).getSupports();
|
||||
boolean exsit = supports.stream().filter(support -> support.equals(smsBlend.getSupplier())).findAny().isPresent();
|
||||
if (!exsit) {
|
||||
return true;
|
||||
}
|
||||
boolean exsit = supports.stream().anyMatch(support -> support.equals(smsBlend.getSupplier()));
|
||||
return !exsit;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -93,7 +91,7 @@ public abstract class SmsProxyFactory {
|
||||
if (null != smsDao) {
|
||||
return smsDao;
|
||||
}
|
||||
log.info("尝试框架加载失败,最终使用默认SmsDao!");
|
||||
log.debug("未找到合适框架加载,最终使用默认SmsDao!如无自实现SmsDao请忽略本消息!");
|
||||
return SmsDaoDefaultImpl.getInstance();
|
||||
}
|
||||
|
||||
@ -106,7 +104,7 @@ public abstract class SmsProxyFactory {
|
||||
log.info("{}:加载SmsDao成功,使用{}", frameworkName,smsDao.getClass().getName());
|
||||
return smsDao;
|
||||
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||||
log.info("{}:加载SmsDao失败,尝试其他框架加载......", frameworkName);
|
||||
log.debug("{}:尝试其他框架加载......", frameworkName);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -4,12 +4,13 @@ import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.api.dao.SmsDao;
|
||||
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsConfigAware;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
|
||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.provider.config.SmsConfig;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 黑名单前置拦截执行器
|
||||
@ -17,9 +18,9 @@ import java.util.*;
|
||||
* @author sh1yu
|
||||
* @since 2023/10/27 13:03
|
||||
*/
|
||||
@Setter
|
||||
@Slf4j
|
||||
public class BlackListProcessor implements CoreMethodProcessor, SmsDaoAware {
|
||||
@Setter
|
||||
SmsDao smsDao;
|
||||
|
||||
@Override
|
||||
@ -53,7 +54,7 @@ public class BlackListProcessor implements CoreMethodProcessor, SmsDaoAware {
|
||||
return;
|
||||
}
|
||||
for (String phone : phones) {
|
||||
if (blackList.stream().filter(black -> black.replace("-","").equals(phone)).findAny().isPresent()) {
|
||||
if (blackList.stream().anyMatch(black -> black.replace("-","").equals(phone))) {
|
||||
throw new SmsBlendException("The phone:", phone + " hit global blacklist!");
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,14 +17,14 @@ import java.util.List;
|
||||
* @author sh1yu
|
||||
* @since 2023/10/27 13:03
|
||||
*/
|
||||
@Setter
|
||||
@Slf4j
|
||||
public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, SmsConfigAware {
|
||||
@Setter
|
||||
SmsDao smsDao;
|
||||
|
||||
@Setter
|
||||
Object smsConfig;
|
||||
|
||||
@Override
|
||||
public int getOrder(){
|
||||
return 1;
|
||||
}
|
||||
@ -32,28 +32,28 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
|
||||
@Override
|
||||
public Object[] preProcessor(Method method, Object source, Object[] param) {
|
||||
//添加到黑名单
|
||||
if (method.getName().equals("joinInBlacklist")) {
|
||||
if ("joinInBlacklist".equals(method.getName())) {
|
||||
String cacheKey = getCacheKey();
|
||||
ArrayList<String> blackList = getBlackList(cacheKey);
|
||||
blackList.add((String) param[0]);
|
||||
flushBlackList(cacheKey,blackList);
|
||||
}
|
||||
//从黑名单移除
|
||||
if (method.getName().equals("removeFromBlacklist")) {
|
||||
if ("removeFromBlacklist".equals(method.getName())) {
|
||||
String cacheKey = getCacheKey();
|
||||
ArrayList<String> blackList = getBlackList(cacheKey);
|
||||
blackList.remove((String) param[0]);
|
||||
flushBlackList(cacheKey,blackList);
|
||||
}
|
||||
//批量添加到黑名单
|
||||
if (method.getName().equals("batchJoinBlacklist")) {
|
||||
if ("batchJoinBlacklist".equals(method.getName())) {
|
||||
String cacheKey = getCacheKey();
|
||||
ArrayList<String> blackList = getBlackList(cacheKey);
|
||||
blackList.addAll((List<String>) param[0]);
|
||||
flushBlackList(cacheKey,blackList);
|
||||
}
|
||||
//批量从黑名单移除
|
||||
if (method.getName().equals("batchRemovalFromBlacklist")) {
|
||||
if ("batchRemovalFromBlacklist".equals(method.getName())) {
|
||||
String cacheKey = getCacheKey();
|
||||
ArrayList<String> blackList = getBlackList(cacheKey);
|
||||
blackList.removeAll((List<String>) param[0]);
|
||||
@ -62,12 +62,21 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
|
||||
return param;
|
||||
}
|
||||
|
||||
//构建cachekey
|
||||
/**
|
||||
* 构建CacheKey
|
||||
*
|
||||
* @return CacheKey
|
||||
*/
|
||||
public String getCacheKey(){
|
||||
return "sms:blacklist:global";
|
||||
}
|
||||
|
||||
//获取黑名单,没有就新建
|
||||
/**
|
||||
* 获取黑名单,没有就新建
|
||||
*
|
||||
* @param cacheKey 缓存key
|
||||
* @return 黑名单
|
||||
*/
|
||||
public ArrayList<String> getBlackList(String cacheKey) {
|
||||
ArrayList<String> blackList;
|
||||
Object cache = smsDao.get(cacheKey);
|
||||
@ -80,7 +89,12 @@ public class BlackListRecordingProcessor implements SmsProcessor, SmsDaoAware, S
|
||||
return blackList;
|
||||
}
|
||||
|
||||
//让黑名单生效
|
||||
/**
|
||||
* 让黑名单生效
|
||||
*
|
||||
* @param cacheKey 缓存key
|
||||
* @param blackList 黑命令
|
||||
*/
|
||||
public void flushBlackList(String cacheKey ,ArrayList<String> blackList) {
|
||||
smsDao.set(cacheKey, blackList);
|
||||
}
|
||||
|
||||
@ -1,10 +1,13 @@
|
||||
package org.dromara.sms4j.core.proxy.processor;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
|
||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
|
||||
/**
|
||||
@ -45,22 +48,19 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
|
||||
}
|
||||
|
||||
public void validateMessage(Object messageObj) {
|
||||
if (messageObj instanceof String){
|
||||
String message = (String) messageObj;
|
||||
if (null == message || "".equals(message)) {
|
||||
if(Objects.isNull(messageObj)){
|
||||
throw new SmsBlendException("cant send a null message!");
|
||||
}
|
||||
}
|
||||
if (messageObj instanceof Map){
|
||||
Map message = (Map) messageObj;
|
||||
if (message.size()<1) {
|
||||
if (messageObj instanceof String){
|
||||
String message = (String) messageObj;
|
||||
if (StrUtil.isBlank(message)) {
|
||||
throw new SmsBlendException("cant send a null message!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void validatePhone(String phone) {
|
||||
if (null == phone || "".equals(phone)) {
|
||||
if (StrUtil.isNotEmpty(phone)) {
|
||||
throw new SmsBlendException("cant send message to null!");
|
||||
}
|
||||
}
|
||||
@ -70,7 +70,7 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
|
||||
throw new SmsBlendException("cant send message to null!");
|
||||
}
|
||||
for (String phone : phones) {
|
||||
if (null != phone && !"".equals(phone)) {
|
||||
if (StrUtil.isNotBlank(phone)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -78,7 +78,7 @@ public class CoreMethodParamValidateProcessor implements CoreMethodProcessor {
|
||||
}
|
||||
|
||||
public void validateMessages(String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (null != templateId && !"".equals(templateId) && (messages == null || messages.size() < 1)) {
|
||||
if (StrUtil.isEmpty(templateId) && messages == null) {
|
||||
throw new SmsBlendException("cant use template without template param");
|
||||
}
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ import java.util.Objects;
|
||||
* @author sh1yu
|
||||
* @since 2023/10/27 13:03
|
||||
*/
|
||||
@Setter
|
||||
@Slf4j
|
||||
public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
|
||||
static Long minTimer = 60 * 1000L;
|
||||
@ -31,7 +32,6 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
|
||||
/**
|
||||
* 缓存实例
|
||||
*/
|
||||
@Setter
|
||||
private SmsDao smsDao;
|
||||
|
||||
@Override
|
||||
@ -61,31 +61,39 @@ public class RestrictedProcessor implements CoreMethodProcessor, SmsDaoAware {
|
||||
|
||||
public void doRestricted(List<String> phones) {
|
||||
if (Objects.isNull(smsDao)) {
|
||||
throw new SmsBlendException("The dao tool could not be found");
|
||||
throw new SmsBlendException("The smsDao tool could not be found");
|
||||
}
|
||||
SmsConfig config = BeanFactory.getSmsConfig();
|
||||
Integer accountMax = config.getAccountMax(); // 每日最大发送量
|
||||
Integer minuteMax = config.getMinuteMax(); // 每分钟最大发送量
|
||||
// 如果未开始限制则不做处理
|
||||
if (!config.getRestricted()){
|
||||
return;
|
||||
}
|
||||
// 每日最大发送量
|
||||
Integer accountMax = config.getAccountMax();
|
||||
// 每分钟最大发送量
|
||||
Integer minuteMax = config.getMinuteMax();
|
||||
for (String phone : phones) {
|
||||
if (SmsUtils.isNotEmpty(accountMax)) { // 是否配置了每日限制
|
||||
// 是否配置了每日限制
|
||||
if (SmsUtils.isNotEmpty(accountMax)) {
|
||||
Integer i = (Integer) smsDao.get(REDIS_KEY + phone + "max");
|
||||
if (SmsUtils.isEmpty(i)) {
|
||||
smsDao.set(REDIS_KEY + phone + "max", 1, accTimer / 1000);
|
||||
} else if (i >= accountMax) {
|
||||
log.info("The phone:" + phone + ",number of short messages reached the maximum today");
|
||||
throw new SmsBlendException("The phone:" + phone + ",number of short messages reached the maximum today");
|
||||
log.info("The phone: {},number of short messages reached the maximum today", phone);
|
||||
throw new SmsBlendException("The phone: {},number of short messages reached the maximum today", phone);
|
||||
} else {
|
||||
smsDao.set(REDIS_KEY + phone + "max", i + 1, accTimer / 1000);
|
||||
}
|
||||
}
|
||||
if (SmsUtils.isNotEmpty(minuteMax)) { // 是否配置了每分钟最大限制
|
||||
// 是否配置了每分钟最大限制
|
||||
if (SmsUtils.isNotEmpty(minuteMax)) {
|
||||
Integer o = (Integer) smsDao.get(REDIS_KEY + phone);
|
||||
if (SmsUtils.isNotEmpty(o)) {
|
||||
if (o < minuteMax) {
|
||||
smsDao.set(REDIS_KEY + phone, o + 1, minTimer / 1000);
|
||||
} else {
|
||||
log.info("The phone:" + phone + ",number of short messages reached the maximum today");
|
||||
throw new SmsBlendException("The phone:", phone + " Text messages are sent too often!");
|
||||
log.info("The phone: {},number of short messages reached the maximum today", phone);
|
||||
throw new SmsBlendException("The phone: {} Text messages are sent too often!", phone);
|
||||
}
|
||||
} else {
|
||||
smsDao.set(REDIS_KEY + phone, 1, minTimer / 1000);
|
||||
|
||||
@ -4,17 +4,14 @@ import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.api.SmsBlend;
|
||||
import org.dromara.sms4j.api.dao.SmsDao;
|
||||
import org.dromara.sms4j.api.proxy.CoreMethodProcessor;
|
||||
import org.dromara.sms4j.api.proxy.SmsProcessor;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsBlendConfigAware;
|
||||
import org.dromara.sms4j.api.proxy.aware.SmsDaoAware;
|
||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.provider.config.BaseConfig;
|
||||
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
@ -23,6 +20,7 @@ import java.util.*;
|
||||
* @author sh1yu
|
||||
* @since 2023/10/27 13:03
|
||||
*/
|
||||
@Setter
|
||||
@Slf4j
|
||||
public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware, SmsBlendConfigAware {
|
||||
|
||||
@ -31,10 +29,8 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
|
||||
/**
|
||||
* 缓存实例
|
||||
*/
|
||||
@Setter
|
||||
private SmsDao smsDao;
|
||||
|
||||
@Setter
|
||||
Map smsBlendsConfig;
|
||||
|
||||
@Override
|
||||
@ -52,16 +48,12 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
|
||||
String configId = smsBlend.getConfigId();
|
||||
Map targetConfig = (Map) smsBlendsConfig.get(configId);
|
||||
Object maximumObj = targetConfig.get("maximum");
|
||||
if (null == maximumObj) {
|
||||
log.info("配置信息未能加载到本拦截器,跳过渠道级上限前置拦截执行器");
|
||||
return param;
|
||||
}
|
||||
if (SmsUtils.isEmpty(maximumObj)) {
|
||||
return param;
|
||||
}
|
||||
int maximum = 0;
|
||||
try{
|
||||
maximum = (int) maximumObj ;
|
||||
maximum = Integer.parseInt(String.valueOf(maximumObj)) ;
|
||||
}catch (Exception e){
|
||||
log.error("获取厂商级发送上限参数错误!请检查!");
|
||||
throw new IllegalArgumentException("获取厂商级发送上限参数错误");
|
||||
@ -70,8 +62,8 @@ public class SingleBlendRestrictedProcessor implements SmsProcessor, SmsDaoAware
|
||||
if (SmsUtils.isEmpty(i)) {
|
||||
smsDao.set(REDIS_KEY + configId + "maximum", 1);
|
||||
} else if (i >= maximum) {
|
||||
log.info("The channel:" + configId + ",messages reached the maximum");
|
||||
throw new SmsBlendException("The channel:" + configId + ",messages reached the maximum");
|
||||
log.info("The channel: {},messages reached the maximum", configId);
|
||||
throw new SmsBlendException("The channel: {},messages reached the maximum", configId);
|
||||
} else {
|
||||
smsDao.set(REDIS_KEY + configId + "maximum", i + 1);
|
||||
}
|
||||
|
||||
@ -26,6 +26,11 @@ public class MailSmtpConfig {
|
||||
* */
|
||||
private String fromAddress;
|
||||
|
||||
/**
|
||||
* 发送人昵称
|
||||
* */
|
||||
private String nickName;
|
||||
|
||||
/**
|
||||
* 服务器地址
|
||||
* */
|
||||
@ -45,23 +50,23 @@ public class MailSmtpConfig {
|
||||
* 是否开启ssl 默认开启
|
||||
* */
|
||||
@Builder.Default
|
||||
private String isSSL = "true";
|
||||
private final String isSSL = "true";
|
||||
|
||||
/**
|
||||
* 是否开启验证 默认开启
|
||||
* */
|
||||
@Builder.Default
|
||||
private String isAuth = "true";
|
||||
private final String isAuth = "true";
|
||||
|
||||
/**
|
||||
* 重试间隔(单位:秒),默认为5秒
|
||||
*/
|
||||
@Builder.Default
|
||||
private int retryInterval = 5;
|
||||
private final int retryInterval = 5;
|
||||
|
||||
/**
|
||||
* 重试次数,默认为1次
|
||||
*/
|
||||
@Builder.Default
|
||||
private int maxRetries = 1;
|
||||
private final int maxRetries = 1;
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
package org.dromara.email.jakarta.comm.entity;
|
||||
|
||||
import lombok.Data;
|
||||
import jakarta.mail.Multipart;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
@ -22,8 +22,6 @@ import java.util.Objects;
|
||||
**/
|
||||
public final class HtmlUtil {
|
||||
|
||||
private static final HtmlUtil htmlUtil = new HtmlUtil();
|
||||
|
||||
private HtmlUtil() {
|
||||
}
|
||||
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
package org.dromara.email.jakarta.core.factory;
|
||||
|
||||
import jakarta.mail.MessagingException;
|
||||
import org.dromara.email.jakarta.api.Blacklist;
|
||||
import org.dromara.email.jakarta.api.MailClient;
|
||||
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
|
||||
import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
import org.dromara.email.jakarta.core.service.MailBuild;
|
||||
|
||||
import jakarta.mail.MessagingException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ import java.util.Map;
|
||||
**/
|
||||
public class MonitorFactory {
|
||||
|
||||
private final static Map<String, MonitorService> services = new HashMap<>();
|
||||
private final static Map<String, MonitorService> SERVICES = new HashMap<>();
|
||||
|
||||
/**
|
||||
* put
|
||||
@ -30,7 +30,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void put(String key, MailImapConfig config, Monitor monitor){
|
||||
services.put(key,new MonitorService(config,monitor));
|
||||
SERVICES.put(key,new MonitorService(config,monitor));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -40,7 +40,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void start(String key){
|
||||
services.get(key).start();
|
||||
SERVICES.get(key).start();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -50,7 +50,7 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static void stop(String key){
|
||||
services.get(key).stop();
|
||||
SERVICES.get(key).stop();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -60,6 +60,6 @@ public class MonitorFactory {
|
||||
* @author :Wind
|
||||
*/
|
||||
public static MailImapConfig getConfig(String key) {
|
||||
return services.get(key).getMailImapConfig();
|
||||
return SERVICES.get(key).getMailImapConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,12 +1,7 @@
|
||||
package org.dromara.email.jakarta.core.service;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import lombok.Data;
|
||||
import org.dromara.email.jakarta.api.Blacklist;
|
||||
import org.dromara.email.jakarta.api.MailClient;
|
||||
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
|
||||
import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import jakarta.mail.Authenticator;
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
@ -15,6 +10,13 @@ import jakarta.mail.Session;
|
||||
import jakarta.mail.internet.AddressException;
|
||||
import jakarta.mail.internet.InternetAddress;
|
||||
import jakarta.mail.internet.MimeMessage;
|
||||
import lombok.Data;
|
||||
import org.dromara.email.jakarta.api.Blacklist;
|
||||
import org.dromara.email.jakarta.api.MailClient;
|
||||
import org.dromara.email.jakarta.comm.config.MailSmtpConfig;
|
||||
import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@ -43,12 +45,21 @@ public class MailBuild {
|
||||
props.put("mail.smtp.ssl.enable", config.getIsSSL());
|
||||
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
|
||||
this.session = Session.getInstance(props, new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(config.getUsername(), config.getPassword());
|
||||
}
|
||||
});
|
||||
this.message = new MimeMessage(session);
|
||||
try {
|
||||
if (StrUtil.isEmpty(config.getNickName())){
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress()));
|
||||
}else {
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new MailException(e);
|
||||
}
|
||||
this.config = config;
|
||||
this.retryInterval = config.getRetryInterval();
|
||||
this.maxRetries = config.getMaxRetries();
|
||||
@ -63,12 +74,21 @@ public class MailBuild {
|
||||
// props.put("mail.smtp.ssl.socketFactory", new MailSSLSocketFactory());
|
||||
this.session = Session.getInstance(props,
|
||||
new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(config.getUsername(), config.getPassword());
|
||||
}
|
||||
});
|
||||
this.message = new MimeMessage(session);
|
||||
try {
|
||||
if (StrUtil.isEmpty(config.getNickName())){
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress()));
|
||||
}else {
|
||||
this.message.setFrom(new InternetAddress(config.getFromAddress(),config.getNickName()));
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new MailException(e);
|
||||
}
|
||||
this.config = config;
|
||||
this.blacklist = blacklist;
|
||||
this.retryInterval = config.getRetryInterval();
|
||||
@ -94,8 +114,9 @@ public class MailBuild {
|
||||
if (Objects.isNull(blacklist)) {
|
||||
return InternetAddress.parse(Objects.requireNonNull(CollUtil.join(source, ",")));
|
||||
}
|
||||
for (String s : blacklist.getBlacklist()) {
|
||||
if (!source.contains(s)) {
|
||||
List<String> black = blacklist.getBlacklist();
|
||||
for (String s : source) {
|
||||
if (!black.contains(s)) {
|
||||
list.add(s);
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,6 +9,12 @@ import cn.hutool.http.HttpUtil;
|
||||
import jakarta.activation.DataHandler;
|
||||
import jakarta.activation.DataSource;
|
||||
import jakarta.activation.FileDataSource;
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.Multipart;
|
||||
import jakarta.mail.Transport;
|
||||
import jakarta.mail.internet.MimeBodyPart;
|
||||
import jakarta.mail.internet.MimeMultipart;
|
||||
import jakarta.mail.util.ByteArrayDataSource;
|
||||
import org.dromara.email.jakarta.api.MailClient;
|
||||
import org.dromara.email.jakarta.comm.constants.FileConstants;
|
||||
@ -17,13 +23,6 @@ import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
import org.dromara.email.jakarta.comm.utils.HtmlUtil;
|
||||
import org.dromara.email.jakarta.comm.utils.ZipUtils;
|
||||
|
||||
import jakarta.mail.Message;
|
||||
import jakarta.mail.MessagingException;
|
||||
import jakarta.mail.Multipart;
|
||||
import jakarta.mail.Transport;
|
||||
import jakarta.mail.internet.MimeBodyPart;
|
||||
import jakarta.mail.internet.MimeMultipart;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -34,8 +33,8 @@ import java.util.logging.Logger;
|
||||
|
||||
public class MailService implements MailClient {
|
||||
|
||||
private static Logger logger = Logger.getLogger("mailLog");
|
||||
private MailBuild mailBuild;
|
||||
private static final Logger logger = Logger.getLogger("mailLog");
|
||||
private final MailBuild mailBuild;
|
||||
|
||||
private MailService(MailBuild mailBuild) {
|
||||
this.mailBuild = mailBuild;
|
||||
@ -131,7 +130,8 @@ public class MailService implements MailClient {
|
||||
List<String> cc,
|
||||
List<String> bcc) {
|
||||
int maxRetries = mailBuild.getMaxRetries();
|
||||
int retryCount = 1; // 初始值为1;则while循环中少发送一次,最后一次发送在判断 retryCount >= maxRetries 这里。
|
||||
// 初始值为1;则while循环中少发送一次,最后一次发送在判断 retryCount >= maxRetries 这里。
|
||||
int retryCount = 1;
|
||||
boolean retryOnFailure = true;
|
||||
|
||||
while (retryOnFailure && retryCount < maxRetries) {
|
||||
@ -144,7 +144,8 @@ public class MailService implements MailClient {
|
||||
message = messageBuild(mailAddress, title, body, null, null, zipName, cc, bcc, files);
|
||||
}
|
||||
Transport.send(message);
|
||||
retryOnFailure = false; // 发送成功,停止重试
|
||||
// 发送成功,停止重试
|
||||
retryOnFailure = false;
|
||||
} catch (MessagingException | IOException e) {
|
||||
retryCount++;
|
||||
try {
|
||||
|
||||
@ -1,10 +1,5 @@
|
||||
package org.dromara.email.jakarta.core.service;
|
||||
|
||||
import org.dromara.email.jakarta.api.Monitor;
|
||||
import org.dromara.email.jakarta.comm.config.MailImapConfig;
|
||||
import org.dromara.email.jakarta.comm.entity.MonitorMessage;
|
||||
import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
|
||||
import jakarta.mail.BodyPart;
|
||||
import jakarta.mail.Flags;
|
||||
import jakarta.mail.Folder;
|
||||
@ -14,6 +9,12 @@ import jakarta.mail.Multipart;
|
||||
import jakarta.mail.Session;
|
||||
import jakarta.mail.Store;
|
||||
import jakarta.mail.search.FlagTerm;
|
||||
import lombok.Getter;
|
||||
import org.dromara.email.jakarta.api.Monitor;
|
||||
import org.dromara.email.jakarta.comm.config.MailImapConfig;
|
||||
import org.dromara.email.jakarta.comm.entity.MonitorMessage;
|
||||
import org.dromara.email.jakarta.comm.errors.MailException;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@ -32,6 +33,7 @@ import java.util.TimerTask;
|
||||
public class MonitorService{
|
||||
private final Store store;
|
||||
private Monitor monitor;
|
||||
@Getter
|
||||
private MailImapConfig mailImapConfig;
|
||||
private Timer timer;
|
||||
|
||||
@ -127,7 +129,4 @@ public class MonitorService{
|
||||
timer.cancel();
|
||||
}
|
||||
|
||||
public MailImapConfig getMailImapConfig() {
|
||||
return mailImapConfig;
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,10 +19,14 @@ import org.dromara.sms4j.cloopen.config.CloopenFactory;
|
||||
import org.dromara.sms4j.comm.constant.Constant;
|
||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.*;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
|
||||
import org.dromara.sms4j.ctyun.config.CtyunFactory;
|
||||
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
|
||||
import org.dromara.sms4j.emay.config.EmayFactory;
|
||||
@ -43,7 +47,6 @@ import org.dromara.sms4j.zhutong.config.ZhutongFactory;
|
||||
import java.beans.BeanInfo;
|
||||
import java.beans.Introspector;
|
||||
import java.beans.PropertyDescriptor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@ -1,15 +1,13 @@
|
||||
package org.dromara.sms4j.javase.config;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.dromara.sms4j.api.dao.SmsDao;
|
||||
|
||||
public class SESmsDaoHolder {
|
||||
|
||||
@Getter
|
||||
private static SmsDao smsDao = null;
|
||||
|
||||
public static SmsDao getSmsDao() {
|
||||
return smsDao;
|
||||
}
|
||||
|
||||
public static void setSmsDao(SmsDao smsDao) {
|
||||
SESmsDaoHolder.smsDao = smsDao;
|
||||
}
|
||||
|
||||
@ -1,5 +1,8 @@
|
||||
package org.dromara.oa.comm.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum MessageType {
|
||||
// 钉钉支持类型
|
||||
DINGTALK_TEXT("text"),
|
||||
@ -30,7 +33,4 @@ public enum MessageType {
|
||||
|
||||
private final String name;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,13 +1,25 @@
|
||||
package org.dromara.oa.comm.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public enum OaType {
|
||||
/**
|
||||
* 钉钉
|
||||
*/
|
||||
DINGTALK("dingding", "https://oapi.dingtalk.com/robot/send?access_token=", true),
|
||||
/**
|
||||
* 微信
|
||||
*/
|
||||
WETALK("wetalk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true),
|
||||
/**
|
||||
* 飞书
|
||||
*/
|
||||
BYTETALK("feishu", "https://open.feishu.cn/open-apis/bot/v2/hook/", true),
|
||||
;
|
||||
|
||||
private String type;
|
||||
private String robotUrl;
|
||||
@Getter
|
||||
private final String type;
|
||||
private final String robotUrl;
|
||||
|
||||
|
||||
OaType(String type, String robotUrl, boolean enabled) {
|
||||
@ -15,10 +27,6 @@ public enum OaType {
|
||||
this.robotUrl = robotUrl;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return robotUrl;
|
||||
}
|
||||
|
||||
@ -52,6 +52,11 @@
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-crypto</artifactId>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.BYTETALK;
|
||||
@Slf4j
|
||||
public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
|
||||
|
||||
private HttpClientImpl httpClient = new HttpClientImpl();
|
||||
private final HttpClientImpl httpClient = new HttpClientImpl();
|
||||
|
||||
public ByteTalkOaImpl(ByteTalkConfig config) {
|
||||
super(config);
|
||||
|
||||
@ -1,22 +1,19 @@
|
||||
package org.dromara.oa.core.byteTalk.utils;
|
||||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.crypto.digest.HMac;
|
||||
import cn.hutool.crypto.digest.HmacAlgorithm;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.oa.comm.entity.Request;
|
||||
import org.dromara.oa.comm.enums.MessageType;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.dromara.oa.comm.enums.MessageType.BYTETALK_TEXT;
|
||||
|
||||
|
||||
/**
|
||||
* 飞书通知签名和信息构建
|
||||
* @author dongfeng
|
||||
@ -29,15 +26,9 @@ public class ByteTalkBuilder {
|
||||
//把timestamp+"\n"+密钥当做签名字符串
|
||||
String stringToSign = timestamp + "\n" + secret;
|
||||
//使用HmacSHA256算法计算签名
|
||||
Mac mac = null;
|
||||
try {
|
||||
mac = Mac.getInstance("HmacSHA256");
|
||||
mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
||||
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
byte[] signData = mac.doFinal(new byte[]{});
|
||||
return new String(Base64.getEncoder().encode(signData));
|
||||
HMac mac = new HMac(HmacAlgorithm.HmacSHA256, stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||
byte[] signData = mac.digest(new byte[]{});
|
||||
return Base64.encode(signData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -26,7 +26,7 @@ import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
public class OaBlendsInitializer {
|
||||
private List<OaBaseProviderFactory<? extends OaSender, ? extends OaSupplierConfig>> factoryList;
|
||||
private final List<OaBaseProviderFactory<? extends OaSender, ? extends OaSupplierConfig>> factoryList;
|
||||
|
||||
private final OaConfig oaConfig;
|
||||
private final Map<String, Map<String, Object>> blends;
|
||||
|
||||
@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.DINGTALK;
|
||||
@Slf4j
|
||||
public class DingTalkOaImpl extends AbstractOaBlend<DingTalkConfig> {
|
||||
|
||||
private HttpClientImpl httpClient = new HttpClientImpl();
|
||||
private final HttpClientImpl httpClient = new HttpClientImpl();
|
||||
|
||||
/**
|
||||
* 建造一个微信通知对象服务
|
||||
|
||||
@ -1,25 +1,23 @@
|
||||
package org.dromara.oa.core.dingTalk.utils;
|
||||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.crypto.digest.HMac;
|
||||
import cn.hutool.crypto.digest.HmacAlgorithm;
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.oa.comm.entity.Request;
|
||||
import org.dromara.oa.comm.enums.MessageType;
|
||||
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK;
|
||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_MARKDOWN;
|
||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_TEXT;
|
||||
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK;
|
||||
|
||||
/**
|
||||
* 钉钉通知签名和信息构建
|
||||
@ -32,17 +30,11 @@ public class DingTalkBuilder {
|
||||
Long timestamp = System.currentTimeMillis();
|
||||
|
||||
String stringToSign = timestamp + "\n" + secret;
|
||||
Mac mac = null;
|
||||
HMac mac = new HMac(HmacAlgorithm.HmacSHA256, secret.getBytes(StandardCharsets.UTF_8));
|
||||
byte[] signData = mac.digest(stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||
String sign;
|
||||
try {
|
||||
mac = Mac.getInstance("HmacSHA256");
|
||||
mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
||||
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
|
||||
String sign = null;
|
||||
try {
|
||||
sign = URLEncoder.encode(new String(Base64.getEncoder().encode(signData)), StandardCharsets.UTF_8.toString());
|
||||
sign = URLEncoder.encode(Base64.encode(signData), StandardCharsets.UTF_8.toString());
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
@ -26,6 +26,7 @@ public abstract class OaAbstractProviderFactory<S extends OaSender, C extends Oa
|
||||
*
|
||||
* @return 配置类
|
||||
*/
|
||||
@Override
|
||||
public Class<C> getConfigClass() {
|
||||
return configClass;
|
||||
}
|
||||
|
||||
@ -3,8 +3,6 @@ package org.dromara.oa.core.provider.factory;
|
||||
import org.dromara.oa.api.OaSender;
|
||||
import org.dromara.oa.comm.config.OaSupplierConfig;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
public interface OaBaseProviderFactory<S extends OaSender, C extends OaSupplierConfig> {
|
||||
|
||||
/**
|
||||
|
||||
@ -1,10 +1,15 @@
|
||||
package org.dromara.oa.core.provider.factory;
|
||||
|
||||
import org.dromara.oa.comm.task.delayed.DelayedTime;
|
||||
import lombok.Getter;
|
||||
import org.dromara.oa.comm.entity.Request;
|
||||
import org.dromara.oa.comm.task.delayed.DelayedTime;
|
||||
import org.dromara.oa.core.provider.config.OaConfig;
|
||||
|
||||
import java.util.concurrent.*;
|
||||
import java.util.concurrent.ArrayBlockingQueue;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.PriorityBlockingQueue;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class OaBeanFactory {
|
||||
|
||||
@ -12,15 +17,18 @@ public class OaBeanFactory {
|
||||
private static DelayedTime delayedTime;
|
||||
|
||||
/** 线程池*/
|
||||
@Getter
|
||||
private static Executor executor;
|
||||
|
||||
/** 核心配置信息*/
|
||||
private static OaConfig oaConfig;
|
||||
|
||||
/** 优先级队列*/
|
||||
@Getter
|
||||
private static PriorityBlockingQueue<Request> priorityBlockingQueue;
|
||||
|
||||
/** 优先级队列*/
|
||||
@Getter
|
||||
private static Boolean priorityExecutorThreadStatus = false;
|
||||
|
||||
private OaBeanFactory() {
|
||||
@ -58,10 +66,6 @@ public class OaBeanFactory {
|
||||
return priorityBlockingQueue;
|
||||
}
|
||||
|
||||
public static Executor getExecutor() {
|
||||
return executor;
|
||||
}
|
||||
|
||||
public static OaConfig getSmsConfig(){
|
||||
if (oaConfig == null){
|
||||
oaConfig = new OaConfig();
|
||||
@ -69,14 +73,6 @@ public class OaBeanFactory {
|
||||
return oaConfig;
|
||||
}
|
||||
|
||||
public static PriorityBlockingQueue<Request> getPriorityBlockingQueue(){
|
||||
return priorityBlockingQueue;
|
||||
}
|
||||
|
||||
public static Boolean getPriorityExecutorThreadStatus() {
|
||||
return priorityExecutorThreadStatus;
|
||||
}
|
||||
|
||||
public static Boolean setPriorityExecutorThreadStatus(Boolean bo) {
|
||||
priorityExecutorThreadStatus=bo;
|
||||
return priorityExecutorThreadStatus;
|
||||
|
||||
@ -8,7 +8,7 @@ import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class OaFactory {
|
||||
private final static Map<String, OaSender> configs = new ConcurrentHashMap<>();
|
||||
private final static Map<String, OaSender> CONFIGS = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* <p>创建各个厂商的实现类
|
||||
@ -29,7 +29,7 @@ public class OaFactory {
|
||||
if (smsBlend == null) {
|
||||
throw new OaException("通知webhook服务对象不能为空");
|
||||
}
|
||||
configs.put(smsBlend.getConfigId(), smsBlend);
|
||||
CONFIGS.put(smsBlend.getConfigId(), smsBlend);
|
||||
}
|
||||
|
||||
public static OaSender createAndGetOa(OaSupplierConfig config) {
|
||||
@ -47,7 +47,7 @@ public class OaFactory {
|
||||
* @return 返回通知webhook服务对象。如果未找到则返回null
|
||||
*/
|
||||
public static OaSender getSmsOaBlend(String configId) {
|
||||
return configs.get(configId);
|
||||
return CONFIGS.get(configId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -70,15 +70,18 @@ public abstract class AbstractOaBlend<C extends OaSupplierConfig> implements OaS
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final void senderAsync(Request request, MessageType messageType) {
|
||||
pool.execute(() -> sender(request, messageType));
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void senderAsync(Request request, MessageType messageType, OaCallBack callBack) {
|
||||
CompletableFuture<Response> future = CompletableFuture.supplyAsync(() -> sender(request, messageType));
|
||||
future.thenAcceptAsync(callBack::callBack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void senderAsyncByPriority(Request request, MessageType messageType) {
|
||||
request.setMessageType(messageType);
|
||||
priorityQueueMap.offer(request);
|
||||
|
||||
@ -7,7 +7,7 @@ import java.util.Map;
|
||||
|
||||
public class HttpClientImpl extends AbstractHttpClient {
|
||||
@Override
|
||||
public <T> String post(StringBuilder url, Map<String, String> headers, T message) throws Exception {
|
||||
public <T> String post(StringBuilder url, Map<String, String> headers, T message) {
|
||||
// 构建请求体
|
||||
// 发送POST请求
|
||||
HttpResponse response = HttpRequest.post(url.toString())
|
||||
|
||||
@ -12,6 +12,6 @@ public interface MsgHttpClient {
|
||||
|
||||
String post(String url, Map<String, String> headers);
|
||||
|
||||
<T> String post(StringBuilder url, Map<String, String> headers, T message) throws Exception;
|
||||
<T> String post(StringBuilder url, Map<String, String> headers, T message);
|
||||
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ import static org.dromara.oa.comm.enums.OaType.WETALK;
|
||||
@Slf4j
|
||||
public class WeTalkOaImpl extends AbstractOaBlend<WeTalkConfig> {
|
||||
|
||||
private HttpClientImpl httpClient = new HttpClientImpl();
|
||||
private final HttpClientImpl httpClient = new HttpClientImpl();
|
||||
|
||||
public WeTalkOaImpl(WeTalkConfig config) {
|
||||
super(config);
|
||||
|
||||
@ -65,13 +65,16 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String messageStr = JSONUtil.toJsonStr(messages);
|
||||
return getSmsResponse(phone, messageStr, templateId);
|
||||
}
|
||||
@ -85,6 +88,9 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String messageStr = JSONUtil.toJsonStr(messages);
|
||||
return getSmsResponse(SmsUtils.arrayToString(phones), messageStr, templateId);
|
||||
}
|
||||
@ -121,7 +127,7 @@ public class AlibabaSmsImpl extends AbstractSmsBlend<AlibabaConfig> {
|
||||
private SmsResponse requestRetry(String phone, String message, String templateId) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(phone, message, templateId);
|
||||
}
|
||||
|
||||
|
||||
@ -47,13 +47,16 @@ public class CloopenSmsImpl extends AbstractSmsBlend<CloopenConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return massTexting(Collections.singletonList(phone), templateId, messages);
|
||||
}
|
||||
|
||||
@ -66,6 +69,9 @@ public class CloopenSmsImpl extends AbstractSmsBlend<CloopenConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
CloopenHelper helper = new CloopenHelper(getConfig(), http);
|
||||
Map<String, Object> paramMap = MapUtil.newHashMap(4, true);
|
||||
paramMap.put("to", String.join(",", phones));
|
||||
|
||||
@ -14,7 +14,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.comm.utils.SmsHttpUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -66,7 +65,7 @@ public class CloopenHelper {
|
||||
private SmsResponse requestRetry(Map<String, Object> paramMap) {
|
||||
http.safeSleep(config.getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return smsResponse(paramMap);
|
||||
}
|
||||
|
||||
|
||||
@ -52,13 +52,16 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String messageStr = JSONUtil.toJsonStr(messages);
|
||||
return getSmsResponse(phone, messageStr, templateId);
|
||||
}
|
||||
@ -72,6 +75,9 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String messageStr = JSONUtil.toJsonStr(messages);
|
||||
return getSmsResponse(SmsUtils.arrayToString(phones), messageStr, templateId);
|
||||
}
|
||||
@ -107,7 +113,7 @@ public class CtyunSmsImpl extends AbstractSmsBlend<CtyunConfig> {
|
||||
private SmsResponse requestRetry(String phone, String message, String templateId) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry ++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(phone, message, templateId);
|
||||
}
|
||||
|
||||
|
||||
@ -14,6 +14,7 @@ import org.dromara.sms4j.provider.service.AbstractSmsBlend;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
@ -68,6 +69,9 @@ public class DingZhongSmsImpl extends AbstractSmsBlend<DingZhongConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
DingZhongHelper helper = new DingZhongHelper(getConfig(), http);
|
||||
Map<String, Object> paramMap = MapUtil.newHashMap(5, true);
|
||||
paramMap.put("cdkey", getConfig().getAccessKeyId());
|
||||
|
||||
@ -10,7 +10,6 @@ import org.dromara.sms4j.comm.utils.SmsHttpUtils;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.dingzhong.config.DingZhongConfig;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -55,7 +54,7 @@ public class DingZhongHelper {
|
||||
private SmsResponse requestRetry(Map<String, Object> paramMap) {
|
||||
http.safeSleep(config.getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return smsResponse(paramMap);
|
||||
}
|
||||
|
||||
|
||||
@ -67,7 +67,7 @@ public class EmaySmsImpl extends AbstractSmsBlend<EmayConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
@ -75,13 +75,16 @@ public class EmaySmsImpl extends AbstractSmsBlend<EmayConfig> {
|
||||
private SmsResponse requestRetry(String phone, String message) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return sendMessage(phone, message);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||
list.add(entry.getValue());
|
||||
|
||||
@ -51,13 +51,16 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String url = getConfig().getUrl() + Constant.HUAWEI_REQUEST_URL;
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||
@ -88,7 +91,7 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
|
||||
private SmsResponse requestRetry(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return sendMessage(phone, templateId, messages);
|
||||
}
|
||||
|
||||
@ -99,6 +102,9 @@ public class HuaweiSmsImpl extends AbstractSmsBlend<HuaweiConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(CollUtil.join(phones, ","), templateId, messages);
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package org.dromara.sms4j.huawei.utils;
|
||||
|
||||
import cn.hutool.core.codec.Base64;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import org.dromara.sms4j.comm.constant.Constant;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
@ -12,8 +13,6 @@ import java.net.URLEncoder;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -21,11 +20,13 @@ import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public class HuaweiBuilder {
|
||||
private HuaweiBuilder(){}
|
||||
private HuaweiBuilder() {
|
||||
}
|
||||
|
||||
/**
|
||||
* buildWsseHeader
|
||||
* <p>构造X-WSSE参数值
|
||||
*
|
||||
* @author :Wind
|
||||
*/
|
||||
public static String buildWsseHeader(String appKey, String appSecret) {
|
||||
@ -34,7 +35,8 @@ public class HuaweiBuilder {
|
||||
return null;
|
||||
}
|
||||
String time = dateFormat(new Date());
|
||||
String nonce = UUID.randomUUID().toString().replace("-", ""); //Nonce
|
||||
// Nonce
|
||||
String nonce = UUID.randomUUID().toString().replace("-", "");
|
||||
MessageDigest md;
|
||||
byte[] passwordDigest = null;
|
||||
|
||||
@ -45,8 +47,8 @@ public class HuaweiBuilder {
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
String passwordDigestBase64Str = Base64.encode(passwordDigest); //PasswordDigest
|
||||
// PasswordDigest
|
||||
String passwordDigestBase64Str = Base64.encode(passwordDigest);
|
||||
//若passwordDigestBase64Str中包含换行符,请执行如下代码进行修正
|
||||
//passwordDigestBase64Str = passwordDigestBase64Str.replaceAll("[\\s*\t\n\r]", "");
|
||||
return String.format(Constant.HUAWEI_WSSE_HEADER_FORMAT, appKey, passwordDigestBase64Str, nonce, time);
|
||||
@ -55,10 +57,15 @@ public class HuaweiBuilder {
|
||||
static void trustAllHttpsCertificates() throws Exception {
|
||||
TrustManager[] trustAllCerts = new TrustManager[]{
|
||||
new X509TrustManager() {
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers() {
|
||||
return null;
|
||||
}
|
||||
@ -72,6 +79,7 @@ public class HuaweiBuilder {
|
||||
/**
|
||||
* buildRequestBody
|
||||
* <p>构造请求Body体
|
||||
*
|
||||
* @param sender 国内短信签名通道号
|
||||
* @param receiver 短信接收者
|
||||
* @param templateId 短信模板id
|
||||
@ -87,7 +95,7 @@ public class HuaweiBuilder {
|
||||
System.out.println("buildRequestBody(): sender, receiver or templateId is null.");
|
||||
return null;
|
||||
}
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
Map<String, String> map = new HashMap<>();
|
||||
|
||||
map.put("from", sender);
|
||||
map.put("to", receiver);
|
||||
@ -131,17 +139,8 @@ public class HuaweiBuilder {
|
||||
return stringBuffer.toString();
|
||||
}
|
||||
|
||||
static String dateFormat(Date date){
|
||||
return SDF.format(date);
|
||||
private static String dateFormat(Date date) {
|
||||
return DateUtil.format(date, Constant.HUAWEI_JAVA_DATE);
|
||||
}
|
||||
|
||||
static Date strForDate(String date){
|
||||
try {
|
||||
return SDF.parse(date);
|
||||
} catch (ParseException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static final SimpleDateFormat SDF = new SimpleDateFormat(Constant.HUAWEI_JAVA_DATE);
|
||||
}
|
||||
|
||||
@ -55,7 +55,7 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
@ -74,6 +74,9 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
BatchSendRequest request;
|
||||
try {
|
||||
request = new BatchSendRequest();
|
||||
@ -107,7 +110,7 @@ public class JdCloudSmsImpl extends AbstractSmsBlend<JdCloudConfig> {
|
||||
private SmsResponse requestRetry(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return massTexting(phones, templateId, messages);
|
||||
}
|
||||
|
||||
|
||||
@ -11,7 +11,13 @@ import org.dromara.sms4j.lianlu.req.LianLuRequest;
|
||||
import org.dromara.sms4j.lianlu.utils.LianLuUtils;
|
||||
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Slf4j
|
||||
@ -28,6 +34,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
|
||||
super(config);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSupplier() {
|
||||
return SupplierConstant.LIANLU;
|
||||
}
|
||||
@ -41,6 +48,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
|
||||
* @param templateParam 模板变量
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateParam) {
|
||||
return this.massTexting(Collections.singletonList(phone), templateParam);
|
||||
}
|
||||
@ -48,7 +56,7 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
@ -61,17 +69,23 @@ public class LianLuSmsImpl extends AbstractSmsBlend<LianLuConfig> {
|
||||
* @param messages key无实际意义,value为模板变量值
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
return this.massTexting(Collections.singletonList(phone), templateId, messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateParam) {
|
||||
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
|
||||
map.put("", templateParam);
|
||||
return massTexting(phones, getConfig().getTemplateId(), map);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
LianLuRequest req = getRequest();
|
||||
req.setType(TEMPLATE_MSG)
|
||||
.setPhoneNumberSet(phones)
|
||||
|
||||
@ -4,7 +4,9 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.crypto.SecureUtil;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
public class LianLuUtils {
|
||||
private static final Set<String> IGNORE_FILED_SET = new HashSet<>();
|
||||
|
||||
@ -64,7 +64,7 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
@ -78,6 +78,9 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
|
||||
*/
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
Optional.ofNullable(phone).orElseThrow(() -> new SmsBlendException("手机号不能为空"));
|
||||
Optional.ofNullable(getConfig().getTemplateId()).orElseThrow(() -> new SmsBlendException("模板ID不能为空"));
|
||||
String messageStr = messages.get("params");
|
||||
@ -98,6 +101,9 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
if (phones.size() > 100) {
|
||||
throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于100");
|
||||
}
|
||||
@ -142,7 +148,7 @@ public class NeteaseSmsImpl extends AbstractSmsBlend<NeteaseConfig> {
|
||||
private SmsResponse requestRetry(String requestUrl, List<String> phones, String message, String templateId) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(requestUrl, phones, message, templateId);
|
||||
}
|
||||
|
||||
|
||||
@ -30,6 +30,7 @@ public abstract class AbstractProviderFactory<S extends SmsBlend, C extends Supp
|
||||
* 获取配置类
|
||||
* @return 配置类
|
||||
*/
|
||||
@Override
|
||||
public Class<C> getConfigClass() {
|
||||
return configClass;
|
||||
}
|
||||
|
||||
@ -53,6 +53,11 @@ public class BeanFactory {
|
||||
return executor;
|
||||
}
|
||||
|
||||
public static Executor setExecutor(Executor exec) {
|
||||
executor = exec;
|
||||
return executor;
|
||||
}
|
||||
|
||||
public static Executor getExecutor() {
|
||||
if (executor == null){
|
||||
// 创建一个线程池对象
|
||||
|
||||
@ -63,6 +63,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@Override
|
||||
public abstract SmsResponse sendMessage(String phone, String message);
|
||||
|
||||
/**
|
||||
@ -72,6 +73,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param messages 模板内容
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public abstract SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages);
|
||||
|
||||
/**
|
||||
@ -83,6 +85,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@Override
|
||||
public abstract SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages);
|
||||
|
||||
/**
|
||||
@ -92,6 +95,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@Override
|
||||
public abstract SmsResponse massTexting(List<String> phones, String message);
|
||||
|
||||
/**
|
||||
@ -101,6 +105,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@Override
|
||||
public abstract SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages);
|
||||
|
||||
/**
|
||||
@ -112,6 +117,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param callBack 回调
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void sendMessageAsync(String phone, String message, CallBack callBack){
|
||||
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone, message), pool);
|
||||
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||
@ -125,10 +131,9 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param message 发送内容
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void sendMessageAsync(String phone, String message){
|
||||
pool.execute(() -> {
|
||||
sendMessage(phone, message);
|
||||
});
|
||||
pool.execute(() -> sendMessage(phone, message));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -141,6 +146,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @author :Wind
|
||||
*/
|
||||
|
||||
@Override
|
||||
public final void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages, CallBack callBack){
|
||||
CompletableFuture<SmsResponse> smsResponseCompletableFuture = CompletableFuture.supplyAsync(() -> sendMessage(phone,templateId, messages), pool);
|
||||
smsResponseCompletableFuture.thenAcceptAsync(callBack::callBack);
|
||||
@ -154,10 +160,9 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param messages key为模板变量名称 value为模板变量值
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void sendMessageAsync(String phone, String templateId, LinkedHashMap<String, String> messages){
|
||||
pool.execute(() -> {
|
||||
sendMessage(phone, templateId, messages);
|
||||
});
|
||||
pool.execute(() -> sendMessage(phone, templateId, messages));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -169,6 +174,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param delayedTime 延迟时间
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void delayedMessage(String phone, String message, Long delayedTime){
|
||||
this.delayed.schedule(new TimerTask() {
|
||||
@Override
|
||||
@ -188,6 +194,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param delayedTime 延迟的时间
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void delayedMessage(String phone, String templateId, LinkedHashMap<String, String> messages, Long delayedTime){
|
||||
this.delayed.schedule(new TimerTask() {
|
||||
@Override
|
||||
@ -204,6 +211,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param phones 要群体发送的手机号码
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void delayMassTexting(List<String> phones, String message, Long delayedTime){
|
||||
this.delayed.schedule(new TimerTask() {
|
||||
@Override
|
||||
@ -223,6 +231,7 @@ public abstract class AbstractSmsBlend<C extends SupplierConfig> implements SmsB
|
||||
* @param delayedTime 延迟的时间
|
||||
* @author :Wind
|
||||
*/
|
||||
@Override
|
||||
public final void delayMassTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages, Long delayedTime){
|
||||
this.delayed.schedule(new TimerTask() {
|
||||
@Override
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
package org.dromara.sms4j.qiniu.config;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.sms4j.comm.constant.SupplierConstant;
|
||||
import org.dromara.sms4j.provider.config.BaseConfig;
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
* @Date: 2024/1/30 15:56 30
|
||||
* @描述: QiNiuConfig
|
||||
**/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class QiNiuConfig extends BaseConfig {
|
||||
|
||||
|
||||
private String baseUrl = "https://sms.qiniuapi.com";
|
||||
|
||||
private String templateName;
|
||||
|
||||
private String singleMsgUrl = "/v1/message/single";
|
||||
|
||||
private String massMsgUrl = "/v1/message";
|
||||
|
||||
private String signatureId;
|
||||
|
||||
@Override
|
||||
public String getSupplier() {
|
||||
return SupplierConstant.QINIU;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
package org.dromara.sms4j.qiniu.config;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.dromara.sms4j.comm.constant.SupplierConstant;
|
||||
import org.dromara.sms4j.provider.factory.AbstractProviderFactory;
|
||||
import org.dromara.sms4j.qiniu.service.QiNiuSmsImpl;
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
* @Date: 2024/1/30 16:06 29
|
||||
* @描述: QiNiuFactory
|
||||
**/
|
||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||
public class QiNiuFactory extends AbstractProviderFactory<QiNiuSmsImpl, QiNiuConfig> {
|
||||
|
||||
private static final QiNiuFactory INSTANCE = new QiNiuFactory();
|
||||
|
||||
|
||||
public static QiNiuFactory instance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public QiNiuSmsImpl createSms(QiNiuConfig qiNiuConfig) {
|
||||
return new QiNiuSmsImpl(qiNiuConfig);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSupplier() {
|
||||
return SupplierConstant.QINIU;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,135 @@
|
||||
package org.dromara.sms4j.qiniu.service;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.api.entity.SmsResponse;
|
||||
import org.dromara.sms4j.comm.constant.SupplierConstant;
|
||||
import org.dromara.sms4j.comm.delayedTime.DelayedTime;
|
||||
import org.dromara.sms4j.provider.service.AbstractSmsBlend;
|
||||
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
|
||||
import org.dromara.sms4j.qiniu.util.QiNiuUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
* @Date: 2024/1/30 16:06 59
|
||||
* @描述: QiNiuSmsImpl
|
||||
**/
|
||||
@Slf4j
|
||||
public class QiNiuSmsImpl extends AbstractSmsBlend<QiNiuConfig> {
|
||||
|
||||
private int retry = 0;
|
||||
|
||||
@Override
|
||||
public String getSupplier() {
|
||||
return SupplierConstant.QINIU;
|
||||
}
|
||||
|
||||
public QiNiuSmsImpl(QiNiuConfig config, Executor pool, DelayedTime delayed) {
|
||||
super(config, pool, delayed);
|
||||
}
|
||||
|
||||
public QiNiuSmsImpl(QiNiuConfig config) {
|
||||
super(config);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String message) {
|
||||
return sendSingleMsg(phone, getConfig().getTemplateId(), new LinkedHashMap<String, String>() {{
|
||||
put(getConfig().getTemplateName(), message);
|
||||
}});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
return sendSingleMsg(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
return sendSingleMsg(phone, templateId, messages);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String message) {
|
||||
LinkedHashMap<String, String> params = new LinkedHashMap<>();
|
||||
params.put(getConfig().getTemplateName(), message);
|
||||
return senMassMsg(phones, getConfig().getTemplateId(), params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
return senMassMsg(phones, templateId, messages);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return SmsResponse
|
||||
* @author 初拥。
|
||||
* @date 2024/1/31 8:54
|
||||
* @Description: 统一处理返回结果
|
||||
*/
|
||||
public SmsResponse handleRes(String url, HashMap<String, Object> params) {
|
||||
JSONObject jsonObject = http.postJson(url, QiNiuUtils.getHeaderAndSign(url, params, getConfig()), params);
|
||||
SmsResponse smsResponse = new SmsResponse();
|
||||
smsResponse.setSuccess(ObjectUtil.isEmpty(jsonObject.getStr("error")));
|
||||
smsResponse.setData(jsonObject);
|
||||
smsResponse.setConfigId(getConfigId());
|
||||
if (smsResponse.isSuccess() || retry == getConfig().getMaxRetries()) {
|
||||
retry = 0;
|
||||
return smsResponse;
|
||||
}
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return handleRes(url, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param phones
|
||||
* @param templateId
|
||||
* @param messages
|
||||
* @return SmsResponse
|
||||
* @author 初拥。
|
||||
* @date 2024/1/31 9:20
|
||||
* @Description: 发送群发短信
|
||||
*/
|
||||
private SmsResponse senMassMsg(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String url = getConfig().getBaseUrl() + getConfig().getMassMsgUrl();
|
||||
HashMap<String, Object> params = new HashMap<>();
|
||||
params.put("template_id", templateId);
|
||||
params.put("mobiles", phones.toArray());
|
||||
params.put("parameters", messages);
|
||||
return handleRes(url, params);
|
||||
}
|
||||
|
||||
|
||||
private SmsResponse sendSingleMsg(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
String url = getConfig().getBaseUrl() + getConfig().getSingleMsgUrl();
|
||||
//手机号
|
||||
HashMap<String, Object> hashMap = new HashMap<>();
|
||||
hashMap.put("mobile", phone);
|
||||
hashMap.put("template_id", templateId);
|
||||
hashMap.put("parameters", messages);
|
||||
|
||||
log.info("hashMap:{}", hashMap);
|
||||
|
||||
return handleRes(url, hashMap);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
package org.dromara.sms4j.qiniu.util;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.crypto.digest.HMac;
|
||||
import cn.hutool.crypto.digest.HmacAlgorithm;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sms4j.comm.constant.Constant;
|
||||
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.qiniu.config.QiNiuConfig;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Base64;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* @author Administrator
|
||||
* @Date: 2024/1/30 16:37 50
|
||||
* @描述: QiNiuUtils
|
||||
**/
|
||||
@Data
|
||||
@Slf4j
|
||||
public class QiNiuUtils {
|
||||
|
||||
private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
|
||||
|
||||
public static String getSignature(String method, String url, QiNiuConfig qiNiuConfig, String body, String signDate) {
|
||||
URI reqUrl = URI.create(url);
|
||||
StringBuilder dataToSign = new StringBuilder();
|
||||
dataToSign.append(method.toUpperCase()).append(" ").append(reqUrl.getPath());
|
||||
dataToSign.append("\nHost: ").append(reqUrl.getHost());
|
||||
dataToSign.append("\n").append("Content-Type").append(": ").append(Constant.ACCEPT);
|
||||
dataToSign.append("\n").append("X-Qiniu-Date").append(": ").append(signDate);
|
||||
dataToSign.append("\n\n");
|
||||
if (ObjectUtil.isNotEmpty(body)) {
|
||||
dataToSign.append(body);
|
||||
}
|
||||
HMac hMac = new HMac(HmacAlgorithm.HmacSHA1, qiNiuConfig.getAccessKeySecret().getBytes(StandardCharsets.UTF_8));
|
||||
byte[] signData = hMac.digest(dataToSign.toString().getBytes(StandardCharsets.UTF_8));
|
||||
String encodedSignature = Base64.getEncoder().encodeToString(signData);
|
||||
|
||||
return "Qiniu " + qiNiuConfig.getAccessKeyId() + ":" + encodedSignature;
|
||||
}
|
||||
|
||||
public static Map<String, String> getHeaderAndSign(String url, HashMap<String, Object> hashMap, QiNiuConfig qiNiuConfig) {
|
||||
String signature;
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'");
|
||||
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
|
||||
String signDate = dateFormat.format(new Date());
|
||||
try {
|
||||
signature = getSignature("POST", url, qiNiuConfig, JSONUtil.toJsonStr(hashMap), signDate);
|
||||
} catch (Exception e) {
|
||||
log.error("签名失败", e);
|
||||
throw new SmsBlendException(e.getMessage());
|
||||
}
|
||||
|
||||
//请求头
|
||||
Map<String, String> header = new HashMap<>(3);
|
||||
header.put("Authorization", signature);
|
||||
header.put("X-Qiniu-Date", signDate);
|
||||
header.put("Content-Type", "application/json");
|
||||
return header;
|
||||
}
|
||||
}
|
||||
@ -54,14 +54,14 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||
list.add(entry.getValue());
|
||||
@ -82,6 +82,9 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
List<String> list = new ArrayList<>();
|
||||
for (Map.Entry<String, String> entry : messages.entrySet()) {
|
||||
list.add(entry.getValue());
|
||||
@ -123,7 +126,7 @@ public class TencentSmsImpl extends AbstractSmsBlend<TencentConfig> {
|
||||
private SmsResponse requestRetry(String[] phones, String[] messages, String templateId) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(phones, messages, templateId);
|
||||
}
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ public class Uni {
|
||||
/** 模仿SDK版本*/
|
||||
public static final String VERSION = "0.0.4";
|
||||
|
||||
public static String signingAlgorithm = "hmac-sha256";
|
||||
public static final String signingAlgorithm = "hmac-sha256";
|
||||
public static String endpoint = System.getenv().getOrDefault("UNI_ENDPOINT", "https://uni.apistd.com");
|
||||
public static String accessKeyId = System.getenv("UNI_ACCESS_KEY_ID");
|
||||
|
||||
|
||||
@ -9,7 +9,6 @@ import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||
import org.dromara.sms4j.comm.utils.SmsHttpUtils;
|
||||
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
@ -67,7 +66,7 @@ public class UniClient {
|
||||
private Map<String, Object> sign(final Map<String, Object> query) {
|
||||
if (this.accessKeySecret != null) {
|
||||
query.put("algorithm", this.signingAlgorithm);
|
||||
query.put("timestamp", new Date().getTime());
|
||||
query.put("timestamp", System.currentTimeMillis());
|
||||
query.put("nonce", UUID.randomUUID().toString().replaceAll("-", ""));
|
||||
|
||||
String strToSign = UniClient.queryStringify(query);
|
||||
@ -114,12 +113,12 @@ public class UniClient {
|
||||
private UniResponse requestRetry(String action, Map<String, Object> data) {
|
||||
http.safeSleep(retryInterval);
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return request(action, data);
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
private String accessKeyId;
|
||||
private final String accessKeyId;
|
||||
private String accessKeySecret;
|
||||
private String endpoint;
|
||||
private String signingAlgorithm;
|
||||
|
||||
@ -81,6 +81,9 @@ public class UniSmsImpl extends AbstractSmsBlend<UniConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
if (phones.size() > 1000) {
|
||||
throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于1000");
|
||||
}
|
||||
|
||||
@ -74,7 +74,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
@ -82,12 +82,15 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
|
||||
private SmsResponse requestRetry(String phone, String message) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return sendMessage(phone, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
Map<String, Object> body = setBody(phone, "", messages, templateId);
|
||||
Map<String, String> headers = getHeaders();
|
||||
|
||||
@ -107,7 +110,7 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
|
||||
private SmsResponse requestRetry(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return sendMessage(phone, templateId, messages);
|
||||
}
|
||||
|
||||
@ -121,6 +124,9 @@ public class YunPianSmsImpl extends AbstractSmsBlend<YunpianConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
if (phones.size() > 1000) {
|
||||
throw new SmsBlendException("单次发送超过最大发送上限,建议每次群发短信人数低于1000");
|
||||
}
|
||||
|
||||
@ -71,13 +71,16 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<String, String>();
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return sendMessage(phone, getConfig().getTemplateId(), messages);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResponse sendMessage(String phone, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return getSmsResponseTemplate(templateId, phone, messages);
|
||||
}
|
||||
|
||||
@ -96,6 +99,9 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
|
||||
|
||||
@Override
|
||||
public SmsResponse massTexting(List<String> phones, String templateId, LinkedHashMap<String, String> messages) {
|
||||
if (Objects.isNull(messages)){
|
||||
messages = new LinkedHashMap<>();
|
||||
}
|
||||
return getSmsResponseTemplate(templateId, phones, messages);
|
||||
}
|
||||
|
||||
@ -160,7 +166,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
|
||||
private SmsResponse requestRetry(List<String> phones, String content) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(phones, content);
|
||||
}
|
||||
|
||||
@ -248,7 +254,7 @@ public class ZhutongSmsImpl extends AbstractSmsBlend<ZhutongConfig> {
|
||||
private SmsResponse requestRetry(String templateId, List<String> phones, LinkedHashMap<String, String> messages) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponseTemplate(templateId, phones, messages);
|
||||
}
|
||||
|
||||
|
||||
@ -10,10 +10,14 @@ import org.dromara.sms4j.api.universal.SupplierConfig;
|
||||
import org.dromara.sms4j.cloopen.config.CloopenFactory;
|
||||
import org.dromara.sms4j.comm.constant.Constant;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.*;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
|
||||
import org.dromara.sms4j.ctyun.config.CtyunFactory;
|
||||
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
|
||||
import org.dromara.sms4j.emay.config.EmayFactory;
|
||||
@ -37,7 +41,7 @@ import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
public class SmsBlendsInitializer {
|
||||
private List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
|
||||
private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
|
||||
|
||||
private final SmsConfig smsConfig;
|
||||
private final Map<String, Map<String, Object>> blends;
|
||||
|
||||
@ -104,7 +104,7 @@ public class ZhangJunSmsImpl extends AbstractSmsBlend<ZhangJunConfig> {
|
||||
private SmsResponse requestRetry(String phone, String message, String templateId) {
|
||||
http.safeSleep(getConfig().getRetryInterval());
|
||||
retry++;
|
||||
log.warn("短信第 {" + retry + "} 次重新发送");
|
||||
log.warn("短信第 {} 次重新发送", retry);
|
||||
return getSmsResponse(phone, message, templateId);
|
||||
}
|
||||
|
||||
|
||||
@ -79,13 +79,20 @@ sms:
|
||||
access-key-secret: 你的Access Key Secret
|
||||
sdkAppId: 你的应用ID
|
||||
#自定义广州掌骏短信,添加factory全路径。config,factory,SmsImpl复制其他默认实现即可,修改对应的supplier和发送核心逻辑即可
|
||||
zhangjun:
|
||||
supplier: zhangjun
|
||||
factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory
|
||||
templateId: d2a****777
|
||||
appId: 64c52d2a****77775fe72e3
|
||||
sid: d2a****777
|
||||
url: https://sms.idowe.com/**/**/**/send
|
||||
# zhangjun:
|
||||
# supplier: zhangjun
|
||||
# factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory
|
||||
# templateId: d2a****777
|
||||
# appId: 64c52d2a****77775fe72e3
|
||||
# sid: d2a****777
|
||||
# url: https://sms.idowe.com/**/**/**/send
|
||||
qiniu:
|
||||
access-key-id: EQcDflLTCYnU1******CmqIYLhog1lkWHb2
|
||||
access-key-secret: NeS2ptvZQoIy*****err2DdLe7wxFfQvji1
|
||||
templateId: 1752130****15859456
|
||||
signatureId: 175185*****1624960
|
||||
templateName: code
|
||||
|
||||
sms-oa:
|
||||
config-type: yaml
|
||||
oas:
|
||||
|
||||
@ -106,7 +106,7 @@ public class SmsProcessorTest {
|
||||
Assert.notNull(knowEx);
|
||||
knowEx = null;
|
||||
try {
|
||||
SmsFactory.getBySupplier(SupplierConstant.UNISMS).massTexting(new ArrayList<String>(), "321321");
|
||||
SmsFactory.getBySupplier(SupplierConstant.UNISMS).massTexting(new ArrayList<>(), "321321");
|
||||
} catch (SmsBlendException e) {
|
||||
knowEx = e;
|
||||
System.out.println(knowEx.getMessage());
|
||||
|
||||
@ -4,9 +4,14 @@ import cn.hutool.core.bean.BeanUtil;
|
||||
import org.dromara.sms4j.core.datainterface.SmsReadConfig;
|
||||
import org.dromara.sms4j.provider.config.BaseConfig;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class ConfigCombineMapAdeptor<S, M> extends HashMap {
|
||||
@Override
|
||||
public M get(Object key) {
|
||||
Object o = super.get(key);
|
||||
if (null == o){
|
||||
|
||||
@ -12,10 +12,14 @@ import org.dromara.sms4j.comm.constant.Constant;
|
||||
import org.dromara.sms4j.comm.enumerate.ConfigType;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.core.datainterface.SmsReadConfig;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.factory.SmsFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.*;
|
||||
import org.dromara.sms4j.core.proxy.EnvirmentHolder;
|
||||
import org.dromara.sms4j.core.proxy.SmsProxyFactory;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.BlackListRecordingProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.CoreMethodParamValidateProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.RestrictedProcessor;
|
||||
import org.dromara.sms4j.core.proxy.processor.SingleBlendRestrictedProcessor;
|
||||
import org.dromara.sms4j.ctyun.config.CtyunFactory;
|
||||
import org.dromara.sms4j.dingzhong.config.DingZhongFactory;
|
||||
import org.dromara.sms4j.emay.config.EmayFactory;
|
||||
@ -26,6 +30,7 @@ import org.dromara.sms4j.netease.config.NeteaseFactory;
|
||||
import org.dromara.sms4j.provider.config.SmsConfig;
|
||||
import org.dromara.sms4j.provider.factory.BaseProviderFactory;
|
||||
import org.dromara.sms4j.provider.factory.ProviderFactoryHolder;
|
||||
import org.dromara.sms4j.qiniu.config.QiNiuFactory;
|
||||
import org.dromara.sms4j.starter.adepter.ConfigCombineMapAdeptor;
|
||||
import org.dromara.sms4j.tencent.config.TencentFactory;
|
||||
import org.dromara.sms4j.unisms.config.UniFactory;
|
||||
@ -40,7 +45,7 @@ import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
public class SmsBlendsInitializer {
|
||||
private List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
|
||||
private final List<BaseProviderFactory<? extends SmsBlend, ? extends SupplierConfig>> factoryList;
|
||||
|
||||
private final SmsConfig smsConfig;
|
||||
private final Map<String, Map<String, Object>> blends;
|
||||
@ -119,9 +124,11 @@ public class SmsBlendsInitializer {
|
||||
ProviderFactoryHolder.registerFactory(ZhutongFactory.instance());
|
||||
ProviderFactoryHolder.registerFactory(LianLuFactory.instance());
|
||||
ProviderFactoryHolder.registerFactory(DingZhongFactory.instance());
|
||||
ProviderFactoryHolder.registerFactory(QiNiuFactory.instance());
|
||||
if(SmsUtils.isClassExists("com.jdcloud.sdk.auth.CredentialsProvider")) {
|
||||
ProviderFactoryHolder.registerFactory(JdCloudFactory.instance());
|
||||
}
|
||||
log.debug("加载内置运营商完成!");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -30,24 +30,6 @@ public class SmsMainConfig {
|
||||
return BeanFactory.getSmsConfig();
|
||||
}
|
||||
|
||||
// /**
|
||||
// * 注入一个定时器
|
||||
// */
|
||||
// @Bean
|
||||
// @Lazy
|
||||
// protected DelayedTime delayedTime() {
|
||||
// return BeanFactory.getDelayedTime();
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 注入线程池
|
||||
// */
|
||||
// @Bean("smsExecutor")
|
||||
// @Lazy
|
||||
// protected Executor taskExecutor(SmsConfig config) {
|
||||
// return BeanFactory.setExecutor(config);
|
||||
// }
|
||||
|
||||
/**
|
||||
* 注入一个配置文件读取工具
|
||||
*/
|
||||
|
||||
@ -1,8 +1,6 @@
|
||||
package org.dromara.sms4j.starter.holder;
|
||||
|
||||
import org.dromara.sms4j.api.dao.SmsDao;
|
||||
import org.dromara.sms4j.api.dao.SmsDaoDefaultImpl;
|
||||
import org.dromara.sms4j.comm.utils.SmsUtils;
|
||||
import org.dromara.sms4j.starter.utils.SmsSpringUtils;
|
||||
|
||||
public class SpringSmsDaoHolder {
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package org.dromara.sms4j.starter.utils;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeansException;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
@ -19,6 +20,7 @@ import java.util.Map;
|
||||
@Slf4j
|
||||
public class SmsSpringUtils implements ApplicationContextAware {
|
||||
|
||||
@Getter
|
||||
private static ApplicationContext applicationContext;
|
||||
|
||||
private final DefaultListableBeanFactory beanFactory;
|
||||
@ -27,10 +29,6 @@ public class SmsSpringUtils implements ApplicationContextAware {
|
||||
this.beanFactory = beanFactory;
|
||||
}
|
||||
|
||||
public static ApplicationContext getApplicationContext() {
|
||||
return applicationContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
||||
if (SmsSpringUtils.applicationContext == null) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user