SpringCloud微服务实战——搭建企业级开发框架(四十三):多租户可配置的 ...

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

  在日常生活中,邮件已经被聊天软件、短信等更便捷的信息传送方式代替。但在日常工作中,我们的重要的信息通知等非常有必要去归档追溯,那么邮件就是不可或缺的信息传送渠道。对于我们工作中经常用到的系统,里面也基本都集成了邮件发送功能。
  SpringBoot提供了基于JavaMail的starter,我们只要按照官方的说明配置邮件服务器信息,即可使我们的系统拥有发送电子邮件的功能。但是,在我们GitEgg开发框架的实际业务开发过程中,有两个问题需要解决:一个是SpringBoot邮箱服务器的配置是配置在配置文件中的,不支持灵活的界面配置。另外一个是我们的开发框架需要支持多租户,那么此时需要对SpringBoot提供的邮件发送功能进行扩展,以满足我们的需求。
那么,基于以上需求和问题,我们对GitEgg框架进行扩展,增加以下功能:
1、扩展系统配置:将邮箱服务器的配置信息持久化到数据库、Redis缓存,和配置文件一起使用,制定读取优先级。

2、扩展多租户配置:如果系统开启了多租户功能,那么在邮件发送时,首先读取租户的当前配置,如果没有配置,那么在读取系统配置。

3、自有选择服务器:用户可在系统界面上选择指定的邮箱服务器进行邮件发送。

4、提供邮件发送模板:用户可选择预先制定的邮件模板进行发送特定邮件。

5、增加发送数量、频率限制:增加配置,限制模板邮件的发送数量和频率。

6、保存邮件发送记录:不一定把所有附件都保存,只需保存邮件发送关键信息,如果需要保存所有附件等需要自己扩展。

  同一个租户可以配置多个电子邮件服务器,但只可以设置一个服务器为启用状态。默认情况下,系统通知类的功能只使用启用状态的服务器进行邮件发送。在有定制化需求的情况下,比如从页面直接指定某个服务器进行邮件发送,那么提供可以选择的接口,指定某个服务器进行邮件发送。
一、集成spring-boot-starter-mail扩展基础邮件发送功能

1、在基础框架gitegg-platform中新建gitegg-platform-mail子项目,引入邮件必需的相关依赖包。
  1.     <dependencies>
  2.         
  3.         <dependency>
  4.             <groupId>com.gitegg.platform</groupId>
  5.             <artifactId>gitegg-platform-boot</artifactId>
  6.         </dependency>
  7.         <dependency>
  8.             <groupId>org.springframework.boot</groupId>
  9.             <artifactId>spring-boot-configuration-processor</artifactId>
  10.             <optional>true</optional>
  11.         </dependency>
  12.         <dependency>
  13.             <groupId>org.springframework.boot</groupId>
  14.             <artifactId>spring-boot-starter-mail</artifactId>
  15.             
  16.             <exclusions>
  17.                 <exclusion>
  18.                     <groupId>org.springframework.boot</groupId>
  19.                     <artifactId>spring-boot-starter-logging</artifactId>
  20.                 </exclusion>
  21.             </exclusions>
  22.         </dependency>
  23.     </dependencies>
复制代码
2、扩展邮件服务器配置类,增加租户等信息,方便从缓存读取到信息之后进行配置转换。
  1. @Data
  2. @JsonIgnoreProperties(ignoreUnknown = true)
  3. public class GitEggMailProperties extends MailProperties {
  4.     /**
  5.      * 配置id
  6.      */
  7.     private Long id;
  8.     /**
  9.      * 租户id
  10.      */
  11.     private Long tenantId;
  12.     /**
  13.      * 渠道id
  14.      */
  15.     private String channelCode;
  16.     /**
  17.      * 状态
  18.      */
  19.     private Integer channelStatus;
  20.     /**
  21.      * 配置的md5值
  22.      */
  23.     private String md5;
  24. }
复制代码
3、扩展邮件发送实现类JavaMailSenderImpl,添加多租户和邮箱服务器编码,便于多租户和渠道选择。
  1. @Data
  2. public class GitEggJavaMailSenderImpl extends JavaMailSenderImpl {
  3.     /**
  4.      * 配置id
  5.      */
  6.     private Long id;
  7.     /**
  8.      * 租户id
  9.      */
  10.     private Long tenantId;
  11.     /**
  12.      * 渠道编码
  13.      */
  14.     private String channelCode;
  15.     /**
  16.      * 配置的md5值
  17.      */
  18.     private String md5;
  19. }
复制代码
4、新建邮件发送实例工厂类JavaMailSenderFactory,在邮件发送时,根据需求生产需要的邮件发送实例。
  1. @Slf4j
  2. public class JavaMailSenderFactory {
  3.     private RedisTemplate redisTemplate;
  4.     private JavaMailSenderImpl javaMailSenderImpl;
  5.     /**
  6.      * 是否开启租户模式
  7.      */
  8.     private Boolean enable;
  9.     /**
  10.      * JavaMailSender 缓存
  11.      * 尽管存在多个微服务,但是只需要在每个微服务初始化一次即可
  12.      */
  13.     private final static Map<String, GitEggJavaMailSenderImpl> javaMailSenderMap = new ConcurrentHashMap<>();
  14.     public JavaMailSenderFactory(RedisTemplate redisTemplate, JavaMailSenderImpl javaMailSenderImpl, Boolean enable) {
  15.         this.redisTemplate = redisTemplate;
  16.         this.javaMailSenderImpl = javaMailSenderImpl;
  17.         this.enable = enable;
  18.     }
  19.     /**
  20.      * 指定邮件发送渠道
  21.      * @return
  22.      */
  23.     public JavaMailSenderImpl getMailSender(String... channelCode){
  24.         if (null == channelCode || channelCode.length == GitEggConstant.COUNT_ZERO
  25.                 || null == channelCode[GitEggConstant.Number.ZERO])
  26.         {
  27.             return this.getDefaultMailSender();
  28.         }
  29.         // 首先判断是否开启多租户
  30.         String mailConfigKey = JavaMailConstant.MAIL_TENANT_CONFIG_KEY;
  31.         if (enable) {
  32.             mailConfigKey += GitEggAuthUtils.getTenantId();
  33.         } else {
  34.             mailConfigKey = JavaMailConstant.MAIL_CONFIG_KEY;
  35.         }
  36.         // 从缓存获取邮件配置信息
  37.         // 根据channel code获取配置,用channel code时,不区分是否是默认配置
  38.         String propertiesStr = (String) redisTemplate.opsForHash().get(mailConfigKey, channelCode[GitEggConstant.Number.ZERO]);
  39.         if (StringUtils.isEmpty(propertiesStr))
  40.         {
  41.             throw new BusinessException("未获取到[" + channelCode[GitEggConstant.Number.ZERO] + "]的邮件配置信息");
  42.         }
  43.         GitEggMailProperties properties = null;
  44.         try {
  45.             properties = JsonUtils.jsonToPojo(propertiesStr, GitEggMailProperties.class);
  46.         } catch (Exception e) {
  47.             log.error("转换邮件配置信息异常:{}", e);
  48.             throw new BusinessException("转换邮件配置信息异常:" + e);
  49.         }
  50.         return this.getMailSender(mailConfigKey, properties);
  51.     }
  52.     /**
  53.      * 不指定邮件发送渠道,取默认配置
  54.      * @return
  55.      */
  56.     public JavaMailSenderImpl getDefaultMailSender(){
  57.         // 首先判断是否开启多租户
  58.         String mailConfigKey = JavaMailConstant.MAIL_TENANT_CONFIG_KEY;
  59.         if (enable) {
  60.             mailConfigKey += GitEggAuthUtils.getTenantId();
  61.         } else {
  62.             mailConfigKey = JavaMailConstant.MAIL_CONFIG_KEY;
  63.         }
  64.         // 获取所有邮件配置列表
  65.         Map<Object, Object> propertiesMap = redisTemplate.opsForHash().entries(mailConfigKey);
  66.         Iterator<Map.Entry<Object, Object>> entries = propertiesMap.entrySet().iterator();
  67.         // 如果没有设置取哪个配置,那么获取默认的配置
  68.         GitEggMailProperties properties = null;
  69.         try {
  70.             while (entries.hasNext()) {
  71.                 Map.Entry<Object, Object> entry = entries.next();
  72.                 // 转为系统配置对象
  73.                 GitEggMailProperties propertiesEnable = JsonUtils.jsonToPojo((String) entry.getValue(), GitEggMailProperties.class);
  74.                 if (propertiesEnable.getChannelStatus().intValue() == GitEggConstant.ENABLE) {
  75.                     properties = propertiesEnable;
  76.                     break;
  77.                 }
  78.             }
  79.         } catch (Exception e) {
  80.             e.printStackTrace();
  81.         }
  82.         return this.getMailSender(mailConfigKey, properties);
  83.     }
  84.     private JavaMailSenderImpl getMailSender(String mailConfigKey, GitEggMailProperties properties) {
  85.         // 根据最新配置信息判断是否从本地获取mailSender,在配置保存时,计算实体配置的md5值,然后进行比较,不要在每次对比的时候进行md5计算
  86.         if (null != properties && !StringUtils.isEmpty(properties.getMd5()))
  87.         {
  88.             GitEggJavaMailSenderImpl javaMailSender = javaMailSenderMap.get(mailConfigKey);
  89.             if (null == javaMailSender || !properties.getMd5().equals(javaMailSender.getMd5()))
  90.             {
  91.                 // 如果没有配置信息,那么直接返回系统默认配置的mailSender
  92.                 javaMailSender = new GitEggJavaMailSenderImpl();
  93.                 this.applyProperties(properties, javaMailSender);
  94.                 javaMailSender.setMd5(properties.getMd5());
  95.                 javaMailSender.setId(properties.getId());
  96.                 // 将MailSender放入缓存
  97.                 javaMailSenderMap.put(mailConfigKey, javaMailSender);
  98.             }
  99.             return javaMailSender;
  100.         }
  101.         else
  102.         {
  103.             return this.javaMailSenderImpl;
  104.         }
  105.     }
  106.     private void applyProperties(MailProperties properties, JavaMailSenderImpl sender) {
  107.         sender.setHost(properties.getHost());
  108.         if (properties.getPort() != null) {
  109.             sender.setPort(properties.getPort());
  110.         }
  111.         sender.setUsername(properties.getUsername());
  112.         sender.setPassword(properties.getPassword());
  113.         sender.setProtocol(properties.getProtocol());
  114.         if (properties.getDefaultEncoding() != null) {
  115.             sender.setDefaultEncoding(properties.getDefaultEncoding().name());
  116.         }
  117.         if (!properties.getProperties().isEmpty()) {
  118.             sender.setJavaMailProperties(this.asProperties(properties.getProperties()));
  119.         }
  120.     }
  121.     private Properties asProperties(Map<String, String> source) {
  122.         Properties properties = new Properties();
  123.         properties.putAll(source);
  124.         return properties;
  125.     }
  126. }
复制代码
5、配置异步邮件发送的线程池,这里需注意异步线程池上下文变量共享问题,有两种方式解决,一个是使用装饰器TaskDecorator将父子线程变量进行复制,还有一种方式是transmittable-thread-local来共享线程上下文,这里不展开描述,后续会专门针对如何在微服务异步线程池中共享上线文进行说明。
  1. @Configuration
  2. public class MailThreadPoolConfig {
  3.     @Value("${spring.mail-task.execution.pool.core-size}")
  4.     private int corePoolSize;
  5.     @Value("${spring.mail-task.execution.pool.max-size}")
  6.     private int maxPoolSize;
  7.     @Value("${spring.mail-task.execution.pool.queue-capacity}")
  8.     private int queueCapacity;
  9.     @Value("${spring.mail-task.execution.thread-name-prefix}")
  10.     private String namePrefix;
  11.     @Value("${spring.mail-task.execution.pool.keep-alive}")
  12.     private int keepAliveSeconds;
  13.     /**
  14.      * 邮件发送的线程池
  15.      * @return
  16.      */
  17.     @Bean("mailTaskExecutor")
  18.     public Executor mailTaskExecutor(){
  19.         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  20.         //最大线程数
  21.         executor.setMaxPoolSize(maxPoolSize);
  22.         //核心线程数
  23.         executor.setCorePoolSize(corePoolSize);
  24.         //任务队列的大小
  25.         executor.setQueueCapacity(queueCapacity);
  26.         //线程前缀名
  27.         executor.setThreadNamePrefix(namePrefix);
  28.         //线程存活时间
  29.         executor.setKeepAliveSeconds(keepAliveSeconds);
  30.         // 设置装饰器,父子线程共享request header变量
  31.         executor.setTaskDecorator(new RequestHeaderTaskDecorator());
  32.         /**
  33.          * 拒绝处理策略
  34.          * CallerRunsPolicy():交由调用方线程运行,比如 main 线程。
  35.          * AbortPolicy():直接抛出异常。
  36.          * DiscardPolicy():直接丢弃。
  37.          * DiscardOldestPolicy():丢弃队列中最老的任务。
  38.          */
  39.         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  40.         // 线程初始化
  41.         executor.initialize();
  42.         return executor;
  43.     }
  44. }
复制代码
6、增加邮件发送结果的枚举类MailResultCodeEnum
  1. public enum MailResultCodeEnum {
  2.     /**
  3.      * 默认
  4.      */
  5.     SUCCESS("success", "邮件发送成功"),
  6.     /**
  7.      * 自定义
  8.      */
  9.     ERROR("error", "邮件发送失败");
  10.     public String code;
  11.     public String message;
  12.     MailResultCodeEnum(String code, String message) {
  13.         this.code = code;
  14.         this.message = message;
  15.     }
  16.     public String getCode() {
  17.         return code;
  18.     }
  19.     public void setCode(String code) {
  20.         this.code = code;
  21.     }
  22.     public String getMessage() {
  23.         return message;
  24.     }
  25.     public void setMessage(String message) {
  26.         this.message = message;
  27.     }
  28. }
复制代码
7、增加邮箱服务器相关默认配置的常量类JavaMailConstant.java
  1. public class JavaMailConstant {
  2.     /**
  3.      * Redis JavaMail配置config key
  4.      */
  5.     public static final String MAIL_CONFIG_KEY = "mail:config";
  6.     /**
  7.      * 当开启多租户模式时,Redis JavaMail配置config key
  8.      */
  9.     public static final String MAIL_TENANT_CONFIG_KEY = "mail:tenant:config:";
  10. }
复制代码
8、增加GitEggJavaMail自动装配类,根据Nacos或者系统配置进行装配。
  1. @Slf4j
  2. @Configuration
  3. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  4. public class GitEggJavaMailConfiguration {
  5.     private final JavaMailSenderImpl javaMailSenderImpl;
  6.    
  7.     private final RedisTemplate redisTemplate;
  8.     /**
  9.      * 是否开启租户模式
  10.      */
  11.     @Value("${tenant.enable}")
  12.     private Boolean enable;
  13.    
  14.     @Bean
  15.     public JavaMailSenderFactory gitEggAuthRequestFactory() {
  16.         return new JavaMailSenderFactory(redisTemplate, javaMailSenderImpl, enable);
  17.     }
  18. }
复制代码
二、增加邮箱服务器配置界面

  邮箱服务器的配置,实际就是不同邮箱渠道的配置,这里我们将表和字段设计好,然后使用GitEgg自带代码生成器,生成业务的CRUD代码即可。
1、邮箱渠道配置表设计
  1. CREATE TABLE `t_sys_mail_channel`  (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3.   `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户id',
  4.   `channel_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道编码',
  5.   `channel_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '渠道名称',
  6.   `host` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'SMTP服务器地址',
  7.   `port` int(11) NULL DEFAULT NULL COMMENT 'SMTP服务器端口',
  8.   `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '账户名',
  9.   `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码',
  10.   `protocol` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'smtp' COMMENT '协议',
  11.   `default_encoding` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '默认编码',
  12.   `jndi_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '会话JNDI名称',
  13.   `properties` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JavaMail 配置',
  14.   `channel_status` tinyint(2) NOT NULL DEFAULT 0 COMMENT '渠道状态 1有效 0禁用',
  15.   `md5` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'MD5',
  16.   `comments` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
  17.   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  18.   `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
  19.   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  20.   `operator` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
  21.   `del_flag` tinyint(2) NULL DEFAULT 0 COMMENT '是否删除',
  22.   PRIMARY KEY (`id`) USING BTREE
  23. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '邮件渠道' ROW_FORMAT = DYNAMIC;
  24. SET FOREIGN_KEY_CHECKS = 1;
复制代码
2、根据表设计,然后配置代码生成界面,生成前后端代码。


3、生成代码后,进行相关权限配置,前端界面展示:


三、以同样的方式增加邮箱模板配置界面和邮件发送日志记录

1、邮箱模板和邮件发送日志数据库表设计

邮件模板数据库表设计:
  1. CREATE TABLE `t_sys_mail_template`  (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3.   `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户id',
  4.   `template_code` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板编码',
  5.   `template_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板名称',
  6.   `sign_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模板签名',
  7.   `template_status` tinyint(2) NOT NULL DEFAULT 1 COMMENT '模板状态',
  8.   `template_type` tinyint(2) NULL DEFAULT NULL COMMENT '模板类型',
  9.   `template_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模板内容',
  10.   `cache_code_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '缓存key',
  11.   `cache_time_out` bigint(20) NULL DEFAULT 0 COMMENT '缓存有效期 值',
  12.   `cache_time_out_unit` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '缓存有效期 单位',
  13.   `send_times_limit` bigint(20) NULL DEFAULT 0 COMMENT '发送次数限制',
  14.   `send_times_limit_period` bigint(20) NULL DEFAULT 0 COMMENT '限制时间间隔',
  15.   `send_times_limit_period_unit` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '限制时间间隔 单位',
  16.   `comments` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
  17.   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  18.   `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
  19.   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  20.   `operator` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
  21.   `del_flag` tinyint(2) NULL DEFAULT 0 COMMENT '是否删除',
  22.   PRIMARY KEY (`id`) USING BTREE
  23. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '邮件模板' ROW_FORMAT = DYNAMIC;
  24. SET FOREIGN_KEY_CHECKS = 1;
复制代码
邮件日志数据库表设计:
  1. CREATE TABLE `t_sys_mail_log`  (
  2.   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3.   `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户id',
  4.   `channel_id` bigint(20) NULL DEFAULT NULL COMMENT 'mail渠道id',
  5.   `template_id` bigint(20) NULL DEFAULT NULL COMMENT 'mail模板id',
  6.   `mail_subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮件主题',
  7.   `mail_from` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送人',
  8.   `mail_to` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '收件人',
  9.   `mail_cc` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '抄送',
  10.   `mail_bcc` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '密抄送',
  11.   `mail_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '邮件内容',
  12.   `attachment_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '附件名称',
  13.   `attachment_size` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '附件大小',
  14.   `send_time` datetime(0) NULL DEFAULT NULL COMMENT '发送时间',
  15.   `send_result_code` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '1' COMMENT '发送结果码',
  16.   `send_result_msg` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '发送结果消息',
  17.   `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
  18.   `creator` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
  19.   `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新日期',
  20.   `operator` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
  21.   `del_flag` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否删除 1:删除 0:不删除',
  22.   PRIMARY KEY (`id`) USING BTREE
  23. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '邮件记录' ROW_FORMAT = DYNAMIC;
  24. SET FOREIGN_KEY_CHECKS = 1;
复制代码
2、邮件模板和邮件发送日志界面



四、QQ邮箱配置和阿里云企业邮箱配置测试

  上面的基本功能开发完成之后,那么我们就需要进行测试,这里选择两种类型的邮箱进行测试,一种是QQ邮箱,还有一种是阿里云企业邮箱。
1、QQ邮箱配置

QQ邮箱在配置的时候不能使用QQ的登录密码,需要单独设置QQ邮箱的授权码,下面是操作步骤:

  • 开通qq邮箱的smtp功能




  • 经过一系列的验证之后,会获取到一个授权码:

  • 系统中配置QQ邮箱相关信息

2、 阿里云企业邮箱配置

阿里云企业邮箱的配置相比较而言就简单一些,配置的密码就是企业邮箱登录的密码。

  • 账户设置,开启POP3/SMTP和IMAP/SMTP服务

  • 系统中配置阿里云企业邮箱相关信息

3、Nacos中配置默认邮件服务器,同时增加邮件异步线程池配置
  1.   mail:
  2.     username: XXXXXXXXXXX
  3.     password: XXXXXXXXXX
  4.     default-encoding: UTF-8
  5.     host: smtp.mxhichina.com
  6.     port: 25
  7.     protocol: smtp
  8.     properties:
  9.       mail:
  10.         smtp:
  11.           auth: true
  12.           ssl:
  13.             enable: false
复制代码
  1.   # 异步发送邮件,核心线程池数配置
  2.   mail-task:
  3.     execution:
  4.       pool:
  5.         core-size: 5
  6.         max-size: 10
  7.         queue-capacity: 5
  8.         keep-alive: 60
  9.       thread-name-prefix: mail-send-task-
复制代码
4、在邮件渠道配置界面进行邮件发送测试,有两种测试方式,一种是选择指定渠道进行发送,另外一种是选择系统默认渠道进行邮件发送。发送完成后查看邮件日志模块,检查是否有邮件发送成功的记录。


  • 选择需要测试的邮箱服务器


  • 填写测试邮箱发送内容


  • 查看邮箱发送日志

源码地址:

Gitee: https://gitee.com/wmz1930/GitEgg
GitHub: https://github.com/wmz1930/GitEgg

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表