@@ -1,10 +1,10 @@
|
|||||||
package cn.iocoder.yudao.module.system.api.mail.dto;
|
package cn.iocoder.yudao.module.system.api.mail.dto;
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import jakarta.validation.constraints.Email;
|
import jakarta.validation.constraints.Email;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -36,7 +36,6 @@ public class MailSendSingleToUserReqDTO {
|
|||||||
*/
|
*/
|
||||||
private List<@Email String> bccMails;
|
private List<@Email String> bccMails;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮件模板编号
|
* 邮件模板编号
|
||||||
*/
|
*/
|
||||||
@@ -46,5 +45,9 @@ public class MailSendSingleToUserReqDTO {
|
|||||||
* 邮件模板参数
|
* 邮件模板参数
|
||||||
*/
|
*/
|
||||||
private Map<String, Object> templateParams;
|
private Map<String, Object> templateParams;
|
||||||
|
/**
|
||||||
|
* 附件内容
|
||||||
|
*/
|
||||||
|
private File[] attachments;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,10 @@ package cn.iocoder.yudao.module.system.api.mail;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleToUserReqDTO;
|
import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleToUserReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.service.mail.MailSendService;
|
import cn.iocoder.yudao.module.system.service.mail.MailSendService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||||
@@ -21,14 +20,14 @@ public class MailSendApiImpl implements MailSendApi {
|
|||||||
public CommonResult<Long> sendSingleMailToAdmin(MailSendSingleToUserReqDTO reqDTO) {
|
public CommonResult<Long> sendSingleMailToAdmin(MailSendSingleToUserReqDTO reqDTO) {
|
||||||
return success(mailSendService.sendSingleMailToAdmin(reqDTO.getUserId(),
|
return success(mailSendService.sendSingleMailToAdmin(reqDTO.getUserId(),
|
||||||
reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(),
|
reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(),
|
||||||
reqDTO.getTemplateCode(), reqDTO.getTemplateParams()));
|
reqDTO.getTemplateCode(), reqDTO.getTemplateParams(), reqDTO.getAttachments()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommonResult<Long> sendSingleMailToMember(MailSendSingleToUserReqDTO reqDTO) {
|
public CommonResult<Long> sendSingleMailToMember(MailSendSingleToUserReqDTO reqDTO) {
|
||||||
return success(mailSendService.sendSingleMailToMember(reqDTO.getUserId(),
|
return success(mailSendService.sendSingleMailToMember(reqDTO.getUserId(),
|
||||||
reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(),
|
reqDTO.getToMails(), reqDTO.getCcMails(), reqDTO.getBccMails(),
|
||||||
reqDTO.getTemplateCode(), reqDTO.getTemplateParams()));
|
reqDTO.getTemplateCode(), reqDTO.getTemplateParams(), reqDTO.getAttachments()));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
package cn.iocoder.yudao.module.system.mq.message.mail;
|
package cn.iocoder.yudao.module.system.mq.message.mail;
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import jakarta.validation.constraints.NotEmpty;
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮箱发送消息
|
* 邮箱发送消息
|
||||||
@@ -54,5 +53,9 @@ public class MailSendMessage {
|
|||||||
*/
|
*/
|
||||||
@NotEmpty(message = "邮件内容不能为空")
|
@NotEmpty(message = "邮件内容不能为空")
|
||||||
private String content;
|
private String content;
|
||||||
|
/**
|
||||||
|
* 邮件附件
|
||||||
|
*/
|
||||||
|
private File[] attachments;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
package cn.iocoder.yudao.module.system.mq.producer.mail;
|
package cn.iocoder.yudao.module.system.mq.producer.mail;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
|
import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import java.io.File;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mail 邮件相关消息的 Producer
|
* Mail 邮件相关消息的 Producer
|
||||||
@@ -39,12 +36,13 @@ public class MailProducer {
|
|||||||
*/
|
*/
|
||||||
public void sendMailSendMessage(Long sendLogId,
|
public void sendMailSendMessage(Long sendLogId,
|
||||||
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
||||||
Long accountId, String nickname, String title, String content) {
|
Long accountId, String nickname, String title, String content, File[] attachments) {
|
||||||
MailSendMessage message = new MailSendMessage()
|
MailSendMessage message = new MailSendMessage()
|
||||||
.setLogId(sendLogId)
|
.setLogId(sendLogId)
|
||||||
.setToMails(toMails).setCcMails(ccMails).setBccMails(bccMails)
|
.setToMails(toMails).setCcMails(ccMails).setBccMails(bccMails)
|
||||||
.setAccountId(accountId).setNickname(nickname)
|
.setAccountId(accountId).setNickname(nickname)
|
||||||
.setTitle(title).setContent(content);
|
.setTitle(title).setContent(content)
|
||||||
|
.setAttachments(attachments);
|
||||||
applicationContext.publishEvent(message);
|
applicationContext.publishEvent(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.mail;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
|
import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@@ -27,9 +28,9 @@ public interface MailSendService {
|
|||||||
*/
|
*/
|
||||||
default Long sendSingleMailToAdmin(Long userId,
|
default Long sendSingleMailToAdmin(Long userId,
|
||||||
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
||||||
String templateCode, Map<String, Object> templateParams) {
|
String templateCode, Map<String, Object> templateParams, File... attachments) {
|
||||||
return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.ADMIN.getValue(),
|
return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.ADMIN.getValue(),
|
||||||
templateCode, templateParams);
|
templateCode, templateParams, attachments);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -45,9 +46,9 @@ public interface MailSendService {
|
|||||||
*/
|
*/
|
||||||
default Long sendSingleMailToMember(Long userId,
|
default Long sendSingleMailToMember(Long userId,
|
||||||
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
||||||
String templateCode, Map<String, Object> templateParams) {
|
String templateCode, Map<String, Object> templateParams, File... attachments) {
|
||||||
return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.MEMBER.getValue(),
|
return sendSingleMail(toMails, ccMails, bccMails, userId, UserTypeEnum.MEMBER.getValue(),
|
||||||
templateCode, templateParams);
|
templateCode, templateParams, attachments);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,7 +65,7 @@ public interface MailSendService {
|
|||||||
*/
|
*/
|
||||||
Long sendSingleMail(Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
Long sendSingleMail(Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
||||||
Long userId, Integer userType,
|
Long userId, Integer userType,
|
||||||
String templateCode, Map<String, Object> templateParams);
|
String templateCode, Map<String, Object> templateParams, File... attachments);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行真正的邮件发送
|
* 执行真正的邮件发送
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import org.dromara.hutool.extra.mail.MailUtil;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -56,7 +57,8 @@ public class MailSendServiceImpl implements MailSendService {
|
|||||||
@Override
|
@Override
|
||||||
public Long sendSingleMail(Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
public Long sendSingleMail(Collection<String> toMails, Collection<String> ccMails, Collection<String> bccMails,
|
||||||
Long userId, Integer userType,
|
Long userId, Integer userType,
|
||||||
String templateCode, Map<String, Object> templateParams) {
|
String templateCode, Map<String, Object> templateParams,
|
||||||
|
File... attachments) {
|
||||||
// 1.1 校验邮箱模版是否合法
|
// 1.1 校验邮箱模版是否合法
|
||||||
MailTemplateDO template = validateMailTemplate(templateCode);
|
MailTemplateDO template = validateMailTemplate(templateCode);
|
||||||
// 1.2 校验邮箱账号是否合法
|
// 1.2 校验邮箱账号是否合法
|
||||||
@@ -94,7 +96,7 @@ public class MailSendServiceImpl implements MailSendService {
|
|||||||
// 发送 MQ 消息,异步执行发送短信
|
// 发送 MQ 消息,异步执行发送短信
|
||||||
if (isSend) {
|
if (isSend) {
|
||||||
mailProducer.sendMailSendMessage(sendLogId, toMailSet, ccMailSet, bccMailSet,
|
mailProducer.sendMailSendMessage(sendLogId, toMailSet, ccMailSet, bccMailSet,
|
||||||
account.getId(), template.getNickname(), title, content);
|
account.getId(), template.getNickname(), title, content, attachments);
|
||||||
}
|
}
|
||||||
return sendLogId;
|
return sendLogId;
|
||||||
}
|
}
|
||||||
@@ -119,11 +121,11 @@ public class MailSendServiceImpl implements MailSendService {
|
|||||||
public void doSendMail(MailSendMessage message) {
|
public void doSendMail(MailSendMessage message) {
|
||||||
// 1. 创建发送账号
|
// 1. 创建发送账号
|
||||||
MailAccountDO account = validateMailAccount(message.getAccountId());
|
MailAccountDO account = validateMailAccount(message.getAccountId());
|
||||||
MailAccount mailAccount = buildMailAccount(account, message.getNickname());
|
MailAccount mailAccount = buildMailAccount(account, message.getNickname());
|
||||||
// 2. 发送邮件
|
// 2. 发送邮件
|
||||||
try {
|
try {
|
||||||
String messageId = MailUtil.send(mailAccount, message.getToMails(), message.getCcMails(), message.getBccMails(),
|
String messageId = MailUtil.send(mailAccount, message.getToMails(), message.getCcMails(), message.getBccMails(),
|
||||||
message.getTitle(), message.getContent(), true);
|
message.getTitle(), message.getContent(), true, message.getAttachments());
|
||||||
// 3. 更新结果(成功)
|
// 3. 更新结果(成功)
|
||||||
mailLogService.updateMailSendResult(message.getLogId(), messageId, null);
|
mailLogService.updateMailSendResult(message.getLogId(), messageId, null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user