一. 架构设计
Mail 模块与 SMS 模块的区别不大,都是简单的 MVC 前后端分离架构,我只对不同的地方进行讲解。
二. 代码分析
接口方面与 Sms 模块的区别在于,没有了头部的验证,直接将请求传过来即可。
@PostMapping(path = "/send")
BaseResponse send(@RequestBody @Valid EmailRequest request);
而数据对象方面,区别在于,虽然有目标地址,其他元素就不同了,包括,标题,主题,用户名。
@NotBlank(message = "Please provide an email")
private String to;
@NotBlank(message = "Please provide a subject")
private String subject;
@NotBlank(message = "Please provide a valid body")
@JsonProperty("html_body")
private String htmlBody;
private String name;
SVC 模块底层的 AppProps 也较为简单,只有阿里云登录使用的密钥等数据
@NotNull private String aliyunAccessKey;
@NotNull private String aliyunAccessSecret;
AppConfig 也是,生成一个 阿里云交互 的对象和一个异步线程池,没区别。代码不贴了。
Service 层的代码也相同。都是基于 阿里云模块封装好的对象进行操作,只不过一个是 sms,一个是mail
SingleSendMailRequest mailRequest = new SingleSendMailRequest();
mailRequest.setAccountName(MailConstant.FROM);
mailRequest.setFromAlias(MailConstant.FROM_NAME);
mailRequest.setAddressType(1);
mailRequest.setToAddress(req.getTo());
mailRequest.setReplyToAddress(false);
mailRequest.setSubject(req.getSubject());
mailRequest.setHtmlBody(req.getHtmlBody());
最后再通过 AppConfig 方法建立的 阿里云交互对象发送邮件,得到返回值。
比较有意思的一点是使用了 Lambda 表达式穿件了一个日志了 Object 对象数组,存储邮件信息。
IToLog logContext = () -> {
return new Object[] {
"subject", req.getSubject(),
"to", req.getTo(),
"html_body", req.getHtmlBody()
};
};
最后是 Controller 层的 MailController 类。差别在于没有服务限制。 header 参数校验没了而已,代码不贴了。
三. 小关键点
也是个注解,上次忘记写了
@Async(AppConfig.ASYNC_EXECUTOR_NAME)
也是用于异步操作,与 AppConfig 中的异步线程池配套。
参数中的就是异步线程池的 Bean 配置的别名
@Bean(name=ASYNC_EXECUTOR_NAME)
另,在 Config 中其实是导入了 common-lib 模块中的整体配置。
节省了重复代码。
@Import(value = StaffjoyRestConfig.class)