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
03e6690a
Commit
03e6690a
authored
Sep 24, 2025
by
zhangxingmin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
xxl-job
parent
ed904f15
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
198 additions
and
95 deletions
+198
-95
yd-email-api/src/main/java/com/yd/email/api/config/RestTemplateConfig.java
+15
-0
yd-email-api/src/main/java/com/yd/email/api/config/XxlJobConfig.java
+44
-0
yd-email-api/src/main/java/com/yd/email/api/controller/ApiEmailSendController.java
+0
-52
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
+73
-39
yd-email-api/src/main/java/com/yd/email/api/service/impl/XxlJobServiceImpl.java
+0
-0
yd-email-api/src/main/resources/bootstrap.yml
+1
-1
yd-email-feign/src/main/java/com/yd/email/feign/dto/ApiEmailTaskRecipientsDto.java
+23
-0
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiSendEmailRequest.java
+29
-1
yd-email-feign/src/main/java/com/yd/email/feign/response/ApiSendEmailResponse.java
+11
-0
yd-email-service/src/main/java/com/yd/email/service/model/EmailTask.java
+2
-2
No files found.
yd-email-api/src/main/java/com/yd/email/api/config/RestTemplateConfig.java
0 → 100644
View file @
03e6690a
package
com
.
yd
.
email
.
api
.
config
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.web.client.RestTemplate
;
@Configuration
public
class
RestTemplateConfig
{
@Bean
public
RestTemplate
restTemplate
()
{
return
new
RestTemplate
();
}
}
\ No newline at end of file
yd-email-api/src/main/java/com/yd/email/api/config/XxlJobConfig.java
0 → 100644
View file @
03e6690a
package
com
.
yd
.
email
.
api
.
config
;
import
com.xxl.job.core.executor.impl.XxlJobSpringExecutor
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnClass
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
@Slf4j
@Configuration
@ConditionalOnClass
(
XxlJobSpringExecutor
.
class
)
public
class
XxlJobConfig
{
@Value
(
"${xxl.job.admin.addresses}"
)
private
String
adminAddresses
;
@Value
(
"${xxl.job.executor.appname}"
)
private
String
appname
;
@Value
(
"${xxl.job.executor.port:9999}"
)
private
int
port
;
@Value
(
"${xxl.job.accessToken:}"
)
private
String
accessToken
;
@Bean
public
XxlJobSpringExecutor
xxlJobExecutor
()
{
log
.
info
(
">>>>>>>>>>> xxl-job config init. appname: {}, port: {}, accessToken: {}"
,
appname
,
port
,
StringUtils
.
isNotBlank
(
accessToken
)
?
"已配置"
:
"未配置"
);
XxlJobSpringExecutor
xxlJobSpringExecutor
=
new
XxlJobSpringExecutor
();
xxlJobSpringExecutor
.
setAdminAddresses
(
adminAddresses
);
xxlJobSpringExecutor
.
setAppname
(
appname
);
xxlJobSpringExecutor
.
setPort
(
port
);
// 设置accessToken
xxlJobSpringExecutor
.
setAccessToken
(
accessToken
);
xxlJobSpringExecutor
.
setLogRetentionDays
(
30
);
return
xxlJobSpringExecutor
;
}
}
\ No newline at end of file
yd-email-api/src/main/java/com/yd/email/api/controller/ApiEmailSendController.java
View file @
03e6690a
...
@@ -27,55 +27,4 @@ public class ApiEmailSendController implements ApiEmailSendFeignClient {
...
@@ -27,55 +27,4 @@ public class ApiEmailSendController implements ApiEmailSendFeignClient {
public
Result
<
ApiSendEmailResponse
>
sendEmail
(
ApiSendEmailRequest
request
)
{
public
Result
<
ApiSendEmailResponse
>
sendEmail
(
ApiSendEmailRequest
request
)
{
return
apiEmailSendService
.
sendEmail
(
request
);
return
apiEmailSendService
.
sendEmail
(
request
);
}
}
// @Autowired
// private MailTaskMapper mailTaskMapper;
//
// @Autowired
// private MailRecipientMapper mailRecipientMapper;
//
// @Autowired
// private XxlJobService xxlJobService;
//
// @PostMapping("/send")
// public ResponseResult sendMail(@RequestBody MailSendRequest request) {
// try {
// // 1. 保存邮件任务到数据库
// MailTask mailTask = new MailTask();
// mailTask.setFromAddress(request.getFrom());
// mailTask.setSubject(request.getSubject());
// mailTask.setContent(request.getContent());
// mailTask.setAttachmentPath(request.getAttachmentPath());
// mailTask.setSendTime(request.getSendTime());
// mailTask.setStatus(0);
// mailTaskMapper.insert(mailTask);
//
// Long taskId = mailTask.getId();
//
// // 2. 保存收件人信息
// for (MailSendRequest.Recipient recipient : request.getRecipients()) {
// MailRecipient mailRecipient = new MailRecipient();
// mailRecipient.setTaskId(taskId);
// mailRecipient.setToAddress(recipient.getTo());
// if (recipient.getCc() != null && !recipient.getCc().isEmpty()) {
// mailRecipient.setCcAddresses(String.join(",", recipient.getCc()));
// }
// mailRecipient.setSendStatus(0);
// mailRecipientMapper.insert(mailRecipient);
// }
//
// // 3. 创建XXL-Job定时任务
// String jobId = xxlJobService.addScheduleJob(taskId, request.getSendTime());
//
// return ResponseResult.success("邮件任务创建成功", Map.of(
// "taskId", taskId,
// "jobId", jobId,
// "scheduleTime", request.getSendTime()
// ));
//
// } catch (Exception e) {
// log.error("创建邮件发送任务失败", e);
// return ResponseResult.error("创建任务失败: " + e.getMessage());
// }
// }
}
}
\ No newline at end of file
yd-email-api/src/main/java/com/yd/email/api/service/impl/ApiEmailSendServiceImpl.java
View file @
03e6690a
package
com
.
yd
.
email
.
api
.
service
.
impl
;
package
com
.
yd
.
email
.
api
.
service
.
impl
;
import
com.yd.common.enums.CommonEnum
;
import
com.yd.common.exception.BusinessException
;
import
com.yd.common.result.Result
;
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.ApiEmailSendService
;
import
com.yd.email.api.service.XxlJobService
;
import
com.yd.email.api.service.XxlJobService
;
import
com.yd.email.feign.enums.EmailTaskStatusEnum
;
import
com.yd.email.feign.request.ApiSendEmailRequest
;
import
com.yd.email.feign.request.ApiSendEmailRequest
;
import
com.yd.email.feign.response.ApiSendEmailResponse
;
import
com.yd.email.feign.response.ApiSendEmailResponse
;
import
com.yd.email.service.model.EmailTask
;
import
com.yd.email.service.model.EmailTaskRecipients
;
import
com.yd.email.service.service.IEmailTaskService
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.stream.Collectors
;
/**
/**
* 邮件发送实现类
* 邮件发送实现类
...
@@ -19,6 +31,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
...
@@ -19,6 +31,9 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
@Autowired
@Autowired
private
XxlJobService
xxlJobService
;
private
XxlJobService
xxlJobService
;
@Autowired
private
IEmailTaskService
iEmailTaskService
;
/**
/**
* 发送邮件
* 发送邮件
* @param request
* @param request
...
@@ -26,44 +41,63 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
...
@@ -26,44 +41,63 @@ public class ApiEmailSendServiceImpl implements ApiEmailSendService {
*/
*/
@Override
@Override
public
Result
<
ApiSendEmailResponse
>
sendEmail
(
ApiSendEmailRequest
request
)
{
public
Result
<
ApiSendEmailResponse
>
sendEmail
(
ApiSendEmailRequest
request
)
{
// try {
ApiSendEmailResponse
response
=
new
ApiSendEmailResponse
();
// // 1. 保存邮件任务到数据库
try
{
// MailTask mailTask = new MailTask();
//保存邮件任务到数据库
// mailTask.setFromAddress(request.getFrom());
EmailTask
mailTask
=
new
EmailTask
();
// mailTask.setSubject(request.getSubject());
//邮件任务唯一业务ID
// mailTask.setContent(request.getContent());
mailTask
.
setTaskBizId
(
RandomStringGenerator
.
generateBizId16
(
CommonEnum
.
UID_TYPE_EMAIL_TASK
.
getCode
()));
// mailTask.setAttachmentPath(request.getAttachmentPath());
//任务名称:邮件主题 + 邮件发送任务
// mailTask.setSendTime(request.getSendTime());
mailTask
.
setTaskName
(
request
.
getSubject
()
+
"邮件发送任务"
);
// mailTask.setStatus(0);
//关联发件人唯一业务ID
// mailTaskMapper.insert(mailTask);
mailTask
.
setSenderBizId
(
request
.
getSenderBizId
());
//
//发件人邮箱
// Long taskId = mailTask.getId();
mailTask
.
setSendEmail
(
request
.
getSendEmail
());
//
//邮件主题
// // 2. 保存收件人信息
mailTask
.
setSubject
(
request
.
getSubject
());
// for (MailSendRequest.Recipient recipient : request.getRecipients()) {
//邮件内容
// MailRecipient mailRecipient = new MailRecipient();
mailTask
.
setContent
(
request
.
getContent
());
// mailRecipient.setTaskId(taskId);
//发送邮件的附件路径(多个用分号分隔)
// mailRecipient.setToAddress(recipient.getTo());
mailTask
.
setAttachmentPath
(
request
.
getAttachmentPath
());
// if (recipient.getCc() != null && !recipient.getCc().isEmpty()) {
//计划发送时间(为空表示立即发送,不为空表示定时发送)
// mailRecipient.setCcAddresses(String.join(",", recipient.getCc()));
mailTask
.
setScheduleTime
(
request
.
getScheduleTime
());
// }
//任务状态:计划发送时间(为空表示立即发送状态为发送中,不为空表示发送状态为定时发送)
// mailRecipient.setSendStatus(0);
String
taskStatus
=
!
Objects
.
isNull
(
request
.
getScheduleTime
())
?
EmailTaskStatusEnum
.
SCHEDULED
.
getItemValue
()
:
EmailTaskStatusEnum
.
SENDING
.
getItemValue
();
// mailRecipientMapper.insert(mailRecipient);
mailTask
.
setStatus
(
taskStatus
);
// }
iEmailTaskService
.
saveOrUpdate
(
mailTask
);
//
// // 3. 创建XXL-Job定时任务
//邮件任务唯一业务ID
// String jobId = xxlJobService.addScheduleJob(taskId, request.getSendTime());
String
taskBizId
=
mailTask
.
getTaskBizId
();
//
// return ResponseResult.success("邮件任务创建成功", Map.of(
// 保存收件人信息
// "taskId", taskId,
if
(!
CollectionUtils
.
isEmpty
(
request
.
getRecipientsDtoList
()))
{
// "jobId", jobId,
List
<
EmailTaskRecipients
>
recipientsList
=
request
.
getRecipientsDtoList
()
// "scheduleTime", request.getSendTime()
.
stream
().
map
(
dto
->
{
// ));
EmailTaskRecipients
mailRecipient
=
new
EmailTaskRecipients
();
//
//邮件任务唯一业务ID
// } catch (Exception e) {
mailRecipient
.
setTaskBizId
(
taskBizId
);
// log.error("创建邮件发送任务失败", e);
mailRecipient
.
setStatus
(
taskStatus
);
// return ResponseResult.error("创建任务失败: " + e.getMessage());
mailRecipient
.
setContactBizId
(
dto
.
getContactBizId
());
// }
mailRecipient
.
setReceiveEmail
(
dto
.
getReceiveEmail
());
return
null
;
//抄送人邮箱(多个用分号分隔)
mailRecipient
.
setCcEmail
(!
CollectionUtils
.
isEmpty
(
dto
.
getCcEmailList
())
?
String
.
join
(
";"
,
dto
.
getCcEmailList
())
:
""
);
return
mailRecipient
;
}).
collect
(
Collectors
.
toList
());
}
//计划发送时间(为空表示立即发送,不为空表示定时发送)
String
jobId
=
""
;
if
(!
Objects
.
isNull
(
request
.
getScheduleTime
()))
{
//创建XXL-Job定时任务
jobId
=
xxlJobService
.
addScheduleJob
(
taskBizId
,
DateUtil
.
convertDateByLocalDateTime
(
request
.
getScheduleTime
()));
}
response
.
setJobId
(
jobId
);
response
.
setScheduleTime
(
request
.
getScheduleTime
());
response
.
setTaskBizId
(
taskBizId
);
return
Result
.
success
(
response
);
}
catch
(
Exception
e
)
{
log
.
error
(
"创建邮件发送任务失败"
,
e
);
throw
new
BusinessException
(
"创建邮件发送任务失败"
);
}
}
}
}
}
yd-email-api/src/main/java/com/yd/email/api/service/impl/XxlJobServiceImpl.java
View file @
03e6690a
This diff is collapsed.
Click to expand it.
yd-email-api/src/main/resources/bootstrap.yml
View file @
03e6690a
...
@@ -44,7 +44,7 @@ spring:
...
@@ -44,7 +44,7 @@ spring:
# 配置中心
# 配置中心
config
:
config
:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace
:
b3b01715-eb85-4242-992a-5aff03d864d4
namespace
:
8fbea9a4-b626-46de-a4e6-9d23f6609318
# nacos的ip地址和端口
# nacos的ip地址和端口
server-addr
:
139.224.145.34:8848
server-addr
:
139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
...
...
yd-email-feign/src/main/java/com/yd/email/feign/dto/ApiEmailTaskRecipientsDto.java
0 → 100644
View file @
03e6690a
package
com
.
yd
.
email
.
feign
.
dto
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
ApiEmailTaskRecipientsDto
{
/**
* 收件人唯一业务ID(联系人唯一业务ID)有就传值,没有就不传值
*/
private
String
contactBizId
;
/**
* 收件人邮箱(单个)
*/
private
String
receiveEmail
;
/**
* 抄送人邮箱(数组)
*/
private
List
<
String
>
ccEmailList
;
}
yd-email-feign/src/main/java/com/yd/email/feign/request/ApiSendEmailRequest.java
View file @
03e6690a
package
com
.
yd
.
email
.
feign
.
request
;
package
com
.
yd
.
email
.
feign
.
request
;
import
com.yd.email.feign.dto.ApiEmailTaskRecipientsDto
;
import
lombok.Data
;
import
lombok.Data
;
import
javax.validation.constraints.NotBlank
;
import
javax.validation.constraints.NotBlank
;
import
java.time.LocalDateTime
;
import
java.util.List
;
@Data
@Data
public
class
ApiSendEmailRequest
{
public
class
ApiSendEmailRequest
{
/**
/**
* 发件人唯一业务ID
*/
private
String
senderBizId
;
/**
* 发件人邮箱(单个)
* 发件人邮箱(单个)
*/
*/
@NotBlank
(
message
=
"发件人邮箱不能为空"
)
@NotBlank
(
message
=
"发件人邮箱不能为空"
)
...
@@ -18,4 +25,25 @@ public class ApiSendEmailRequest {
...
@@ -18,4 +25,25 @@ public class ApiSendEmailRequest {
*/
*/
@NotBlank
(
message
=
"邮件主题不能为空"
)
@NotBlank
(
message
=
"邮件主题不能为空"
)
private
String
subject
;
private
String
subject
;
/**
* 邮件内容
*/
@NotBlank
(
message
=
"邮件内容不能为空"
)
private
String
content
;
/**
* 计划发送时间(为空表示立即发送,不为空表示定时发送)
*/
private
LocalDateTime
scheduleTime
;
/**
* 发送邮件的附件路径(多个用分号分隔)
*/
private
String
attachmentPath
;
/**
* 收件人列表信息
*/
private
List
<
ApiEmailTaskRecipientsDto
>
recipientsDtoList
;
}
}
yd-email-feign/src/main/java/com/yd/email/feign/response/ApiSendEmailResponse.java
View file @
03e6690a
...
@@ -2,6 +2,17 @@ package com.yd.email.feign.response;
...
@@ -2,6 +2,17 @@ package com.yd.email.feign.response;
import
lombok.Data
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
@Data
@Data
public
class
ApiSendEmailResponse
{
public
class
ApiSendEmailResponse
{
private
String
jobId
;
private
String
taskBizId
;
/**
* 计划发送时间(为空表示立即发送,不为空表示定时发送)
*/
private
LocalDateTime
scheduleTime
;
}
}
yd-email-service/src/main/java/com/yd/email/service/model/EmailTask.java
View file @
03e6690a
...
@@ -79,13 +79,13 @@ public class EmailTask implements Serializable {
...
@@ -79,13 +79,13 @@ public class EmailTask implements Serializable {
private
String
status
;
private
String
status
;
/**
/**
* 计划发送时间(为空表示立即发送)
* 计划发送时间(为空表示立即发送
,不为空表示定时发送
)
*/
*/
@TableField
(
"schedule_time"
)
@TableField
(
"schedule_time"
)
private
LocalDateTime
scheduleTime
;
private
LocalDateTime
scheduleTime
;
/**
/**
* 实际发送时间
* 实际发送时间
(发送成功的时间)
*/
*/
@TableField
(
"send_time"
)
@TableField
(
"send_time"
)
private
LocalDateTime
sendTime
;
private
LocalDateTime
sendTime
;
...
...
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