让我们看看如何在spring引导应用程序中使用thymeleaf模板发送HTML电子邮件。
使用spring-boot和thymeleaf模板引擎,事情变得简单了。如您所知,Thymeleaf在SpringMVC应用程序中用作视图。但是,您知道可以使用相同的模板引擎生成丰富的HTML电子邮件吗?让我们看看这个例子。
为了实现这一点,我们需要两个Spring启动装置。包括以下内容到我们的pom中。xml将为我们的项目提供JavaMail和Thymeleaf支持。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Code language: HTML, XML (xml)
在我的示例中,我还包括spring boot starter web,这样我就可以通过API调用触发电子邮件。然而,如何在自己的应用程序中连接它取决于您。
通过包含上述依赖项,您可以让SpringBoot配置JavaMail和thymeleaf模板引擎配置。对于Thymeleaf,您不需要向项目中添加任何其他配置。然而,JavaMail需要一些配置才能启动JavaMailSender
对象。下面给出了一个配置示例。
spring.mail.username=[email protected]
spring.mail.password=*******
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.protocol=smtp
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Code language: Properties (properties)
请注意,我在这个演示中使用了GMAIL的SMTP服务器和我自己的用户名和密码。在大多数情况下,您正在为组织进行开发,需要根据组织的设置更改主机。
如果您希望使用自己的GMAIL帐户,那么您可能需要启用对less secure apps for your account的访问
除此之外,让我们设置一个简单的EmailService。
@Service
public class EmailService {
private final JavaMailSender javaMailSender;
public EmailService(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
public void sendMail(User user) throws MessagingException {
javax.mail.internet.MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setSubject("Welcome " + user.getName());
String html = "<!doctype html>\n" +
"<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\"\n" +
" xmlns:th=\"http://www.thymeleaf.org\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta name=\"viewport\"\n" +
" content=\"width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0\">\n" +
" <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n" +
" <title>Email</title>\n" +
"</head>\n" +
"<body>\n" +
"<div>Welcome <b>" + user.getName() + "</b></div>\n" +
"\n" +
"<div> Your username is <b>" + user.getUsername() + "</b></div>\n" +
"</body>\n" +
"</html>\n";
helper.setText(html, true);
helper.setTo(user.getEmail());
javaMailSender.send(mimeMessage);
}
}
Code language: Java (java)
这段代码做得很好,没有任何问题,除非它很混乱,很难在未来更改。当有包含太多变量的大型电子邮件时,此类将成为开发人员的噩梦。百里香来帮忙了。
Thymeleaf以其在MVC应用程序中用作视图而闻名。然而,它基本上是一个基于模板和上下文变量生成内容的模板引擎。因此,使用相同的技术为我们的spring-boot应用程序创建定制的HTML电子邮件内容是可以理解的。得益于spring boot,默认情况下,此模板引擎是自动配置的,不需要额外配置。
默认情况下,Thymeleaf从src/main/resources/templates/目录中获取模板。因此,让我们将HTML模板移到那里,并将其命名为welcome.HTML。
<!doctype html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Email</title>
</head>
<body>
<div>Welcome <b th:text="${user.name}"></b></div>
<div> Your username is <b th:text="${user.username}"></b></div>
</body>
</html>
Code language: HTML, XML (xml)
在我的例子中,我在模板下创建了一个名为emails的目录,并将模板文件放在那里。现在,让我们通过自动连接templateEngine
来重新编写EmailService
。通过消除杂乱的模板部分,代码变得更清晰、更易于维护。
@Service
public class EmailService {
private final TemplateEngine templateEngine;
private final JavaMailSender javaMailSender;
public EmailService(TemplateEngine templateEngine, JavaMailSender javaMailSender) {
this.templateEngine = templateEngine;
this.javaMailSender = javaMailSender;
}
public String sendMail(User user) throws MessagingException {
Context context = new Context();
context.setVariable("user", user);
String process = templateEngine.process("emails/welcome", context);
javax.mail.internet.MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
helper.setSubject("Welcome " + user.getName());
helper.setText(process, true);
helper.setTo(user.getEmail());
javaMailSender.send(mimeMessage);
return "Sent";
}
}
Code language: Java (java)
对于演示,我编写了一个API,它接受用户对象并调用EmailService.sendMail(User user)
。
@RequestMapping(value = "/email", method = RequestMethod.POST)
@ResponseBody
public String sendMail(@RequestBody User user)throws MessagingException{
emailService.sendMail(user);
return "Email Sent Successfully.!";
}
Code language: Java (java)
如果您正确地完成了以上所有操作,那么您将得到以下结果。
$ curl -X POST "http://localhost:8080/email" \
-H "Content-Type: application/json" \
--data '{ "name": "John Doe", "username": "jd01", "email": "[email protected]" }'
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 25
Date: Tue, 08 Sep 2020 09:17:06 GMT
Keep-Alive: timeout=60
Connection: keep-alive
Email Sent Successfully.!
Code language: Bash (bash)
您可以在一次性邮箱[email protected]
中看到该电子邮件。
此一次性邮箱接收的邮件的屏幕截图
请注意,您可以通过在sendEmail
方法中为模板名称添加一个新参数来进一步改进此服务。public void sendMail(User user, String templateName)
这样类似的模板可以使用相同的方法。例如,用户添加、删除和修改可以将同一用户对象用于不同的模板文件。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://springhow.com/spring-boot-email-thymeleaf/
内容来源于网络,如有侵权,请联系作者删除!