Commit afced9d420626919b9cf8e165a073abad9713b65

Authored by YunaiV
1 parent ea39dcc5

邮箱模块:完善发送 send 逻辑

Showing 12 changed files with 188 additions and 79 deletions
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
... ... @@ -145,9 +145,12 @@ public interface ErrorCodeConstants {
145 145 ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在");
146 146 ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002023001, "无法删除,该邮箱账号还有邮件模板");
147 147  
148   - // ========== 邮箱模版 1002024000 ==========
  148 + // ========== 邮件模版 1002024000 ==========
149 149 ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002024000, "邮件模版不存在");
150 150 ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1002024001, "邮件模版 code({}) 已存在");
151   - ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); // TODO 优化
  151 +
  152 + // ========== 邮件发送 1002025000 ==========
  153 + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002025000, "模板参数({})缺失");
  154 + ErrorCode MAIL_SEND_MAIL_NOT_EXISTS = new ErrorCode(1002025000, "邮箱不存在");
152 155  
153 156 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailAccountMapper.java
... ... @@ -17,9 +17,4 @@ public interface MailAccountMapper extends BaseMapperX<MailAccountDO> {
17 17 .likeIfPresent(MailAccountDO::getUsername , pageReqVO.getUsername()));
18 18 }
19 19  
20   - default MailAccountDO selectOneByFrom(String from){
21   - return selectOne(new QueryWrapperX<MailAccountDO>()
22   - .eqIfPresent("from_address" , from));
23   - }
24   -
25 20 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailAccountService.java
... ... @@ -23,6 +23,14 @@ public interface MailAccountService {
23 23 void initLocalCache();
24 24  
25 25 /**
  26 + * 从缓存中获取邮箱账号
  27 + *
  28 + * @param id 编号
  29 + * @return 邮箱账号
  30 + */
  31 + MailAccountDO getMailAccountFromCache(Long id);
  32 +
  33 + /**
26 34 * 创建邮箱账号
27 35 *
28 36 * @param createReqVO 邮箱账号信息
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailAccountServiceImpl.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailAccountServiceImpl.java
1   -package cn.iocoder.yudao.module.system.service.mail.impl;
  1 +package cn.iocoder.yudao.module.system.service.mail;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountCreateReqVO;
... ... @@ -8,8 +8,6 @@ import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert;
8 8 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
9 9 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper;
10 10 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
11   -import cn.iocoder.yudao.module.system.service.mail.MailAccountService;
12   -import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
13 11 import lombok.extern.slf4j.Slf4j;
14 12 import org.springframework.stereotype.Service;
15 13 import org.springframework.validation.annotation.Validated;
... ... @@ -21,8 +19,7 @@ import java.util.Map;
21 19  
22 20 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
23 21 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
24   -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS;
25   -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS;
  22 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
26 23  
27 24 /**
28 25 * 邮箱账号 Service 实现类
... ... @@ -64,6 +61,11 @@ public class MailAccountServiceImpl implements MailAccountService {
64 61 }
65 62  
66 63 @Override
  64 + public MailAccountDO getMailAccountFromCache(Long id) {
  65 + return mailAccountCache.get(id);
  66 + }
  67 +
  68 + @Override
67 69 public Long createMailAccount(MailAccountCreateReqVO createReqVO) {
68 70 // 插入
69 71 MailAccountDO account = MailAccountConvert.INSTANCE.convert(createReqVO);
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailLogServiceImpl.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailLogServiceImpl.java
1   -package cn.iocoder.yudao.module.system.service.mail.impl;
  1 +package cn.iocoder.yudao.module.system.service.mail;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.log.MailLogExportReqVO;
... ... @@ -28,7 +28,6 @@ import java.util.Objects;
28 28 @Validated
29 29 public class MailLogServiceImpl implements MailLogService {
30 30  
31   - // TODO @wangjingyi:private,然后使用 @Resource DONE
32 31 @Resource
33 32 private MailLogMapper mailLogMapper;
34 33  
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailSendService.java
1 1 package cn.iocoder.yudao.module.system.service.mail;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.send.MailReqVO;
5   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO;
6   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
7   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO;
8   -import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
9 3 import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
10 4  
11   -import javax.validation.Valid;
12   -import java.util.List;
13 5 import java.util.Map;
14 6  
15 7 /**
16   - * 邮箱模版服务类
  8 + * 邮件发送 Service 接口
17 9 *
18 10 * @author wangjingyi
19 11 * @since 2022-03-21
... ... @@ -21,17 +13,41 @@ import java.util.Map;
21 13 public interface MailSendService {
22 14  
23 15 /**
24   - * 发送邮件
  16 + * 发送单条邮件给管理后台的用户
25 17 *
  18 + * @param mail 邮箱
  19 + * @param userId 用户编码
26 20 * @param templateCode 邮件模版编码
27   - * @param from 邮箱
28   - * @param content 内容
29   - * @param templateParams 模版参数
30   - * @param to 收件人
  21 + * @param templateParams 邮件模版参数
  22 + * @return 发送日志编号
  23 + */
  24 + Long sendSingleMailToAdmin(String mail, Long userId,
  25 + String templateCode, Map<String, Object> templateParams);
  26 +
  27 + /**
  28 + * 发送单条邮件给用户 APP 的用户
  29 + *
  30 + * @param mail 邮箱
  31 + * @param userId 用户编码
  32 + * @param templateCode 邮件模版编码
  33 + * @param templateParams 邮件模版参数
  34 + * @return 发送日志编号
  35 + */
  36 + Long sendSingleMailToMember(String mail, Long userId,
  37 + String templateCode, Map<String, Object> templateParams);
  38 +
  39 + /**
  40 + * 发送单条邮件给用户
  41 + *
  42 + * @param mail 邮箱
31 43 * @param userId 用户编码
32 44 * @param userType 用户类型
  45 + * @param templateCode 邮件模版编码
  46 + * @param templateParams 邮件模版参数
  47 + * @return 发送日志编号
33 48 */
34   - void sendMail(Long userId, Integer userType, String templateCode, String from,String to, String content, Map<String, Object> templateParams);
  49 + Long sendSingleMail(String mail, Long userId, Integer userType,
  50 + String templateCode, Map<String, Object> templateParams);
35 51  
36 52 /**
37 53 * 执行真正的邮件发送
... ... @@ -40,4 +56,5 @@ public interface MailSendService {
40 56 * @param message 邮件
41 57 */
42 58 void doSendMail(MailSendMessage message);
  59 +
43 60 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailSendServiceImpl.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailSendServiceImpl.java
1   -package cn.iocoder.yudao.module.system.service.mail.impl;
  1 +package cn.iocoder.yudao.module.system.service.mail;
2 2  
  3 +import cn.hutool.core.util.StrUtil;
3 4 import cn.hutool.extra.mail.MailAccount;
4 5 import cn.hutool.extra.mail.MailUtil;
5 6 import cn.iocoder.yudao.framework.common.core.KeyValue;
6 7 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  8 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
7 9 import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert;
8 10 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
9 11 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
  12 +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
  13 +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
10 14 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper;
11 15 import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage;
12 16 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
13 17 import cn.iocoder.yudao.module.system.service.mail.MailLogService;
14 18 import cn.iocoder.yudao.module.system.service.mail.MailSendService;
15 19 import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
  20 +import cn.iocoder.yudao.module.system.service.member.MemberService;
  21 +import cn.iocoder.yudao.module.system.service.user.AdminUserService;
16 22 import com.google.common.annotations.VisibleForTesting;
17 23 import lombok.extern.slf4j.Slf4j;
18 24 import org.springframework.stereotype.Service;
... ... @@ -36,42 +42,70 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
36 42 @Validated
37 43 @Slf4j
38 44 public class MailSendServiceImpl implements MailSendService {
39   -
  45 +
  46 + @Resource
  47 + private AdminUserService adminUserService;
  48 + @Resource
  49 + private MemberService memberService;
  50 +
40 51 @Resource
41   - private MailAccountMapper mailAccountMapper;
  52 + private MailAccountService mailAccountService;
42 53 @Resource
43 54 private MailTemplateService mailTemplateService;
  55 +
44 56 @Resource
45 57 private MailLogService mailLogService;
46 58 @Resource
47 59 private MailProducer mailProducer;
48 60  
  61 + @Override
  62 + public Long sendSingleMailToAdmin(String mail, Long userId,
  63 + String templateCode, Map<String, Object> templateParams) {
  64 + // 如果 mail 为空,则加载用户编号对应的邮箱
  65 + if (StrUtil.isEmpty(mail)) {
  66 + AdminUserDO user = adminUserService.getUser(userId);
  67 + if (user != null) {
  68 + mail = user.getEmail();
  69 + }
  70 + }
  71 + // 执行发送
  72 + return sendSingleMail(mail, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams);
  73 + }
49 74  
50 75 @Override
51   - public void sendMail(Long userId, Integer userType, String templateCode, String from,String to, String content, Map<String, Object> templateParams) {
52   - // TODO @@wangjingyi:发送的时候,参考下短信;DONE
53   - //校验邮箱模版是否合法
54   - MailTemplateDO mailTemplateDO = this.checkMailTemplateValid(templateCode);
55   - // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
56   - Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(mailTemplateDO.getStatus());
57   - //校验账号信息是否合法
58   - MailAccountDO mailAccountDO = this.checkMailAccountValid(from);
59   - Map<String , String> params = MailAccountConvert.INSTANCE.convertToMap(mailAccountDO , content);
60   - content = mailTemplateService.formatMailTemplateContent(mailTemplateDO.getContent(), params);
61   - Long sendLogId = mailLogService.createMailLog(userId,userType,to,mailAccountDO , mailTemplateDO , content, templateParams, isSend);
62   - List<KeyValue<String,Object>> newTemplateParams = buildTemplateParams(mailTemplateDO,templateParams);
63   - // 发送 MQ 消息,异步执行发送短信
64   - if (isSend) {
65   - mailProducer.sendMailSendMessage(sendLogId,mailAccountDO , mailTemplateDO ,content, newTemplateParams,to);
  76 + public Long sendSingleMailToMember(String mail, Long userId,
  77 + String templateCode, Map<String, Object> templateParams) {
  78 + // 如果 mail 为空,则加载用户编号对应的邮箱
  79 + if (StrUtil.isEmpty(mail)) {
  80 + mail = memberService.getMemberUserEmail(userId);
66 81 }
  82 + // 执行发送
  83 + return sendSingleMail(mail, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams);
67 84 }
68 85  
69   - private MailAccountDO checkMailAccountValid(String from) {
70   - MailAccountDO mailAccountDO = mailAccountMapper.selectOneByFrom(from);
71   - if(null == mailAccountDO){
72   - throw exception(MAIL_ACCOUNT_NOT_EXISTS);
  86 + @Override
  87 + public Long sendSingleMail(String mail, Long userId, Integer userType,
  88 + String templateCode, Map<String, Object> templateParams) {
  89 + // 校验邮箱模版是否合法
  90 + MailTemplateDO template = checkMailTemplateValid(templateCode);
  91 + // 校验邮箱账号是否合法
  92 + MailAccountDO account = checkMailAccountValid(template.getAccountId());
  93 +
  94 + // 校验邮箱是否存在
  95 + mail = checkMail(mail);
  96 + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
  97 + List<KeyValue<String, Object>> newTemplateParams = buildTemplateParams(template, templateParams);
  98 +
  99 + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
  100 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus());
  101 + String content = mailTemplateService.formatMailTemplateContent(template.getContent(), templateParams);
  102 + Long sendLogId = mailLogService.createMailLog(userId, userType, mail,
  103 + account, template, content, templateParams, isSend); // TODO 芋艿:待测试
  104 + // 发送 MQ 消息,异步执行发送短信
  105 + if (isSend) {
  106 + mailProducer.sendMailSendMessage(sendLogId, account, template, content, newTemplateParams, mail); // TODO 芋艿:待测试
73 107 }
74   - return mailAccountDO;
  108 + return sendLogId;
75 109 }
76 110  
77 111 @Override
... ... @@ -80,22 +114,44 @@ public class MailSendServiceImpl implements MailSendService {
80 114 //装载账号信息
81 115 MailAccount account = MailAccountConvert.INSTANCE.convertAccount(message);
82 116 //发送邮件
83   - try{
  117 + try {
84 118 String messageId = MailUtil.send(account,message.getTo(),message.getTitle(),message.getContent(),false,null);
85 119 mailLogService.updateMailSendResult(message.getLogId() , messageId);
86   - }catch (Exception e){
  120 + } catch (Exception e){
87 121 mailLogService.updateFailMailSendResult(message.getLogId() , e.getMessage());
88 122 }
89   -
90 123 }
91 124  
92   - private MailTemplateDO checkMailTemplateValid(String templateCode) {
93   - MailTemplateDO mailTemplateDO = mailTemplateService.getMailTemplateByCodeFromCache(templateCode);
94   - if (mailTemplateDO == null){
  125 + @VisibleForTesting
  126 + public MailTemplateDO checkMailTemplateValid(String templateCode) {
  127 + // 获得邮件模板。考虑到效率,从缓存中获取
  128 + MailTemplateDO template = mailTemplateService.getMailTemplateByCodeFromCache(templateCode);
  129 + // 邮件模板不存在
  130 + if (template == null) {
95 131 throw exception(MAIL_TEMPLATE_NOT_EXISTS);
96 132 }
97   - return mailTemplateDO;
  133 + return template;
98 134 }
  135 +
  136 + @VisibleForTesting
  137 + public MailAccountDO checkMailAccountValid(Long accountId) {
  138 + // 获得邮箱账号。考虑到效率,从缓存中获取
  139 + MailAccountDO account = mailAccountService.getMailAccountFromCache(accountId);
  140 + // 邮箱账号不存在
  141 + if (account == null) {
  142 + throw exception(MAIL_ACCOUNT_NOT_EXISTS);
  143 + }
  144 + return account;
  145 + }
  146 +
  147 + @VisibleForTesting
  148 + public String checkMail(String mail) {
  149 + if (StrUtil.isEmpty(mail)) {
  150 + throw exception(MAIL_SEND_MAIL_NOT_EXISTS);
  151 + }
  152 + return mail;
  153 + }
  154 +
99 155 /**
100 156 * 将参数模板,处理成有序的 KeyValue 数组
101 157 *
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java
... ... @@ -83,7 +83,7 @@ public interface MailTemplateService {
83 83 * @param params 合成参数
84 84 * @return 格式化后的内容
85 85 */
86   - String formatMailTemplateContent(String content, Map<String, String> params);
  86 + String formatMailTemplateContent(String content, Map<String, Object> params);
87 87  
88 88 /**
89 89 * 获得指定邮件账号下的邮件模板数量
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java
1   -package cn.iocoder.yudao.module.system.service.mail.impl;
  1 +package cn.iocoder.yudao.module.system.service.mail;
2 2  
3   -
4   -import cn.hutool.core.collection.CollUtil;
5 3 import cn.hutool.core.util.ObjUtil;
  4 +import cn.hutool.core.util.ReUtil;
6 5 import cn.hutool.core.util.StrUtil;
7 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8   -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
9   -import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
10 7 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO;
11 8 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
12 9 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO;
... ... @@ -14,7 +11,6 @@ import cn.iocoder.yudao.module.system.convert.mail.MailTemplateConvert;
14 11 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
15 12 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
16 13 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
17   -import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
18 14 import com.google.common.annotations.VisibleForTesting;
19 15 import lombok.extern.slf4j.Slf4j;
20 16 import org.springframework.stereotype.Service;
... ... @@ -23,12 +19,12 @@ import org.springframework.validation.annotation.Validated;
23 19 import javax.annotation.PostConstruct;
24 20 import javax.annotation.Resource;
25 21 import javax.validation.Valid;
26   -import java.util.Date;
27 22 import java.util.List;
28 23 import java.util.Map;
  24 +import java.util.regex.Pattern;
29 25  
30 26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
32 28 import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
33 29  
34 30 /**
... ... @@ -42,6 +38,11 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
42 38 @Slf4j
43 39 public class MailTemplateServiceImpl implements MailTemplateService {
44 40  
  41 + /**
  42 + * 正则表达式,匹配 {} 中的变量
  43 + */
  44 + private static final Pattern PATTERN_PARAMS = Pattern.compile("\\{(.*?)}");
  45 +
45 46 @Resource
46 47 private MailTemplateMapper mailTemplateMapper;
47 48  
... ... @@ -73,7 +74,8 @@ public class MailTemplateServiceImpl implements MailTemplateService {
73 74 validateCodeUnique(null, createReqVO.getCode());
74 75  
75 76 // 插入
76   - MailTemplateDO template = MailTemplateConvert.INSTANCE.convert(createReqVO);
  77 + MailTemplateDO template = MailTemplateConvert.INSTANCE.convert(createReqVO)
  78 + .setParams(parseTemplateContentParams(createReqVO.getContent()));
77 79 mailTemplateMapper.insert(template);
78 80 // 发送刷新消息
79 81 mailProducer.sendMailTemplateRefreshMessage();
... ... @@ -88,7 +90,8 @@ public class MailTemplateServiceImpl implements MailTemplateService {
88 90 validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode());
89 91  
90 92 // 更新
91   - MailTemplateDO updateObj = MailTemplateConvert.INSTANCE.convert(updateReqVO);
  93 + MailTemplateDO updateObj = MailTemplateConvert.INSTANCE.convert(updateReqVO)
  94 + .setParams(parseTemplateContentParams(updateReqVO.getContent()));
92 95 mailTemplateMapper.updateById(updateObj);
93 96 // 发送刷新消息
94 97 mailProducer.sendMailTemplateRefreshMessage();
... ... @@ -118,6 +121,12 @@ public class MailTemplateServiceImpl implements MailTemplateService {
118 121 mailProducer.sendMailTemplateRefreshMessage();
119 122 }
120 123  
  124 + private void validateMailTemplateExists(Long id) {
  125 + if (mailTemplateMapper.selectById(id) == null) {
  126 + throw exception(MAIL_TEMPLATE_NOT_EXISTS);
  127 + }
  128 + }
  129 +
121 130 @Override
122 131 public MailTemplateDO getMailTemplate(Long id) {return mailTemplateMapper.selectById(id);}
123 132  
... ... @@ -135,14 +144,13 @@ public class MailTemplateServiceImpl implements MailTemplateService {
135 144 }
136 145  
137 146 @Override
138   - public String formatMailTemplateContent(String content, Map<String, String> params) {
  147 + public String formatMailTemplateContent(String content, Map<String, Object> params) {
139 148 return StrUtil.format(content, params);
140 149 }
141 150  
142   - private void validateMailTemplateExists(Long id) {
143   - if (mailTemplateMapper.selectById(id) == null) {
144   - throw exception(MAIL_TEMPLATE_NOT_EXISTS);
145   - }
  151 + @VisibleForTesting
  152 + public List<String> parseTemplateContentParams(String content) {
  153 + return ReUtil.findAllGroup1(PATTERN_PARAMS, content);
146 154 }
147 155  
148 156 @Override
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberService.java
... ... @@ -15,4 +15,12 @@ public interface MemberService {
15 15 */
16 16 String getMemberUserMobile(Long id);
17 17  
  18 + /**
  19 + * 获得会员用户的邮箱
  20 + *
  21 + * @param id 会员用户编号
  22 + * @return 邮箱
  23 + */
  24 + String getMemberUserEmail(Long id);
  25 +
18 26 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/member/MemberServiceImpl.java
... ... @@ -21,14 +21,27 @@ public class MemberServiceImpl implements MemberService {
21 21  
22 22 @Override
23 23 public String getMemberUserMobile(Long id) {
24   - if (id == null) {
  24 + Object user = getMemberUser(id);
  25 + if (user == null) {
25 26 return null;
26 27 }
27   - Object user = ReflectUtil.invoke(getMemberUserApi(), "getUser", id);
  28 + return ReflectUtil.invoke(user, "getMobile");
  29 + }
  30 +
  31 + @Override
  32 + public String getMemberUserEmail(Long id) {
  33 + Object user = getMemberUser(id);
28 34 if (user == null) {
29 35 return null;
30 36 }
31   - return ReflectUtil.invoke(user, "getMobile");
  37 + return ReflectUtil.invoke(user, "getEmail");
  38 + }
  39 +
  40 + private Object getMemberUser(Long id) {
  41 + if (id == null) {
  42 + return null;
  43 + }
  44 + return ReflectUtil.invoke(getMemberUserApi(), "getUser", id);
32 45 }
33 46  
34 47 private Object getMemberUserApi() {
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsTemplateServiceImpl.java
... ... @@ -39,7 +39,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
39 39 * 短信模板 Service 实现类
40 40 *
41 41 * @author zzf
42   - * @date 2021/1/25 9:25
  42 + * @since 2021/1/25 9:25
43 43 */
44 44 @Service
45 45 @Slf4j
... ...