sms、邮件数据库配置

This commit is contained in:
2025-11-26 13:38:36 +08:00
parent 8d8ecf8763
commit 4ff1bc1101
16 changed files with 847 additions and 186 deletions

View File

@@ -0,0 +1,91 @@
package org.xyzh.common.config.properties;
import org.springframework.stereotype.Component;
/**
* @description 邮件配置属性
* @filename EmailConfigProperties.java
* @author yslg
* @copyright xyzh
* @since 2025-11-26
*/
@Component
public class EmailConfigProperties {
/** SMTP服务器地址 */
private String host;
/** SMTP端口 */
private Integer port;
/** 发件人邮箱 */
private String username;
/** 邮箱授权码 */
private String password;
/** 发件人名称 */
private String fromName;
/** 是否启用SSL */
private Boolean sslEnable;
/** 连接超时时间(毫秒) */
private Integer timeout;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFromName() {
return fromName;
}
public void setFromName(String fromName) {
this.fromName = fromName;
}
public Boolean getSslEnable() {
return sslEnable;
}
public void setSslEnable(Boolean sslEnable) {
this.sslEnable = sslEnable;
}
public Integer getTimeout() {
return timeout;
}
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
}

View File

@@ -0,0 +1,91 @@
package org.xyzh.common.config.properties;
import org.springframework.stereotype.Component;
/**
* @description 短信配置属性
* @filename SmsConfigProperties.java
* @author yslg
* @copyright xyzh
* @since 2025-11-26
*/
@Component
public class SmsConfigProperties {
/** 短信服务商 */
private String provider;
/** AccessKey ID */
private String accessKeyId;
/** AccessKey Secret */
private String accessKeySecret;
/** 短信签名 */
private String signName;
/** 登录验证码模板 */
private String templateCodeLogin;
/** 注册验证码模板 */
private String templateCodeRegister;
/** 请求超时时间(毫秒) */
private Integer timeout;
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getSignName() {
return signName;
}
public void setSignName(String signName) {
this.signName = signName;
}
public String getTemplateCodeLogin() {
return templateCodeLogin;
}
public void setTemplateCodeLogin(String templateCodeLogin) {
this.templateCodeLogin = templateCodeLogin;
}
public String getTemplateCodeRegister() {
return templateCodeRegister;
}
public void setTemplateCodeRegister(String templateCodeRegister) {
this.templateCodeRegister = templateCodeRegister;
}
public Integer getTimeout() {
return timeout;
}
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
}

View File

@@ -19,6 +19,13 @@
</properties>
<dependencies>
<!-- Common Core -->
<dependency>
<groupId>org.xyzh</groupId>
<artifactId>common-core</artifactId>
<version>1.0.0</version>
</dependency>
<!-- Apache POI for Excel -->
<dependency>
<groupId>org.apache.poi</groupId>

View File

@@ -3,11 +3,11 @@ package org.xyzh.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.xyzh.common.config.properties.EmailConfigProperties;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
@@ -27,8 +27,8 @@ public class EmailUtils {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username:}")
private String from;
@Autowired
private EmailConfigProperties emailConfigProperties;
/**
* 发送简单文本邮件
@@ -40,6 +40,7 @@ public class EmailUtils {
public boolean sendSimpleEmail(String to, String subject, String content) {
try {
SimpleMailMessage message = new SimpleMailMessage();
String from = emailConfigProperties.getUsername();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
@@ -66,6 +67,7 @@ public class EmailUtils {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
String from = emailConfigProperties.getUsername();
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);

View File

@@ -6,9 +6,10 @@ import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.xyzh.common.config.properties.SmsConfigProperties;
/**
* @description 短信发送工具类 - 支持多种短信服务商
@@ -22,29 +23,8 @@ public class SmsUtils {
private static final Logger logger = LoggerFactory.getLogger(SmsUtils.class);
@Value("${sms.enabled:false}")
private boolean enabled;
@Value("${sms.provider:aliyun}")
private String provider;
@Value("${sms.access-key-id:}")
private String accessKeyId;
@Value("${sms.access-key-secret:}")
private String accessKeySecret;
@Value("${sms.sign-name:红色思政学习平台}")
private String signName;
@Value("${sms.template-code:}")
private String templateCode;
@Value("${sms.region-id:cn-hangzhou}")
private String regionId;
@Value("${sms.endpoint:dysmsapi.aliyuncs.com}")
private String endpoint;
@Autowired
private SmsConfigProperties smsConfigProperties;
/**
* 发送短信验证码
@@ -54,16 +34,22 @@ public class SmsUtils {
*/
public boolean sendVerificationCode(String phone, String code) {
// 如果未启用短信服务,使用模拟模式
if (!enabled || !StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
String accessKeyId = smsConfigProperties.getAccessKeyId();
String accessKeySecret = smsConfigProperties.getAccessKeySecret();
if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
logger.warn("短信服务未配置或未启用,使用模拟模式");
logger.info("【模拟发送】短信验证码,手机号: {}, 验证码: {}", phone, code);
return true;
}
// 根据配置的服务商选择发送方式
String provider = smsConfigProperties.getProvider();
if (provider == null) provider = "aliyun";
switch (provider.toLowerCase()) {
case "aliyun":
return sendByAliyun(phone, code);
return sendByAliyun(phone, code, smsConfigProperties.getTemplateCodeLogin());
case "tencent":
logger.warn("腾讯云短信服务暂未实现,使用模拟模式");
logger.info("【模拟发送】短信验证码,手机号: {}, 验证码: {}", phone, code);
@@ -78,15 +64,16 @@ public class SmsUtils {
* 使用阿里云发送短信验证码
* @param phone 手机号
* @param code 验证码
* @param templateCode 短信模板CODE
* @return 是否发送成功
*/
private boolean sendByAliyun(String phone, String code) {
private boolean sendByAliyun(String phone, String code, String templateCode) {
try {
Client client = createAliyunClient();
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName(signName)
.setSignName(smsConfigProperties.getSignName())
.setTemplateCode(templateCode)
.setTemplateParam("{\"code\":\"" + code + "\"}");
@@ -112,9 +99,9 @@ public class SmsUtils {
*/
private Client createAliyunClient() throws Exception {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret)
.setEndpoint(endpoint);
.setAccessKeyId(smsConfigProperties.getAccessKeyId())
.setAccessKeySecret(smsConfigProperties.getAccessKeySecret())
.setEndpoint("dysmsapi.aliyuncs.com");
return new Client(config);
}
@@ -127,13 +114,19 @@ public class SmsUtils {
*/
public boolean sendSms(String phone, String templateCode, String templateParam) {
// 如果未启用短信服务,使用模拟模式
if (!enabled || !StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
String accessKeyId = smsConfigProperties.getAccessKeyId();
String accessKeySecret = smsConfigProperties.getAccessKeySecret();
if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
logger.warn("短信服务未配置或未启用,使用模拟模式");
logger.info("【模拟发送】短信,手机号: {}, 模板: {}, 参数: {}", phone, templateCode, templateParam);
return true;
}
// 根据配置的服务商选择发送方式
String provider = smsConfigProperties.getProvider();
if (provider == null) provider = "aliyun";
switch (provider.toLowerCase()) {
case "aliyun":
return sendSmsAliyun(phone, templateCode, templateParam);
@@ -156,7 +149,7 @@ public class SmsUtils {
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName(signName)
.setSignName(smsConfigProperties.getSignName())
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);
@@ -185,13 +178,19 @@ public class SmsUtils {
*/
public boolean sendBatchSms(String phones, String templateCode, String templateParam) {
// 如果未启用短信服务,使用模拟模式
if (!enabled || !StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
String accessKeyId = smsConfigProperties.getAccessKeyId();
String accessKeySecret = smsConfigProperties.getAccessKeySecret();
if (!StringUtils.hasText(accessKeyId) || !StringUtils.hasText(accessKeySecret)) {
logger.warn("短信服务未配置或未启用,使用模拟模式");
logger.info("【模拟发送】批量短信,手机号: {}, 模板: {}, 参数: {}", phones, templateCode, templateParam);
return true;
}
// 根据配置的服务商选择发送方式
String provider = smsConfigProperties.getProvider();
if (provider == null) provider = "aliyun";
switch (provider.toLowerCase()) {
case "aliyun":
return sendBatchSmsAliyun(phones, templateCode, templateParam);
@@ -214,7 +213,7 @@ public class SmsUtils {
SendSmsRequest request = new SendSmsRequest()
.setPhoneNumbers(phones)
.setSignName(signName)
.setSignName(smsConfigProperties.getSignName())
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);