如何利用从GitHub获取的InputStream模板配置Thymeleaf发送邮件?
解决Thymeleaf从InputStream加载邮件模板并生成内容的方案
1. 自定义TemplateResolver处理InputStream
Thymeleaf默认解析器不直接支持InputStream,所以需要自己实现一个解析器,核心是把InputStream转换为Thymeleaf能识别的模板源。
import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.templateresolver.AbstractTemplateResolver; import org.thymeleaf.templateresource.ITemplateResource; import org.thymeleaf.templateresource.StringTemplateResource; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class InputStreamTemplateResolver extends AbstractTemplateResolver { private final InputStream templateInputStream; public InputStreamTemplateResolver(InputStream templateInputStream) { this.templateInputStream = templateInputStream; } @Override protected ITemplateResource computeTemplateResource(IEngineConfiguration configuration, String template, String variant, String resourceName, String characterEncoding) { // 将InputStream转为字符串,适配StringTemplateResource try (BufferedReader reader = new BufferedReader(new InputStreamReader(templateInputStream, StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } return new StringTemplateResource(sb.toString()); } catch (IOException e) { throw new RuntimeException("读取模板InputStream失败", e); } } }
2. 配置TemplateEngine并生成HTML内容
用自定义解析器初始化TemplateEngine,通过Context设置变量,最终生成可用于发送的HTML字符串。
import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import java.io.InputStream; import java.util.Map; public class EmailTemplateProcessor { public String generateEmailContent(InputStream templateInputStream, Map<String, Object> variables) { // 初始化自定义解析器 InputStreamTemplateResolver resolver = new InputStreamTemplateResolver(templateInputStream); resolver.setTemplateMode("HTML"); resolver.setCharacterEncoding("UTF-8"); // 配置模板引擎 TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(resolver); // 注入模板变量 Context context = new Context(); context.setVariables(variables); // 模板名称传任意值即可,自定义解析器不依赖该参数 return templateEngine.process("dummy-template", context); } }
3. 实际使用示例
结合你从GitHub获取InputStream的逻辑,直接调用生成方法即可:
// 假设这是你从GitHub获取到的模板InputStream InputStream githubTemplateStream = fetchTemplateFromGitHub(); // 准备邮件变量 Map<String, Object> emailVars = Map.of( "username", "张三", "orderId", "ORD-20240501", "totalAmount", 199.99 ); // 生成邮件HTML内容 EmailTemplateProcessor processor = new EmailTemplateProcessor(); String emailHtml = processor.generateEmailContent(githubTemplateStream, emailVars); // 后续用JavaMailSender发送该HTML即可
关键注意事项
- InputStream只能读取一次,若需要重复使用模板,建议先将其转为字符串缓存,或者每次从GitHub重新获取流。
- 确保GitHub上的模板符合Thymeleaf语法规范(如用
${变量名}引用参数)。 - 异常处理可根据业务需求调整,比如替换RuntimeException为自定义业务异常。
内容的提问来源于stack exchange,提问作者Susheel Rao
相关产品推荐
相关产品推荐

