Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-email
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
xingmin
yd-email
Commits
77d8eae8
Commit
77d8eae8
authored
Sep 29, 2025
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复
parent
4ca6b316
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
191 additions
and
6 deletions
+191
-6
yd-email-api/src/main/java/com/yd/email/api/controller/ApiEmailSenderConfigController.java
+9
-0
yd-email-api/src/main/java/com/yd/email/api/handler/EmailSendJobHandler.java
+1
-1
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailConfigValidatorService.java
+9
-0
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailSenderConfigService.java
+3
-0
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailConfigValidatorServiceImpl.java
+80
-0
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
+1
-1
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSenderConfigServiceImpl.java
+25
-2
yd-email-feign/src/main/java/com/yd/email/feign/client/ApiEmailSenderConfigFeignClient.java
+11
-0
yd-email-feign/src/main/java/com/yd/email/feign/fallback/ApiEmailSenderConfigFeignFallbackFactory.java
+6
-0
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiEmailSenderConfigPageRequest.java
+4
-0
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiEmailSenderValidateRequest.java
+30
-0
yd-email-service/src/main/java/com/yd/email/service/model/EmailProviderConfig.java
+6
-0
yd-email-service/src/main/resources/mappers/EmailSenderConfigMapper.xml
+6
-2
No files found.
yd-email-api/src/main/java/com/yd/email/api/controller/ApiEmailSenderConfigController.java
View file @
77d8eae8
...
...
@@ -7,6 +7,7 @@ import com.yd.email.feign.client.ApiEmailSenderConfigFeignClient;
import
com.yd.email.feign.request.ApiEmailSenderConfigAddRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigEditRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigPageRequest
;
import
com.yd.email.feign.request.ApiEmailSenderValidateRequest
;
import
com.yd.email.feign.response.ApiEmailSenderConfigDetailResponse
;
import
com.yd.email.feign.response.ApiEmailSenderConfigPageResponse
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -77,4 +78,12 @@ public class ApiEmailSenderConfigController implements ApiEmailSenderConfigFeign
public
Result
del
(
String
senderBizId
)
{
return
apiEmailSenderConfigService
.
del
(
senderBizId
);
}
/**
* 验证发件人邮箱配置(测试连接)
*/
@Override
public
Result
validateEmailConfig
(
ApiEmailSenderValidateRequest
request
)
{
return
apiEmailSenderConfigService
.
validateEmailConfig
(
request
);
}
}
yd-email-api/src/main/java/com/yd/email/api/handler/EmailSendJobHandler.java
View file @
77d8eae8
...
...
@@ -97,7 +97,7 @@ public class EmailSendJobHandler {
try
{
// 添加发送间隔,避免频率过高
if
(
successCount
>
0
)
{
Thread
.
sleep
(
2000
);
// 2
秒间隔
Thread
.
sleep
(
1000
);
// 1
秒间隔
}
// 处理抄送人列表:将数据库中的逗号分隔字符串转换为List
List
<
String
>
ccEmailList
=
StringUtils
.
isNotBlank
(
recipient
.
getCcEmail
())
?
...
...
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailConfigValidatorService.java
0 → 100644
View file @
77d8eae8
package
com
.
yd
.
email
.
api
.
service
;
import
com.yd.common.result.Result
;
import
com.yd.email.service.model.EmailProviderConfig
;
public
interface
ApiEmailConfigValidatorService
{
Result
testSmtpConnection
(
String
email
,
String
password
,
EmailProviderConfig
config
);
}
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailSenderConfigService.java
View file @
77d8eae8
...
...
@@ -6,6 +6,7 @@ import com.yd.email.feign.dto.ApiEmailSenderConfigDto;
import
com.yd.email.feign.request.ApiEmailSenderConfigAddRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigEditRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigPageRequest
;
import
com.yd.email.feign.request.ApiEmailSenderValidateRequest
;
import
com.yd.email.feign.response.ApiEmailSenderConfigDetailResponse
;
import
com.yd.email.feign.response.ApiEmailSenderConfigPageResponse
;
...
...
@@ -22,4 +23,6 @@ public interface ApiEmailSenderConfigService {
Result
del
(
String
senderBizId
);
Result
<
ApiEmailSenderConfigDto
>
getApiEmailSenderConfigDto
(
String
senderBizId
);
Result
validateEmailConfig
(
ApiEmailSenderValidateRequest
request
);
}
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailConfigValidatorServiceImpl.java
0 → 100644
View file @
77d8eae8
package
com
.
yd
.
email
.
api
.
service
.
impl
;
import
com.yd.common.exception.BusinessException
;
import
com.yd.common.result.Result
;
import
com.yd.email.api.service.ApiEmailConfigValidatorService
;
import
com.yd.email.service.model.EmailProviderConfig
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.stereotype.Service
;
import
javax.mail.AuthenticationFailedException
;
import
javax.mail.MessagingException
;
import
javax.mail.Session
;
import
javax.mail.Transport
;
import
java.util.Properties
;
/**
* 验证发件人邮箱配置的合法性
*/
@Slf4j
@Service
public
class
ApiEmailConfigValidatorServiceImpl
implements
ApiEmailConfigValidatorService
{
/**
* 测试SMTP连接
* @param email
* @param password
* @param config
* @return
*/
@Override
public
Result
testSmtpConnection
(
String
email
,
String
password
,
EmailProviderConfig
config
)
{
Properties
props
=
new
Properties
();
props
.
put
(
"mail.smtp.auth"
,
"true"
);
props
.
put
(
"mail.smtp.starttls.enable"
,
config
.
getStarttlsEnable
()
==
1
?
"true"
:
"false"
);
props
.
put
(
"mail.smtp.host"
,
config
.
getSmtpHost
());
props
.
put
(
"mail.smtp.port"
,
config
.
getSmtpPort
());
props
.
put
(
"mail.smtp.connectiontimeout"
,
"10000"
);
props
.
put
(
"mail.smtp.timeout"
,
"15000"
);
// SSL配置
if
(
"465"
.
equals
(
config
.
getSmtpPort
()))
{
props
.
put
(
"mail.smtp.socketFactory.port"
,
config
.
getSmtpPort
());
props
.
put
(
"mail.smtp.socketFactory.class"
,
"javax.net.ssl.SSLSocketFactory"
);
props
.
put
(
"mail.smtp.socketFactory.fallback"
,
"false"
);
}
Session
session
=
Session
.
getInstance
(
props
);
try
{
Transport
transport
=
session
.
getTransport
(
"smtp"
);
transport
.
connect
(
config
.
getSmtpHost
(),
email
,
password
);
boolean
isConnected
=
transport
.
isConnected
();
transport
.
close
();
if
(
isConnected
)
{
return
Result
.
success
(
"验证成功"
);
}
else
{
throw
new
BusinessException
(
"SMTP连接测试失败"
);
}
}
catch
(
AuthenticationFailedException
e
)
{
throw
new
BusinessException
(
"认证失败:请检查邮箱地址和授权码是否正确"
);
}
catch
(
MessagingException
e
)
{
throw
new
BusinessException
(
"连接失败"
+
e
.
getMessage
());
}
}
/**
* 邮箱格式验证
* @param email
* @return
*/
private
boolean
isValidEmailFormat
(
String
email
)
{
String
emailRegex
=
"^[A-Za-z0-9+_.-]+@(.+)$"
;
return
email
!=
null
&&
email
.
matches
(
emailRegex
);
}
}
\ No newline at end of file
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
View file @
77d8eae8
...
...
@@ -126,7 +126,7 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
log
.
info
(
"遍历所有收件人,逐个发送邮件->recipient单个对象:{}"
,
JSON
.
toJSONString
(
recipient
));
// 添加发送间隔,避免频率过高
if
(
successCount
>
0
)
{
Thread
.
sleep
(
2000
);
// 2
秒间隔
Thread
.
sleep
(
1000
);
// 1
秒间隔
}
// 处理抄送人列表:将数据库中的逗号分隔字符串转换为List
...
...
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSenderConfigServiceImpl.java
View file @
77d8eae8
...
...
@@ -7,12 +7,14 @@ import com.yd.common.enums.ResultCode;
import
com.yd.common.exception.BusinessException
;
import
com.yd.common.result.Result
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.email.api.service.ApiEmailConfigValidatorService
;
import
com.yd.email.api.service.ApiEmailProviderConfigService
;
import
com.yd.email.api.service.ApiEmailSenderConfigService
;
import
com.yd.email.feign.dto.ApiEmailSenderConfigDto
;
import
com.yd.email.feign.request.ApiEmailSenderConfigAddRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigEditRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigPageRequest
;
import
com.yd.email.feign.request.ApiEmailSenderValidateRequest
;
import
com.yd.email.feign.response.ApiEmailSenderConfigDetailResponse
;
import
com.yd.email.feign.response.ApiEmailSenderConfigPageResponse
;
import
com.yd.email.service.dto.EmailSenderConfigDto
;
...
...
@@ -40,6 +42,9 @@ public class ApiEmailSenderConfigServiceImpl implements ApiEmailSenderConfigServ
@Autowired
private
ApiEmailProviderConfigService
apiEmailProviderConfigService
;
@Autowired
private
ApiEmailConfigValidatorService
apiEmailConfigValidatorService
;
/**
* 分页查询-发件人
* @param request
...
...
@@ -60,7 +65,10 @@ public class ApiEmailSenderConfigServiceImpl implements ApiEmailSenderConfigServ
@Override
public
Result
add
(
ApiEmailSenderConfigAddRequest
request
)
{
//校验邮箱服务商是否存在
apiEmailProviderConfigService
.
checkEmailProviderConfigIsExist
(
request
.
getProviderBizId
());
Result
<
EmailProviderConfig
>
result
=
apiEmailProviderConfigService
.
checkEmailProviderConfigIsExist
(
request
.
getProviderBizId
());
EmailProviderConfig
emailProviderConfig
=
result
.
getData
();
//测试SMTP连接,验证发件人邮箱配置的有效性(包括授权码有效性)
apiEmailConfigValidatorService
.
testSmtpConnection
(
request
.
getEmail
(),
request
.
getPassword
(),
emailProviderConfig
);
//校验邮箱名称唯一性
List
<
EmailSenderConfig
>
list
=
iEmailSenderConfigService
.
queryList
(
EmailSenderConfigDto
.
builder
()
.
email
(
request
.
getEmail
())
...
...
@@ -90,7 +98,10 @@ public class ApiEmailSenderConfigServiceImpl implements ApiEmailSenderConfigServ
EmailSenderConfig
emailSenderConfig
=
result
.
getData
();
Long
id
=
emailSenderConfig
.
getId
();
//校验邮箱服务商是否存在
apiEmailProviderConfigService
.
checkEmailProviderConfigIsExist
(
request
.
getProviderBizId
());
Result
<
EmailProviderConfig
>
result1
=
apiEmailProviderConfigService
.
checkEmailProviderConfigIsExist
(
request
.
getProviderBizId
());
EmailProviderConfig
emailProviderConfig
=
result1
.
getData
();
//测试SMTP连接,验证发件人邮箱配置的有效性(包括授权码有效性)
apiEmailConfigValidatorService
.
testSmtpConnection
(
request
.
getEmail
(),
request
.
getPassword
(),
emailProviderConfig
);
//校验邮箱名称唯一性
List
<
EmailSenderConfig
>
list
=
iEmailSenderConfigService
.
queryList
(
EmailSenderConfigDto
.
builder
()
.
email
(
request
.
getEmail
())
...
...
@@ -166,6 +177,18 @@ public class ApiEmailSenderConfigServiceImpl implements ApiEmailSenderConfigServ
}
/**
* 验证发件人邮箱配置
*/
@Override
public
Result
validateEmailConfig
(
ApiEmailSenderValidateRequest
request
)
{
//校验邮箱服务商是否存在
Result
<
EmailProviderConfig
>
result
=
apiEmailProviderConfigService
.
checkEmailProviderConfigIsExist
(
request
.
getProviderBizId
());
EmailProviderConfig
emailProviderConfig
=
result
.
getData
();
Result
result1
=
apiEmailConfigValidatorService
.
testSmtpConnection
(
request
.
getEmail
(),
request
.
getPassword
(),
emailProviderConfig
);
return
result1
;
}
/**
* 校验邮件发件人是否存在
* @param senderBizId
* @return
...
...
yd-email-feign/src/main/java/com/yd/email/feign/client/ApiEmailSenderConfigFeignClient.java
View file @
77d8eae8
...
...
@@ -5,11 +5,16 @@ import com.yd.email.feign.fallback.ApiEmailSenderConfigFeignFallbackFactory;
import
com.yd.email.feign.request.ApiEmailSenderConfigAddRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigEditRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigPageRequest
;
import
com.yd.email.feign.request.ApiEmailSenderValidateRequest
;
import
com.yd.email.feign.response.ApiEmailSenderConfigDetailResponse
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
import
javax.validation.Valid
;
import
java.util.Map
;
/**
* 邮箱服务-发件人配置信息Feign客户端
*/
...
...
@@ -55,4 +60,10 @@ public interface ApiEmailSenderConfigFeignClient {
*/
@DeleteMapping
(
"/del"
)
Result
del
(
@RequestParam
(
value
=
"senderBizId"
)
String
senderBizId
);
/**
* 验证发件人邮箱配置(测试连接)
*/
@PostMapping
(
"/validate"
)
Result
validateEmailConfig
(
@Validated
@RequestBody
ApiEmailSenderValidateRequest
request
);
}
yd-email-feign/src/main/java/com/yd/email/feign/fallback/ApiEmailSenderConfigFeignFallbackFactory.java
View file @
77d8eae8
...
...
@@ -5,6 +5,7 @@ import com.yd.email.feign.client.ApiEmailSenderConfigFeignClient;
import
com.yd.email.feign.request.ApiEmailSenderConfigAddRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigEditRequest
;
import
com.yd.email.feign.request.ApiEmailSenderConfigPageRequest
;
import
com.yd.email.feign.request.ApiEmailSenderValidateRequest
;
import
com.yd.email.feign.response.ApiEmailSenderConfigDetailResponse
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.cloud.openfeign.FallbackFactory
;
...
...
@@ -44,6 +45,11 @@ public class ApiEmailSenderConfigFeignFallbackFactory implements FallbackFactory
public
Result
del
(
String
senderBizId
)
{
return
null
;
}
@Override
public
Result
validateEmailConfig
(
ApiEmailSenderValidateRequest
request
)
{
return
null
;
}
};
}
}
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiEmailSenderConfigPageRequest.java
View file @
77d8eae8
...
...
@@ -24,4 +24,8 @@ public class ApiEmailSenderConfigPageRequest extends PageDto {
*/
private
String
providerName
;
/**
* 查询内容(模糊搜索邮箱或者发件人姓名)
*/
private
String
queryContent
;
}
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiEmailSenderValidateRequest.java
0 → 100644
View file @
77d8eae8
package
com
.
yd
.
email
.
feign
.
request
;
import
lombok.Data
;
import
javax.validation.constraints.Email
;
import
javax.validation.constraints.NotBlank
;
@Data
public
class
ApiEmailSenderValidateRequest
{
/**
* 邮箱地址
*/
@NotBlank
(
message
=
"邮箱地址不能为空"
)
@Email
(
message
=
"邮箱格式不正确"
)
private
String
email
;
/**
* 邮箱密码或授权码
*/
@NotBlank
(
message
=
"邮箱密码或授权码不能为空"
)
private
String
password
;
/**
* 绑定的邮箱服务商唯一业务ID
*/
@NotBlank
(
message
=
"绑定的邮箱服务商唯一业务ID不能为空"
)
private
String
providerBizId
;
}
yd-email-service/src/main/java/com/yd/email/service/model/EmailProviderConfig.java
View file @
77d8eae8
...
...
@@ -61,6 +61,12 @@ public class EmailProviderConfig implements Serializable {
private
Integer
sslEnabled
;
/**
* 是否启用TLS加密传输: 0-否, 1-是 默认1
*/
@TableField
(
"starttls_enabled"
)
private
Integer
starttlsEnable
;
/**
* 配置描述
*/
@TableField
(
"description"
)
...
...
yd-email-service/src/main/resources/mappers/EmailSenderConfigMapper.xml
View file @
77d8eae8
...
...
@@ -13,11 +13,15 @@
</if>
<if
test=
"request.email != null and request.email != ''"
>
and esc.email
= #{request.email}
and esc.email
like concat('%', #{request.email}, '%')
</if>
<if
test=
"request.providerName != null and request.providerName != ''"
>
and epc.provider_name = #{request.providerName}
and epc.provider_name like concat('%', #{request.providerName}, '%')
</if>
<if
test=
"request.queryContent != null and request.queryContent != ''"
>
and (esc.display_name like concat('%', #{request.queryContent}, '%') or esc.email like concat('%', #{request.queryContent}, '%'))
</if>
and esc.is_deleted = 0
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment