Spring Boot使用Thymeleaf的电子邮件示例

x33g5p2x  于2022-10-18 转载在 Spring  
字(5.6k)|赞(0)|评价(0)|浏览(816)

让我们看看如何在spring引导应用程序中使用thymeleaf模板发送HTML电子邮件。
使用spring-boot和thymeleaf模板引擎,事情变得简单了。如您所知,Thymeleaf在SpringMVC应用程序中用作视图。但是,您知道可以使用相同的模板引擎生成丰富的HTML电子邮件吗?让我们看看这个例子。

设置电子邮件和Thymeleaf启动器

为了实现这一点,我们需要两个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的访问

Spring Boot电子邮件服务

除此之外,让我们设置一个简单的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)

这段代码做得很好,没有任何问题,除非它很混乱,很难在未来更改。当有包含太多变量的大型电子邮件时,此类将成为开发人员的噩梦。百里香来帮忙了。

HTML电子邮件的Thymeleaf模板

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)

使用Thymeleaf的Spring Boot电子邮件服务

在我的例子中,我在模板下创建了一个名为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)
这样类似的模板可以使用相同的方法。例如,用户添加、删除和修改可以将同一用户对象用于不同的模板文件。

相关文章