Commit 0ddb50be579f87bafe1c577e485646b1c56994f7
1 parent
1464f7d3
邮件模块 添加用户类型 用户编码信息
Showing
14 changed files
with
175 additions
and
102 deletions
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/mail/dto/MailSendReqDTO.java
| @@ -7,32 +7,32 @@ import lombok.Data; | @@ -7,32 +7,32 @@ import lombok.Data; | ||
| 7 | import javax.validation.constraints.Email; | 7 | import javax.validation.constraints.Email; |
| 8 | import javax.validation.constraints.NotNull; | 8 | import javax.validation.constraints.NotNull; |
| 9 | import java.util.List; | 9 | import java.util.List; |
| 10 | +import java.util.Map; | ||
| 10 | 11 | ||
| 11 | @ApiModel("管理后台 - 邮件发送 Req VO") | 12 | @ApiModel("管理后台 - 邮件发送 Req VO") |
| 12 | @Data | 13 | @Data |
| 13 | public class MailSendReqDTO { // TODO @wangjingqi:1), 不用空格;2)应该只要传递 templateCode、参数就好,title、from、content、附件应该都是参数里的 | 14 | public class MailSendReqDTO { // TODO @wangjingqi:1), 不用空格;2)应该只要传递 templateCode、参数就好,title、from、content、附件应该都是参数里的 |
| 14 | 15 | ||
| 15 | - @ApiModelProperty(value = "邮箱",required = true,example = "yudaoyuanma@123.com") | ||
| 16 | - @NotNull(message = "邮箱账号不能为空") | ||
| 17 | - @Email(message = "邮箱账号格式错误") | ||
| 18 | - private String from; | 16 | + @ApiModelProperty(value = "用户编码",required = true) |
| 17 | + @NotNull(message = "用户编码不能为空") | ||
| 18 | + private String userId; | ||
| 19 | 19 | ||
| 20 | - @ApiModelProperty(value = "标题",example = "标题") | ||
| 21 | - private String title; | ||
| 22 | - | ||
| 23 | - @ApiModelProperty(value = "内容",example = "内容") | ||
| 24 | - private String content; | 20 | + @ApiModelProperty(value = "用户类型",required = true) |
| 21 | + @NotNull(message = "用户类型不能为空") | ||
| 22 | + private String userType; | ||
| 25 | 23 | ||
| 26 | @ApiModelProperty(value = "邮箱模版id",example = "1024") | 24 | @ApiModelProperty(value = "邮箱模版id",example = "1024") |
| 27 | - @NotNull(message = "邮箱模版id不能为空") | ||
| 28 | - private Integer templateId; | 25 | + @NotNull(message = "邮箱模版编码不能为空") |
| 26 | + private Integer templateCode; | ||
| 27 | + | ||
| 28 | + @ApiModelProperty(value = "邮箱参数") | ||
| 29 | + @NotNull(message = "模版参数不能为空") | ||
| 30 | + private Map<String,Object> templateParams; | ||
| 29 | 31 | ||
| 30 | @ApiModelProperty(value = "收件人",required = true,example = "yudaoyuanma@123.com") | 32 | @ApiModelProperty(value = "收件人",required = true,example = "yudaoyuanma@123.com") |
| 31 | @NotNull(message = "收件人不能为空") | 33 | @NotNull(message = "收件人不能为空") |
| 32 | private List<String> tos; | 34 | private List<String> tos; |
| 33 | 35 | ||
| 34 | - @ApiModelProperty(value = "附件",example = "附件编码") | ||
| 35 | - private List<String> fileIds; | ||
| 36 | 36 | ||
| 37 | 37 | ||
| 38 | } | 38 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
| @@ -131,5 +131,6 @@ public interface ErrorCodeConstants { | @@ -131,5 +131,6 @@ public interface ErrorCodeConstants { | ||
| 131 | ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在"); | 131 | ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在"); |
| 132 | ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在"); | 132 | ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在"); |
| 133 | ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002021002, "存在关联邮箱模版"); | 133 | ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002021002, "存在关联邮箱模版"); |
| 134 | + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); | ||
| 134 | 135 | ||
| 135 | } | 136 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/mail/MailLogUserTypeEnum.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.enums.mail; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Getter; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * 邮件日志用户类型 | ||
| 8 | + * | ||
| 9 | + * @author wangjingyi | ||
| 10 | + */ | ||
| 11 | +@Getter | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public enum MailLogUserTypeEnum { | ||
| 14 | + | ||
| 15 | + COMMON (10), | ||
| 16 | + VIP (20); | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * 类型 | ||
| 20 | + */ | ||
| 21 | + private final int userType; | ||
| 22 | +} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/log/MailLogPageReqVO.java
| @@ -18,9 +18,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | @@ -18,9 +18,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ | ||
| 18 | @ToString(callSuper = true) | 18 | @ToString(callSuper = true) |
| 19 | public class MailLogPageReqVO extends PageParam { | 19 | public class MailLogPageReqVO extends PageParam { |
| 20 | 20 | ||
| 21 | - // TODO @wangjingyi:required 为 false 时,它是默认值,所以不用谢 | 21 | + // TODO @wangjingyi:required 为 false 时,它是默认值,所以不用谢 DONE |
| 22 | 22 | ||
| 23 | - @ApiModelProperty(value = "邮箱" , required = false , example = "yudaoyuanma@123.com") | 23 | + @ApiModelProperty(value = "邮箱" , example = "yudaoyuanma@123.com") |
| 24 | private String from; | 24 | private String from; |
| 25 | 25 | ||
| 26 | @ApiModelProperty(value = "模版编号" , required = false , example = "templeId") | 26 | @ApiModelProperty(value = "模版编号" , required = false , example = "templeId") |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java
| 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; | 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | +import cn.iocoder.yudao.module.system.enums.mail.MailLogUserTypeEnum; | ||
| 4 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; | 5 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; |
| 6 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| 8 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 6 | import lombok.*; | 9 | import lombok.*; |
| 7 | 10 | ||
| 8 | import java.io.Serializable; | 11 | import java.io.Serializable; |
| 9 | import java.util.Date; | 12 | import java.util.Date; |
| 13 | +import java.util.Map; | ||
| 10 | 14 | ||
| 11 | /** | 15 | /** |
| 12 | * 邮箱日志 | 16 | * 邮箱日志 |
| @@ -29,15 +33,29 @@ public class MailLogDO extends BaseDO implements Serializable { | @@ -29,15 +33,29 @@ public class MailLogDO extends BaseDO implements Serializable { | ||
| 29 | */ | 33 | */ |
| 30 | private Long id; | 34 | private Long id; |
| 31 | 35 | ||
| 36 | + /** | ||
| 37 | + * 用户编码 | ||
| 38 | + */ | ||
| 39 | + private Long userId; | ||
| 40 | + | ||
| 41 | + /** | ||
| 42 | + * 用户类型 | ||
| 43 | + * | ||
| 44 | + * 冗余 {@link MailLogUserTypeEnum#getUserType} | ||
| 45 | + */ | ||
| 46 | + private Integer userType; | ||
| 47 | + | ||
| 32 | // TODO @wangjingyi:accountId | 48 | // TODO @wangjingyi:accountId |
| 33 | /** | 49 | /** |
| 34 | * 邮箱账号编号 | 50 | * 邮箱账号编号 |
| 35 | */ | 51 | */ |
| 36 | private Long accountId; | 52 | private Long accountId; |
| 37 | 53 | ||
| 38 | - // TODO @wangjingyi:如果是冗余字段,记得 @ 下; | 54 | + // TODO @wangjingyi:如果是冗余字段,记得 @ 下;DONE |
| 39 | /** | 55 | /** |
| 40 | * 邮箱账号 | 56 | * 邮箱账号 |
| 57 | + * | ||
| 58 | + * 冗余 {@link MailAccountDO} | ||
| 41 | */ | 59 | */ |
| 42 | private String fromAddress; | 60 | private String fromAddress; |
| 43 | 61 | ||
| @@ -47,30 +65,22 @@ public class MailLogDO extends BaseDO implements Serializable { | @@ -47,30 +65,22 @@ public class MailLogDO extends BaseDO implements Serializable { | ||
| 47 | private Long templateId; | 65 | private Long templateId; |
| 48 | 66 | ||
| 49 | /** | 67 | /** |
| 50 | - * 模版编号 | 68 | + * 模版内容 |
| 51 | */ | 69 | */ |
| 52 | - private String templateCode; | 70 | + private String templateContent; |
| 53 | 71 | ||
| 54 | /** | 72 | /** |
| 55 | - * 标题 | 73 | + * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 |
| 56 | */ | 74 | */ |
| 57 | - private String title; | ||
| 58 | - | ||
| 59 | - /** | ||
| 60 | - * 内容 | ||
| 61 | - */ | ||
| 62 | - private String content; | ||
| 63 | - | ||
| 64 | - /** | ||
| 65 | - * 收件人 | ||
| 66 | - */ | ||
| 67 | - private String to; | 75 | + @TableField(typeHandler = JacksonTypeHandler.class) |
| 76 | + private Map<String,Object> templateParams; | ||
| 68 | 77 | ||
| 69 | /** | 78 | /** |
| 70 | * 发送时间 | 79 | * 发送时间 |
| 71 | */ | 80 | */ |
| 72 | private Date sendTime; | 81 | private Date sendTime; |
| 73 | 82 | ||
| 83 | + //=========接收相关字段========= | ||
| 74 | /** | 84 | /** |
| 75 | * 发送状态 | 85 | * 发送状态 |
| 76 | * | 86 | * |
| @@ -83,5 +93,10 @@ public class MailLogDO extends BaseDO implements Serializable { | @@ -83,5 +93,10 @@ public class MailLogDO extends BaseDO implements Serializable { | ||
| 83 | */ | 93 | */ |
| 84 | private String sendResult; | 94 | private String sendResult; |
| 85 | 95 | ||
| 96 | + /** | ||
| 97 | + * 消息ID | ||
| 98 | + */ | ||
| 99 | + private String messageId; | ||
| 100 | + | ||
| 86 | 101 | ||
| 87 | } | 102 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java
| @@ -2,11 +2,13 @@ package cn.iocoder.yudao.module.system.dal.dataobject.mail; | @@ -2,11 +2,13 @@ package cn.iocoder.yudao.module.system.dal.dataobject.mail; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 3 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 5 | +import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
| 7 | +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 6 | import lombok.Data; | 8 | import lombok.Data; |
| 7 | import lombok.EqualsAndHashCode; | 9 | import lombok.EqualsAndHashCode; |
| 8 | 10 | ||
| 9 | -import java.util.Date; | 11 | +import java.util.List; |
| 10 | 12 | ||
| 11 | /** | 13 | /** |
| 12 | * 邮箱模版 | 14 | * 邮箱模版 |
| @@ -44,6 +46,11 @@ public class MailTemplateDO extends BaseDO { | @@ -44,6 +46,11 @@ public class MailTemplateDO extends BaseDO { | ||
| 44 | */ | 46 | */ |
| 45 | private String content; | 47 | private String content; |
| 46 | /** | 48 | /** |
| 49 | + * 参数数组(自动根据内容生成) | ||
| 50 | + */ | ||
| 51 | + @TableField(typeHandler = JacksonTypeHandler.class) | ||
| 52 | + private List<String> params; | ||
| 53 | + /** | ||
| 47 | * 状态 | 54 | * 状态 |
| 48 | * | 55 | * |
| 49 | * 枚举 {@link CommonStatusEnum} | 56 | * 枚举 {@link CommonStatusEnum} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/consumer/mail/MailTemplateRefreshConsumer.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.mq.consumer.mail; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.mq.consumer.mail; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; | 3 | import cn.iocoder.yudao.framework.mq.core.pubsub.AbstractChannelMessageListener; |
| 4 | import cn.iocoder.yudao.module.system.mq.message.mail.MailTemplateRefreshMessage; | 4 | import cn.iocoder.yudao.module.system.mq.message.mail.MailTemplateRefreshMessage; |
| 5 | -import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; | ||
| 6 | import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; | 5 | import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; |
| 7 | import lombok.extern.slf4j.Slf4j; | 6 | import lombok.extern.slf4j.Slf4j; |
| 8 | import org.springframework.stereotype.Component; | 7 | import org.springframework.stereotype.Component; |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/message/mail/MailSendMessage.java
| 1 | package cn.iocoder.yudao.module.system.mq.message.mail; | 1 | package cn.iocoder.yudao.module.system.mq.message.mail; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.core.KeyValue; | ||
| 3 | import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage; | 4 | import cn.iocoder.yudao.framework.mq.core.stream.AbstractStreamMessage; |
| 4 | import lombok.Data; | 5 | import lombok.Data; |
| 5 | import lombok.EqualsAndHashCode; | 6 | import lombok.EqualsAndHashCode; |
| @@ -46,7 +47,7 @@ public class MailSendMessage extends AbstractStreamMessage { | @@ -46,7 +47,7 @@ public class MailSendMessage extends AbstractStreamMessage { | ||
| 46 | * 收件人 | 47 | * 收件人 |
| 47 | */ | 48 | */ |
| 48 | @NotNull(message = "收件人不能为空") | 49 | @NotNull(message = "收件人不能为空") |
| 49 | - private List<String> tos; | 50 | + private String to; |
| 50 | /** | 51 | /** |
| 51 | * 标题 | 52 | * 标题 |
| 52 | */ | 53 | */ |
| @@ -69,6 +70,10 @@ public class MailSendMessage extends AbstractStreamMessage { | @@ -69,6 +70,10 @@ public class MailSendMessage extends AbstractStreamMessage { | ||
| 69 | * 是否开启 SSL | 70 | * 是否开启 SSL |
| 70 | */ | 71 | */ |
| 71 | private Boolean sslEnable; | 72 | private Boolean sslEnable; |
| 73 | + /** | ||
| 74 | + * 邮箱模板参数 | ||
| 75 | + */ | ||
| 76 | + private List<KeyValue<String, Object>> templateParams; | ||
| 72 | 77 | ||
| 73 | @Override | 78 | @Override |
| 74 | public String getStreamKey() { | 79 | public String getStreamKey() { |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/producer/mail/MailProducer.java
| @@ -7,9 +7,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | @@ -7,9 +7,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 7 | import cn.iocoder.yudao.module.system.mq.message.mail.MailAccountRefreshMessage; | 7 | import cn.iocoder.yudao.module.system.mq.message.mail.MailAccountRefreshMessage; |
| 8 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; | 8 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; |
| 9 | import cn.iocoder.yudao.module.system.mq.message.mail.MailTemplateRefreshMessage; | 9 | import cn.iocoder.yudao.module.system.mq.message.mail.MailTemplateRefreshMessage; |
| 10 | -import cn.iocoder.yudao.module.system.mq.message.sms.SmsChannelRefreshMessage; | ||
| 11 | -import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage; | ||
| 12 | -import cn.iocoder.yudao.module.system.mq.message.sms.SmsTemplateRefreshMessage; | ||
| 13 | import lombok.extern.slf4j.Slf4j; | 10 | import lombok.extern.slf4j.Slf4j; |
| 14 | import org.springframework.stereotype.Component; | 11 | import org.springframework.stereotype.Component; |
| 15 | 12 | ||
| @@ -48,25 +45,27 @@ public class MailProducer { | @@ -48,25 +45,27 @@ public class MailProducer { | ||
| 48 | /** | 45 | /** |
| 49 | * 发送 {@link MailSendMessage} 消息 | 46 | * 发送 {@link MailSendMessage} 消息 |
| 50 | * | 47 | * |
| 48 | + * @param sendLogId 发送日志编码 | ||
| 51 | * @param mailAccountDO 邮箱账号信息 | 49 | * @param mailAccountDO 邮箱账号信息 |
| 52 | * @param mailTemplateDO 邮箱模版信息 | 50 | * @param mailTemplateDO 邮箱模版信息 |
| 53 | * @param content 内容 | 51 | * @param content 内容 |
| 54 | - * @param tos 收件人 | ||
| 55 | - * @param title 标题 | 52 | + * @param templateParams 邮箱模版参数 |
| 53 | + * @param to 收件人 | ||
| 56 | */ | 54 | */ |
| 57 | - public void sendMailSendMessage(MailAccountDO mailAccountDO, MailTemplateDO mailTemplateDO, String content, List<String> tos, String title , Long sendLogId) { | 55 | + public void sendMailSendMessage(Long sendLogId,MailAccountDO mailAccountDO, MailTemplateDO mailTemplateDO, String content,List<KeyValue<String, Object>> templateParams,String to) { |
| 58 | MailSendMessage message = new MailSendMessage(); | 56 | MailSendMessage message = new MailSendMessage(); |
| 59 | - message.setContent(content); | ||
| 60 | - message.setFromAddress(mailAccountDO.getFromAddress()); | ||
| 61 | - message.setHost(mailAccountDO.getHost()); | ||
| 62 | - message.setPort(mailAccountDO.getPort()); | ||
| 63 | - message.setPassword(mailAccountDO.getPassword()); | ||
| 64 | - message.setUsername(mailAccountDO.getUsername()); | ||
| 65 | - message.setSslEnable(mailAccountDO.getSslEnable()); | ||
| 66 | - message.setTemplateCode(mailTemplateDO.getCode()); | ||
| 67 | - message.setTitle(title); | ||
| 68 | - message.setTos(tos); | ||
| 69 | - message.setLogId(sendLogId); | 57 | + message.setContent(content) |
| 58 | + .setFromAddress(mailAccountDO.getFromAddress()) | ||
| 59 | + .setHost(mailAccountDO.getHost()) | ||
| 60 | + .setPort(mailAccountDO.getPort()) | ||
| 61 | + .setPassword(mailAccountDO.getPassword()) | ||
| 62 | + .setUsername(mailAccountDO.getUsername()) | ||
| 63 | + .setSslEnable(mailAccountDO.getSslEnable()) | ||
| 64 | + .setTemplateCode(mailTemplateDO.getCode()) | ||
| 65 | + .setTitle(mailTemplateDO.getTitle()) | ||
| 66 | + .setTo(to) | ||
| 67 | + .setLogId(sendLogId) | ||
| 68 | + .setTemplateParams(templateParams); | ||
| 70 | redisMQTemplate.send(message); | 69 | redisMQTemplate.send(message); |
| 71 | } | 70 | } |
| 72 | } | 71 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailLogService.java
| @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailLogDO; | @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailLogDO; | ||
| 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; |
| 9 | 9 | ||
| 10 | import java.util.List; | 10 | import java.util.List; |
| 11 | +import java.util.Map; | ||
| 11 | 12 | ||
| 12 | /** | 13 | /** |
| 13 | * 邮箱日志服务类 | 14 | * 邮箱日志服务类 |
| @@ -36,15 +37,16 @@ public interface MailLogService { | @@ -36,15 +37,16 @@ public interface MailLogService { | ||
| 36 | /** | 37 | /** |
| 37 | * 创建邮箱日志 | 38 | * 创建邮箱日志 |
| 38 | * | 39 | * |
| 40 | + * @param userId 用户编码 | ||
| 41 | + * @param userType 用户类型 | ||
| 42 | + * @param to 收件人 | ||
| 39 | * @param mailAccountDO 邮箱账号信息 | 43 | * @param mailAccountDO 邮箱账号信息 |
| 40 | * @param template 模版信息 | 44 | * @param template 模版信息 |
| 41 | - * @param from 邮箱 | ||
| 42 | - * @param content 内容 | ||
| 43 | - * @param tos 收件人 | ||
| 44 | - * @param title 标题 | 45 | + * @param templateContent 模版内容 |
| 46 | + * @param templateParams 模版参数 | ||
| 45 | * @param isSend 是否发送成功 | 47 | * @param isSend 是否发送成功 |
| 46 | */ | 48 | */ |
| 47 | - Long createMailLog(MailAccountDO mailAccountDO, MailTemplateDO template, String from, String content, List<String> tos, String title, Boolean isSend); | 49 | + Long createMailLog(Long userId,Integer userType,String to,MailAccountDO mailAccountDO, MailTemplateDO template , String templateContent, Map<String, Object> templateParams, Boolean isSend); |
| 48 | 50 | ||
| 49 | /** | 51 | /** |
| 50 | * 更新邮件发送结果 | 52 | * 更新邮件发送结果 |
| @@ -54,4 +56,12 @@ public interface MailLogService { | @@ -54,4 +56,12 @@ public interface MailLogService { | ||
| 54 | */ | 56 | */ |
| 55 | void updateMailSendResult(Long logId, String result); | 57 | void updateMailSendResult(Long logId, String result); |
| 56 | 58 | ||
| 59 | + /** | ||
| 60 | + * 更新邮件发送结果 | ||
| 61 | + * | ||
| 62 | + * @param logId 发送日志Id | ||
| 63 | + * @param exception 发送结果 | ||
| 64 | + */ | ||
| 65 | + void updateFailMailSendResult(Long logId, String exception); | ||
| 66 | + | ||
| 57 | } | 67 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailSendService.java
| @@ -26,10 +26,12 @@ public interface MailSendService { | @@ -26,10 +26,12 @@ public interface MailSendService { | ||
| 26 | * @param templateCode 邮件模版编码 | 26 | * @param templateCode 邮件模版编码 |
| 27 | * @param from 邮箱 | 27 | * @param from 邮箱 |
| 28 | * @param content 内容 | 28 | * @param content 内容 |
| 29 | - * @param tos 收件人 | ||
| 30 | - * @param title 标题 | 29 | + * @param templateParams 模版参数 |
| 30 | + * @param to 收件人 | ||
| 31 | + * @param userId 用户编码 | ||
| 32 | + * @param userType 用户类型 | ||
| 31 | */ | 33 | */ |
| 32 | - void sendMail(String templateCode, String from , String content , List<String> tos , String title); | 34 | + void sendMail(Long userId, Integer userType, String templateCode, String from,String to, String content, Map<String, Object> templateParams); |
| 33 | 35 | ||
| 34 | /** | 36 | /** |
| 35 | * 执行真正的邮件发送 | 37 | * 执行真正的邮件发送 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailLogServiceImpl.java
| @@ -13,8 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired; | @@ -13,8 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 14 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 15 | 15 | ||
| 16 | +import javax.annotation.Resource; | ||
| 16 | import java.util.Date; | 17 | import java.util.Date; |
| 17 | import java.util.List; | 18 | import java.util.List; |
| 19 | +import java.util.Map; | ||
| 18 | import java.util.Objects; | 20 | import java.util.Objects; |
| 19 | 21 | ||
| 20 | /** | 22 | /** |
| @@ -27,9 +29,9 @@ import java.util.Objects; | @@ -27,9 +29,9 @@ import java.util.Objects; | ||
| 27 | @Validated | 29 | @Validated |
| 28 | public class MailLogServiceImpl implements MailLogService { | 30 | public class MailLogServiceImpl implements MailLogService { |
| 29 | 31 | ||
| 30 | - // TODO @wangjingyi:private,然后使用 @Resource | ||
| 31 | - @Autowired | ||
| 32 | - MailLogMapper mailLogMapper; | 32 | + // TODO @wangjingyi:private,然后使用 @Resource DONE |
| 33 | + @Resource | ||
| 34 | + private MailLogMapper mailLogMapper; | ||
| 33 | 35 | ||
| 34 | @Override | 36 | @Override |
| 35 | public PageResult<MailLogDO> getMailLogPage(MailLogPageReqVO pageVO) { | 37 | public PageResult<MailLogDO> getMailLogPage(MailLogPageReqVO pageVO) { |
| @@ -42,26 +44,29 @@ public class MailLogServiceImpl implements MailLogService { | @@ -42,26 +44,29 @@ public class MailLogServiceImpl implements MailLogService { | ||
| 42 | } | 44 | } |
| 43 | 45 | ||
| 44 | @Override | 46 | @Override |
| 45 | - public Long createMailLog(MailAccountDO mailAccountDO, MailTemplateDO template, String from, String content, List<String> tos, String title, Boolean isSend) { | 47 | + public Long createMailLog(Long userId,Integer userType,String to,MailAccountDO mailAccountDO, MailTemplateDO template , String templateContent, Map<String, Object> templateParams, Boolean isSend) { |
| 46 | MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); | 48 | MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); |
| 47 | - // TODO @wangjingyi:使用 builder 的时候,不用每个 set 是一行。 | 49 | + // TODO @wangjingyi:使用 builder 的时候,不用每个 set 是一行。DONE |
| 48 | // 根据是否要发送,设置状态 | 50 | // 根据是否要发送,设置状态 |
| 49 | logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() | 51 | logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() |
| 50 | - : MailSendStatusEnum.IGNORE.getStatus()); | ||
| 51 | - // 设置邮箱相关字段 | ||
| 52 | - // TODO @wangjingyi:userId、userType | 52 | + : MailSendStatusEnum.IGNORE.getStatus()) |
| 53 | + // 设置邮箱相关字段 | ||
| 54 | + .fromAddress(mailAccountDO.getFromAddress()) | ||
| 55 | + .accountId(mailAccountDO.getId()) | ||
| 56 | + // TODO @wangjingyi:userId、userType | ||
| 57 | + //用户信息 | ||
| 58 | + .userId(userId).userType(userType) | ||
| 59 | + //模版信息 | ||
| 60 | + .templateId(template.getId()).templateParams(templateParams).templateContent(templateContent); | ||
| 61 | + | ||
| 62 | + | ||
| 53 | logDOBuilder.fromAddress(mailAccountDO.getFromAddress()); | 63 | logDOBuilder.fromAddress(mailAccountDO.getFromAddress()); |
| 54 | logDOBuilder.accountId(mailAccountDO.getId()); | 64 | logDOBuilder.accountId(mailAccountDO.getId()); |
| 55 | - // TODO @wangjingyi:每个接收人一条日志。发送多个人,就调用多次,业务方。因为某个邮箱有问题,会导致所有都发送失败。 | ||
| 56 | - logDOBuilder.to(tos.toString()); | 65 | + // TODO @wangjingyi:每个接收人一条日志。发送多个人,就调用多次,业务方。因为某个邮箱有问题,会导致所有都发送失败。 DONE |
| 57 | // 设置模板相关字段 | 66 | // 设置模板相关字段 |
| 58 | // TODO @wangjingyi:可以参考下 sms 短信的逻辑,templateContent、templateParams | 67 | // TODO @wangjingyi:可以参考下 sms 短信的逻辑,templateContent、templateParams |
| 59 | - logDOBuilder.templateId(template.getId()); | ||
| 60 | - logDOBuilder.templateCode(template.getCode()); | ||
| 61 | - logDOBuilder.title(title); | ||
| 62 | - logDOBuilder.content(content); | ||
| 63 | - // TODO @wangjingyi:有结果的时候,才是 sendTime 哈 | ||
| 64 | - logDOBuilder.sendTime(new Date()); | 68 | + // TODO @wangjingyi:有结果的时候,才是 sendTime 哈 DONE |
| 69 | + //logDOBuilder.sendTime(new Date()); | ||
| 65 | 70 | ||
| 66 | // 插入数据库 | 71 | // 插入数据库 |
| 67 | MailLogDO logDO = logDOBuilder.build(); | 72 | MailLogDO logDO = logDOBuilder.build(); |
| @@ -69,14 +74,20 @@ public class MailLogServiceImpl implements MailLogService { | @@ -69,14 +74,20 @@ public class MailLogServiceImpl implements MailLogService { | ||
| 69 | return logDO.getId(); | 74 | return logDO.getId(); |
| 70 | } | 75 | } |
| 71 | 76 | ||
| 72 | - // TODO @wangjingyi:还是加几个字段哈,日志上。sendStatus,成功、失败;messageId 消息标号。sendException 记录发送的异常。这样界面才好筛选邮件的发送结果。 | 77 | + // TODO @wangjingyi:还是加几个字段哈,日志上。sendStatus,成功、失败;messageId 消息标号。sendException 记录发送的异常。这样界面才好筛选邮件的发送结果。DONE |
| 73 | @Override | 78 | @Override |
| 74 | public void updateMailSendResult(Long logId, String result) { | 79 | public void updateMailSendResult(Long logId, String result) { |
| 75 | MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); | 80 | MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); |
| 76 | - logDOBuilder.id(logId); | ||
| 77 | - logDOBuilder.sendResult(result); | 81 | + logDOBuilder.id(logId).sendTime(new Date()).sendResult(result).messageId(result).sendStatus(MailSendStatusEnum.SUCCESS.getStatus()); |
| 78 | MailLogDO mailLogDO = logDOBuilder.build(); | 82 | MailLogDO mailLogDO = logDOBuilder.build(); |
| 79 | mailLogMapper.updateById(mailLogDO); | 83 | mailLogMapper.updateById(mailLogDO); |
| 80 | } | 84 | } |
| 81 | 85 | ||
| 86 | + @Override | ||
| 87 | + public void updateFailMailSendResult(Long logId, String exception) { | ||
| 88 | + MailLogDO.MailLogDOBuilder logDOBuilder = MailLogDO.builder(); | ||
| 89 | + logDOBuilder.id(logId).sendTime(new Date()).sendResult(exception).sendStatus(MailSendStatusEnum.FAILURE.getStatus()); | ||
| 90 | + MailLogDO mailLogDO = logDOBuilder.build(); | ||
| 91 | + mailLogMapper.updateById(mailLogDO); | ||
| 92 | + } | ||
| 82 | } | 93 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailSendServiceImpl.java
| @@ -2,17 +2,18 @@ package cn.iocoder.yudao.module.system.service.mail.impl; | @@ -2,17 +2,18 @@ package cn.iocoder.yudao.module.system.service.mail.impl; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.extra.mail.MailAccount; | 3 | import cn.hutool.extra.mail.MailAccount; |
| 4 | import cn.hutool.extra.mail.MailUtil; | 4 | import cn.hutool.extra.mail.MailUtil; |
| 5 | +import cn.iocoder.yudao.framework.common.core.KeyValue; | ||
| 5 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | 6 | import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; |
| 6 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; | 7 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; |
| 7 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; |
| 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | 9 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; |
| 9 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper; | 10 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper; |
| 10 | -import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; | ||
| 11 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; | 11 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; |
| 12 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; | 12 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; |
| 13 | import cn.iocoder.yudao.module.system.service.mail.MailLogService; | 13 | import cn.iocoder.yudao.module.system.service.mail.MailLogService; |
| 14 | import cn.iocoder.yudao.module.system.service.mail.MailSendService; | 14 | import cn.iocoder.yudao.module.system.service.mail.MailSendService; |
| 15 | import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; | 15 | import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; |
| 16 | +import com.google.common.annotations.VisibleForTesting; | ||
| 16 | import lombok.extern.slf4j.Slf4j; | 17 | import lombok.extern.slf4j.Slf4j; |
| 17 | import org.springframework.stereotype.Service; | 18 | import org.springframework.stereotype.Service; |
| 18 | import org.springframework.validation.annotation.Validated; | 19 | import org.springframework.validation.annotation.Validated; |
| @@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated; | @@ -20,6 +21,7 @@ import org.springframework.validation.annotation.Validated; | ||
| 20 | import javax.annotation.Resource; | 21 | import javax.annotation.Resource; |
| 21 | import java.util.List; | 22 | import java.util.List; |
| 22 | import java.util.Map; | 23 | import java.util.Map; |
| 24 | +import java.util.stream.Collectors; | ||
| 23 | 25 | ||
| 24 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 26 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 25 | import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | 27 | import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; |
| @@ -34,9 +36,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | @@ -34,9 +36,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | ||
| 34 | @Validated | 36 | @Validated |
| 35 | @Slf4j | 37 | @Slf4j |
| 36 | public class MailSendServiceImpl implements MailSendService { | 38 | public class MailSendServiceImpl implements MailSendService { |
| 37 | - | ||
| 38 | - @Resource | ||
| 39 | - private MailTemplateMapper mailTemplateMapper; | 39 | + |
| 40 | @Resource | 40 | @Resource |
| 41 | private MailAccountMapper mailAccountMapper; | 41 | private MailAccountMapper mailAccountMapper; |
| 42 | @Resource | 42 | @Resource |
| @@ -48,7 +48,7 @@ public class MailSendServiceImpl implements MailSendService { | @@ -48,7 +48,7 @@ public class MailSendServiceImpl implements MailSendService { | ||
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | @Override | 50 | @Override |
| 51 | - public void sendMail(String templateCode, String from , String content , List<String> tos , String title) { | 51 | + public void sendMail(Long userId, Integer userType, String templateCode, String from,String to, String content, Map<String, Object> templateParams) { |
| 52 | // TODO @@wangjingyi:发送的时候,参考下短信;DONE | 52 | // TODO @@wangjingyi:发送的时候,参考下短信;DONE |
| 53 | //校验邮箱模版是否合法 | 53 | //校验邮箱模版是否合法 |
| 54 | MailTemplateDO mailTemplateDO = this.checkMailTemplateValid(templateCode); | 54 | MailTemplateDO mailTemplateDO = this.checkMailTemplateValid(templateCode); |
| @@ -58,14 +58,11 @@ public class MailSendServiceImpl implements MailSendService { | @@ -58,14 +58,11 @@ public class MailSendServiceImpl implements MailSendService { | ||
| 58 | MailAccountDO mailAccountDO = this.checkMailAccountValid(from); | 58 | MailAccountDO mailAccountDO = this.checkMailAccountValid(from); |
| 59 | Map<String , String> params = MailAccountConvert.INSTANCE.convertToMap(mailAccountDO , content); | 59 | Map<String , String> params = MailAccountConvert.INSTANCE.convertToMap(mailAccountDO , content); |
| 60 | content = mailTemplateService.formatMailTemplateContent(mailTemplateDO.getContent(), params); | 60 | content = mailTemplateService.formatMailTemplateContent(mailTemplateDO.getContent(), params); |
| 61 | - Long sendLogId = mailLogService.createMailLog(mailAccountDO , mailTemplateDO , from , content , tos , title , isSend); | ||
| 62 | - | ||
| 63 | - // 后续功能 TODO :附件查询 | ||
| 64 | - //List<String> fileIds = mailSendVO.getFileIds(); | ||
| 65 | - | 61 | + Long sendLogId = mailLogService.createMailLog(userId,userType,to,mailAccountDO , mailTemplateDO , content, templateParams, isSend); |
| 62 | + List<KeyValue<String,Object>> newTemplateParams = buildTemplateParams(mailTemplateDO,templateParams); | ||
| 66 | // 发送 MQ 消息,异步执行发送短信 | 63 | // 发送 MQ 消息,异步执行发送短信 |
| 67 | if (isSend) { | 64 | if (isSend) { |
| 68 | - mailProducer.sendMailSendMessage(mailAccountDO , mailTemplateDO ,content , tos , title , sendLogId); | 65 | + mailProducer.sendMailSendMessage(sendLogId,mailAccountDO , mailTemplateDO ,content, newTemplateParams,to); |
| 69 | } | 66 | } |
| 70 | } | 67 | } |
| 71 | 68 | ||
| @@ -84,10 +81,10 @@ public class MailSendServiceImpl implements MailSendService { | @@ -84,10 +81,10 @@ public class MailSendServiceImpl implements MailSendService { | ||
| 84 | MailAccount account = MailAccountConvert.INSTANCE.convertAccount(message); | 81 | MailAccount account = MailAccountConvert.INSTANCE.convertAccount(message); |
| 85 | //发送邮件 | 82 | //发送邮件 |
| 86 | try{ | 83 | try{ |
| 87 | - String messageId = MailUtil.send(account,message.getTos(),message.getTitle(),message.getContent(),false,null); | 84 | + String messageId = MailUtil.send(account,message.getTo(),message.getTitle(),message.getContent(),false,null); |
| 88 | mailLogService.updateMailSendResult(message.getLogId() , messageId); | 85 | mailLogService.updateMailSendResult(message.getLogId() , messageId); |
| 89 | }catch (Exception e){ | 86 | }catch (Exception e){ |
| 90 | - mailLogService.updateMailSendResult(message.getLogId() , e.getMessage()); | 87 | + mailLogService.updateFailMailSendResult(message.getLogId() , e.getMessage()); |
| 91 | } | 88 | } |
| 92 | 89 | ||
| 93 | } | 90 | } |
| @@ -99,16 +96,21 @@ public class MailSendServiceImpl implements MailSendService { | @@ -99,16 +96,21 @@ public class MailSendServiceImpl implements MailSendService { | ||
| 99 | } | 96 | } |
| 100 | return mailTemplateDO; | 97 | return mailTemplateDO; |
| 101 | } | 98 | } |
| 102 | - | ||
| 103 | - private void validateMailTemplateExists(Long id) { | ||
| 104 | - if (mailTemplateMapper.selectById(id) == null) { | ||
| 105 | - throw exception(MAIL_TEMPLATE_NOT_EXISTS); | ||
| 106 | - } | ||
| 107 | - } | ||
| 108 | - | ||
| 109 | - private void validateMailTemplateOnlyByCode(String code){ | ||
| 110 | - if (mailTemplateMapper.selectOneByCode(code) != null) { | ||
| 111 | - throw exception(MAIL_TEMPLATE_EXISTS); | ||
| 112 | - } | 99 | + /** |
| 100 | + * 将参数模板,处理成有序的 KeyValue 数组 | ||
| 101 | + * | ||
| 102 | + * @param template 邮箱模板 | ||
| 103 | + * @param templateParams 原始参数 | ||
| 104 | + * @return 处理后的参数 | ||
| 105 | + */ | ||
| 106 | + @VisibleForTesting | ||
| 107 | + public List<KeyValue<String, Object>> buildTemplateParams(MailTemplateDO template, Map<String, Object> templateParams) { | ||
| 108 | + return template.getParams().stream().map(key -> { | ||
| 109 | + Object value = templateParams.get(key); | ||
| 110 | + if (value == null) { | ||
| 111 | + throw exception(MAIL_SEND_TEMPLATE_PARAM_MISS, key); | ||
| 112 | + } | ||
| 113 | + return new KeyValue<>(key, value); | ||
| 114 | + }).collect(Collectors.toList()); | ||
| 113 | } | 115 | } |
| 114 | } | 116 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java
| @@ -83,7 +83,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { | @@ -83,7 +83,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 83 | @Override | 83 | @Override |
| 84 | public void update(@Valid MailTemplateUpdateReqVO updateReqVO) { | 84 | public void update(@Valid MailTemplateUpdateReqVO updateReqVO) { |
| 85 | // 校验是否唯一 | 85 | // 校验是否唯一 |
| 86 | - // TODO @wangjingyi:参考下我在 account 给的唯一校验的说明。 | 86 | + // TODO @wangjingyi:参考下我在 account 给的唯一校验的说明。DONE |
| 87 | this.validateMailTemplateOnlyByCode(updateReqVO.getId(),updateReqVO.getCode()); | 87 | this.validateMailTemplateOnlyByCode(updateReqVO.getId(),updateReqVO.getCode()); |
| 88 | MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(updateReqVO); | 88 | MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(updateReqVO); |
| 89 | mailTemplateMapper.updateById(mailTemplateDO); | 89 | mailTemplateMapper.updateById(mailTemplateDO); |