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
f7bb6554
Commit
f7bb6554
authored
Sep 25, 2025
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
邮件发送
parent
527f11e7
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
114 additions
and
37 deletions
+114
-37
yd-email-api/src/main/java/com/yd/email/api/handler/EmailSendJobHandler.java
+7
-1
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailTaskRecipientsService.java
+7
-0
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
+18
-24
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailTaskRecipientsServiceImpl.java
+5
-3
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiSendEmailRequest.java
+9
-9
yd-email-feign/src/main/java/com/yd/email/feign/utils/StringUtil.java
+68
-0
No files found.
yd-email-api/src/main/java/com/yd/email/api/handler/EmailSendJobHandler.java
View file @
f7bb6554
...
...
@@ -9,6 +9,7 @@ import com.yd.email.api.service.ApiEmailService;
import
com.yd.email.feign.dto.ApiEmailSenderConfigDto
;
import
com.yd.email.feign.dto.ApiSendMailDto
;
import
com.yd.email.feign.enums.EmailTaskStatusEnum
;
import
com.yd.email.feign.utils.StringUtil
;
import
com.yd.email.service.model.EmailTask
;
import
com.yd.email.service.model.EmailTaskRecipients
;
import
com.yd.email.service.service.IEmailTaskRecipientsService
;
...
...
@@ -101,7 +102,12 @@ public class EmailSendJobHandler {
apiSendMailDto
.
setReceiveEmail
(
recipient
.
getReceiveEmail
());
//抄送人邮箱列表
apiSendMailDto
.
setCcEmailList
(
ccEmailList
);
//邮件内容
if
(
StringUtil
.
hasPlaceholdersSimple
(
apiSendMailDto
.
getContent
()))
{
//检测内容是否有占位符,有占位符就替换具体内容,每收件人的占位符内容是不一样的。
apiSendMailDto
.
setContent
(
StringUtil
.
replacePlaceholders
(
apiSendMailDto
.
getContent
(),
recipient
.
getVariables
()));
}
// 调用邮件服务发送邮件
apiEmailService
.
sendMail
(
apiSendMailDto
);
...
...
yd-email-api/src/main/java/com/yd/email/api/service/ApiEmailTaskRecipientsService.java
View file @
f7bb6554
package
com
.
yd
.
email
.
api
.
service
;
import
com.yd.common.result.Result
;
import
com.yd.email.service.model.EmailTaskRecipients
;
import
java.util.List
;
public
interface
ApiEmailTaskRecipientsService
{
Result
<
List
<
EmailTaskRecipients
>>
saveEmailTaskRecipientsBySessionId
(
String
taskBizId
,
String
status
,
String
sessionId
,
Integer
source
);
}
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
View file @
f7bb6554
...
...
@@ -6,15 +6,13 @@ import com.yd.common.exception.BusinessException;
import
com.yd.common.result.Result
;
import
com.yd.common.utils.DateUtil
;
import
com.yd.common.utils.RandomStringGenerator
;
import
com.yd.email.api.service.ApiEmailSendService
;
import
com.yd.email.api.service.ApiEmailSenderConfigService
;
import
com.yd.email.api.service.ApiEmailService
;
import
com.yd.email.api.service.XxlJobService
;
import
com.yd.email.api.service.*
;
import
com.yd.email.feign.dto.ApiEmailSenderConfigDto
;
import
com.yd.email.feign.dto.ApiSendMailDto
;
import
com.yd.email.feign.enums.EmailTaskStatusEnum
;
import
com.yd.email.feign.request.ApiSendEmailRequest
;
import
com.yd.email.feign.response.ApiSendEmailResponse
;
import
com.yd.email.feign.utils.StringUtil
;
import
com.yd.email.service.model.EmailTask
;
import
com.yd.email.service.model.EmailTaskRecipients
;
import
com.yd.email.service.service.IEmailTaskRecipientsService
;
...
...
@@ -24,13 +22,11 @@ import org.apache.commons.lang3.StringUtils;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
java.time.LocalDateTime
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.stream.Collectors
;
/**
* 邮件发送实现类
...
...
@@ -54,6 +50,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
@Autowired
private
ApiEmailService
apiEmailService
;
@Autowired
private
ApiEmailTaskRecipientsService
apiEmailTaskRecipientsService
;
/**
* 发送邮件
* @param request
...
...
@@ -87,31 +86,21 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
//变量分组唯一业务ID
mailTask
.
setVariableGroupBizId
(
request
.
getVariableGroupBizId
());
//邮件内容的填充的变量字段(数组分号分隔,英文字段名)
mailTask
.
setFillVariable
(!
CollectionUtils
.
isEmpty
(
request
.
getFillVariableList
())
?
String
.
join
(
";"
)
:
""
);
//
mailTask.setFillVariable(!CollectionUtils.isEmpty(request.getFillVariableList()) ? String.join(";") : "");
//导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值)
mailTask
.
setSessionId
(
request
.
getSessionId
());
iEmailTaskService
.
saveOrUpdate
(
mailTask
);
//邮件任务唯一业务ID
String
taskBizId
=
mailTask
.
getTaskBizId
();
//变量分组唯一业务ID不为空,来源是1-excel导入联系人 为空是0-选择联系人导入
Integer
source
=
StringUtils
.
isNotBlank
(
request
.
getVariableGroupBizId
())
?
1
:
0
;
// 保存收件人信息
List
<
EmailTaskRecipients
>
recipientsList
=
new
ArrayList
<>();
if
(!
CollectionUtils
.
isEmpty
(
request
.
getRecipientsDtoList
()))
{
recipientsList
=
request
.
getRecipientsDtoList
()
.
stream
().
map
(
dto
->
{
EmailTaskRecipients
mailRecipient
=
new
EmailTaskRecipients
();
//邮件任务唯一业务ID
mailRecipient
.
setTaskBizId
(
taskBizId
);
mailRecipient
.
setStatus
(
taskStatus
);
mailRecipient
.
setContactBizId
(
dto
.
getContactBizId
());
mailRecipient
.
setReceiveEmail
(
dto
.
getReceiveEmail
());
//抄送人邮箱(多个用分号分隔)
mailRecipient
.
setCcEmail
(!
CollectionUtils
.
isEmpty
(
dto
.
getCcEmailList
())
?
String
.
join
(
";"
,
dto
.
getCcEmailList
())
:
""
);
return
mailRecipient
;
}).
collect
(
Collectors
.
toList
());
iEmailTaskRecipientsService
.
saveOrUpdateBatch
(
recipientsList
);
}
//根据当前当前会话id和数据来源查询导入数据,保存到邮件任务收件人关联表中,供后续使用
Result
<
List
<
EmailTaskRecipients
>>
result
=
apiEmailTaskRecipientsService
.
saveEmailTaskRecipientsBySessionId
(
taskBizId
,
taskStatus
,
request
.
getSessionId
(),
source
);
List
<
EmailTaskRecipients
>
recipientsList
=
result
.
getData
();
//计划发送时间(为空表示立即发送,不为空表示定时发送)
String
jobId
=
""
;
...
...
@@ -167,7 +156,12 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
apiSendMailDto
.
setReceiveEmail
(
recipient
.
getReceiveEmail
());
//抄送人邮箱列表
apiSendMailDto
.
setCcEmailList
(
ccEmailList
);
//邮件内容
if
(
StringUtil
.
hasPlaceholdersSimple
(
apiSendMailDto
.
getContent
()))
{
//检测内容是否有占位符,有占位符就替换具体内容,每收件人的占位符内容是不一样的。
apiSendMailDto
.
setContent
(
StringUtil
.
replacePlaceholders
(
apiSendMailDto
.
getContent
(),
recipient
.
getVariables
()));
}
// 调用邮件服务发送邮件
apiEmailService
.
sendMail
(
apiSendMailDto
);
...
...
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailTaskRecipientsServiceImpl.java
View file @
f7bb6554
...
...
@@ -12,7 +12,7 @@ import org.springframework.beans.BeanUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.stream.Collectors
;
...
...
@@ -37,6 +37,7 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
* @param source 数据的来源 0-选择联系人导入 1-excel导入联系人
* @return
*/
@Override
public
Result
<
List
<
EmailTaskRecipients
>>
saveEmailTaskRecipientsBySessionId
(
String
taskBizId
,
String
status
,
String
sessionId
,
Integer
source
)
{
//根据当前当前会话id和数据来源查询的导入数据
...
...
@@ -45,9 +46,10 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
.
sessionId
(
sessionId
)
.
source
(
source
)
.
build
());
List
<
EmailTaskRecipients
>
saveRecipientsList
=
new
ArrayList
<>();
if
(!
CollectionUtils
.
isEmpty
(
emailContactImportList
))
{
//不为空,保存到邮件任务收件人关联表中
List
<
EmailTaskRecipients
>
saveRecipientsList
=
emailContactImportList
saveRecipientsList
=
emailContactImportList
.
stream
()
.
map
(
dto
->
{
EmailTaskRecipients
recipient
=
new
EmailTaskRecipients
();
...
...
@@ -60,6 +62,6 @@ public class ApiEmailTaskRecipientsServiceImpl implements ApiEmailTaskRecipients
iEmailTaskRecipientsService
.
saveOrUpdateBatch
(
saveRecipientsList
);
}
return
Result
.
success
();
return
Result
.
success
(
saveRecipientsList
);
}
}
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiSendEmailRequest.java
View file @
f7bb6554
...
...
@@ -42,10 +42,10 @@ public class ApiSendEmailRequest {
*/
private
String
attachmentPath
;
/**
* 收件人列表信息
*/
private
List
<
ApiEmailTaskRecipientsDto
>
recipientsDtoList
;
//
/**
//
* 收件人列表信息
//
*/
//
private List<ApiEmailTaskRecipientsDto> recipientsDtoList;
//===========以下是附加传入字段=============
/**
...
...
@@ -54,13 +54,13 @@ public class ApiSendEmailRequest {
private
String
variableGroupBizId
;
/**
* 导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值)
* 导入临时表的当前会话id(前端使用,用于查询。存于前端缓存)(冗余字段,选择联系人和导入联系人excel都有值
,用于发送到哪些收件人的,查询导入临时表的依据
)
*/
private
String
sessionId
;
/**
* 邮件内容的填充的变量字段(数组,英文字段名)
*/
private
List
<
String
>
fillVariableList
;
//
/**
//
* 邮件内容的填充的变量字段(数组,英文字段名)
//
*/
//
private List<String> fillVariableList;
}
yd-email-feign/src/main/java/com/yd/email/feign/utils/StringUtil.java
0 → 100644
View file @
f7bb6554
package
com
.
yd
.
email
.
feign
.
utils
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONArray
;
import
com.alibaba.fastjson.JSONObject
;
public
class
StringUtil
{
/**
* 替换邮件模板内容的变量占位符
* @param content 例:”{{name}} 你好,很高兴认识你。你今年{{age}}岁是吧“
* @param variables 变量和收件人数据json串(导入变量excel时插入)
* [{cn_key: 中文变量字段名,en_key: 英文变量字段名,content: 占位符内容}]
* 例:[{cn_key: '姓名',en_key: ’name‘,content: '张山'},{cn_key: '年龄',en_key: ’age‘,content: '28'}]
* @return
*/
public
static
String
replacePlaceholders
(
String
content
,
String
variables
)
{
// 解析 JSON 字符串
JSONArray
variablesArray
=
JSON
.
parseArray
(
variables
);
String
result
=
content
;
// 遍历变量数组,逐个替换占位符
for
(
int
i
=
0
;
i
<
variablesArray
.
size
();
i
++)
{
JSONObject
variable
=
variablesArray
.
getJSONObject
(
i
);
String
enKey
=
variable
.
getString
(
"en_key"
);
String
value
=
variable
.
getString
(
"content"
);
// 替换 {{en_key}} 为对应的值
result
=
result
.
replace
(
"{{"
+
enKey
+
"}}"
,
value
);
}
return
result
;
}
/**
* 检测内容是否有占位符
* @param content
* @return
*/
public
static
boolean
hasPlaceholders
(
String
content
)
{
if
(
content
==
null
)
{
return
false
;
}
// 匹配 {{任意内容}} 的模式
String
pattern
=
"\\{\\{[^}]*\\}\\}"
;
return
content
.
matches
(
".*"
+
pattern
+
".*"
);
}
/**
* 更严格的版本,要求{{}}之间有内容
* @param content
* @return
*/
public
static
boolean
hasValidPlaceholders
(
String
content
)
{
if
(
content
==
null
)
{
return
false
;
}
String
pattern
=
"\\{\\{\\w+\\}\\}"
;
// 只匹配字母数字下划线
return
content
.
matches
(
".*"
+
pattern
+
".*"
);
}
public
static
boolean
hasPlaceholdersSimple
(
String
content
)
{
if
(
content
==
null
)
{
return
false
;
}
return
content
.
contains
(
"{{"
)
&&
content
.
contains
(
"}}"
);
}
}
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