gpt4 book ai didi

java - 如何使用 JavaMail API 从文件中读取 HTML 模板以发送邮件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:33:03 29 4
gpt4 key购买 nike

我有一个任务要使用 JavaMail API 发送 HTML 邮件。这是我的代码的一小部分:

MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);

try {
helper.setTo(recipients);
helper.setSubject("Simple mail template");
helper.setText("<html><body>Hi There</body><html>",html:true);
} catch (MessagingException e) {
e.printStackTrace();
}

现在我有一个任务要将 HTML 移动到一个单独的文件中,并创建一个类来读取该 HTML 模板并使用它发送邮件。关于如何做到这一点有什么建议吗?

最佳答案

使用模板引擎

我用 Thymeleaf 创建了一个最小的例子作为模板引擎。您首先写道您正在使用 Spring Boot在你的项目中,所以我假设你可以使用它。我还假设您正在使用 MavenGradle作为构建工具。


添加 Thymeleaf 依赖项

spring-boot-starter-thymeleaf 依赖项添加到您的项目中。您使用的是 Maven 还是 Gradle?

行家

您的 pom.xml 依赖项应包括:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Gradle

您的 build.gradle 依赖项应包括:

compile('org.springframework.boot:spring-boot-starter-thymeleaf')

在 Spring Boot 中配置 Thymeleaf

添加所需的@Bean。它们是:

@Bean
public ITemplateResolver templateResolver()
{
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix("templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);

return templateResolver;
}

@Bean
public TemplateEngine templateEngine()
{
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(this.templateResolver());

return templateEngine;
}

它们可以进入任何用 @Configuration(或 @SpringBootApplication)注释的类。


例子

现在,您可以从任何其字段由 Spring 注入(inject)的类访问您的 TemplateEngine

@Component
public class SomeClass
{
@Autowired
private TemplateEngine templateEngine;

public String generateMailHtml(String text)
{
Map<String, Object> variables = new HashMap<>();
variables.put("mailtext", text);

final String templateFileName = "mail"; //Name of the template file without extension
String output = this.templateEngine.process(templateFileName, new Context(Locale.getDefault(), variables));

return output;
}
}

mail.html 应该位于 templates/ 下的类路径 (resources/) 中。

Template file path

它应该是这样的:

<html>
<body data-th-text="${mailtext}"></body>
</html>

您发布的代码片段现在看起来像这样(@Autowired SomeClass as someClass in the class outside the method):

MimeMessage message = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);

try {
helper.setTo(recipients);
helper.setSubject("Simple mail template");
helper.setText(someClass.generateMailHtml("Hi There"), true);
} catch (MessagingException e) {
e.printStackTrace();
}

当然,根据您的需要更改示例!


编辑

您提到您需要“使用一些名称的列表”来填充模板。这将像这样实现:

public String generateMailHtml(List<String> names)
{
Map<String, Object> variables = new HashMap<>();
variables.put("names", names);

final String templateFileName = "mail"; //Name of the template file without extension
String output = this.templateEngine.process(templateFileName, new Context(Locale.getDefault(), variables));

return output;
}

mail.html

<html>
<body>
<ul>
<li data-th-each="name : ${names}" data-th-text="${name}"></li>
</ul>
</body>
</html>

阅读更多关于 data-th-each/th:each here .注意:您可以交替使用 data-th-th:,尽管 data-th- 对 HTML5 更友好。

关于java - 如何使用 JavaMail API 从文件中读取 HTML 模板以发送邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49997222/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com