如何在HTML中传递值?注册时用户值填充邮件模板发送问题
解决HTML邮件模板动态填充变量的问题
看起来你已经找对了方向——用Thymeleaf作为模板引擎来渲染带动态变量的HTML邮件,不过代码里有几个小细节需要调整,才能让变量正确填充到模板里。下面是具体的修复和优化建议:
1. 修正HTML模板的Thymeleaf表达式语法
你的模板里存在表达式嵌套错误,Thymeleaf中不需要在${}内部再套一层${}。推荐两种更规范的写法:
写法一:字符串拼接
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title th:remove="all">Template for HTML email</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="'Hello Dear, ' + ${name}"> Hello Dear John Doe</p> <p th:text="'Welcome.Please visit, http://aa.ru/activate-account/' + ${activationCode}"> Welcome. Please visit http://aa.ru/activate-account/%s </p> <p> Thanks </p> </body> </html>
写法二:更简洁的文本内联表达式
用|包裹内容可以直接内嵌变量,可读性更强:
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title th:remove="all">Template for HTML email</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="|Hello Dear, ${name}|"> Hello Dear John Doe</p> <p th:text="|Welcome.Please visit, http://aa.ru/activate-account/${activationCode}|"> Welcome. Please visit http://aa.ru/activate-account/%s </p> <p> Thanks </p> </body> </html>
2. 完善TemplateEngine的初始化配置
你的Java代码里创建了TemplateEngine实例,但缺少将模板解析器绑定到引擎的关键步骤,这会导致模板无法被正确加载解析。补充后的完整配置如下:
// 初始化并配置模板解析器 ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); templateResolver.setResolvablePatterns(Collections.singleton("html/*")); templateResolver.setPrefix("/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); // 明确设置HTML模板模式 templateResolver.setCharacterEncoding("UTF-8"); // 统一编码避免乱码 // 将解析器绑定到TemplateEngine TemplateEngine springTemplateEngine = new TemplateEngine(); springTemplateEngine.setTemplateResolver(templateResolver); // 后续的变量填充和模板渲染逻辑 Context context = new Context(); context.setVariable("name",user.getUsername()); context.setVariable("activationCode",user.getActivationCode()); String text = springTemplateEngine.process("email-template.html",context); // 邮件发送逻辑 if (!org.springframework.util.StringUtils.isEmpty(user.getEmail())) { mailSenderService.send(user.getEmail(), "Activation code", text); }
注意:确保你的模板文件路径正确——如果模板放在src/main/resources/templates/email-template.html,当前的前缀后缀配置是完全适配的。
3. 优化邮件发送的编码与格式
为了避免邮件内容乱码,建议在mailSenderService内部明确指定HTML格式和编码(以Spring的JavaMailSender为例):
public void send(String to, String subject, String htmlContent) { MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setTo(to); helper.setSubject(subject); helper.setText(htmlContent, true); // 第二个参数true表示发送HTML格式邮件 javaMailSender.send(message); } catch (MessagingException e) { // 处理发送异常 e.printStackTrace(); } }
验证效果
完成上述调整后,当传入name=Samir、activationCode=blabla时,你收到的邮件内容会和预期完全一致:
Hello Dear, Samir
Welcome.Please visit, http://aa.ru/activate-account/blabla
Thanks
内容的提问来源于stack exchange,提问作者Самир Шахмурадлы
相关产品推荐
相关产品推荐

