Отправка шаблона html на почту (JavaMailSender)

Рейтинг: -1Ответов: 1Опубликовано: 03.04.2023

Подскажите как мне передать по почте шаблон в формате HTML? Смог настроить только передачу текста. Нужно прокидывать шаблон в формате html в письме. По итогу пользователю должен отобразиться шаблон во входящем письме.

@Configuration
public class EmailConfig {

    @Value("1@test.ru")
    private String email;

    @Value("password")   
    private String password;

    @Bean
    public JavaMailSender getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.mail.ru");
        mailSender.setPort(465);
        mailSender.setUsername(email);
        mailSender.setPassword(password);

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtps");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.debug", "true");

        return mailSender;
    }

}
@RestController
@RequestMapping("/v1/api/sendMail")
public class EmailController {

    private final EmailService emailService;

    public EmailController(EmailService emailService) {
        this.emailService = emailService;
    }

    @PostMapping
    public ResponseEntity addMail(@RequestBody EmailDto emailDto) {
        emailService.addMail(emailDto);
        return ResponseEntity.ok("send");

    }
}
@Service
public class EmailService {

    private final JavaMailSender javaMailSender;

    public EmailService(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    public EmailDto addMail(EmailDto emailDto) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("1@test.ru");
        message.setTo(emailDto.getEmail());
        message.setSubject("Подтверждение регистрации");
        message.setText("какой-о текст");
        javaMailSender.send(message);
        return emailDto;
    }

}
public class EmailDto {

    private String email;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

шаблон, скриншот его расположения в проекте https://ibb.co/mcqFBLv

условный шаблон https://ibb.co/wS68CCC нужно вывести в письме почты (нужно прокидывать шаблон)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../../../frontend/css/email.css">
</head>
<body>
<div class="wrapper">
    <header class="wrapper__header">
        <h1>Добро пожаловать</h1>
    </header>

    <div class="body">
        <div class="body_description">
            <span class="description">Добро пожаловать на тестовый ресурс!
            <br>Ниже можете по навигации можно ознакомиться с ресурсе
            </span>
        </div>
        <div class="body_button">
            <button class="button">Перейти</button>
            <button class="button">Зарегистрироваться</button>
        </div>
        <div class="footer">
            <span>Рекламные данные</span>
        </div>
    </div>
</div>
</body>
</html>

Ответы

▲ 0Принят

Используйте данную зависимость:

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

Данная библиотека позволяет создавать кастомные сообщения из макетов HTML файлов.

В коде сервиса, который отправляет письма используйте объект Configuration из пакета freemarker.template.Configuration

@Autowired
private final Configuration configuration;

После же, Вы можете изменить шаблон сообщения в формате .ftlh на свой, покажу пример.

@SneakyThrows
public void send(Map<String, Object> params) {
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);
    helper.setSubject("Welcome to QaproTours");
    helper.setTo(params.get("user.email").toString());
    String emailContent = getActivationEmailContent(params);
    helper.setText(emailContent, true);
    mailSender.send(mimeMessage);
}

@SneakyThrows
private String getActivationEmailContent(Map<String, Object> params) {
    StringWriter stringWriter = new StringWriter();

    Map<String, Object> model = new HashMap<>();
    model.put("name", params.get("user.name") + " " + params.get("user.surname"));
    model.put("link", mailLinkProperties.getActivation() + params.get("token"));
    configuration.getTemplate("activation.ftlh")
            .process(model, stringWriter);
    return stringWriter.getBuffer()
            .toString();
}

В этом примере я заполняю в шаблоне поля name и link с помощью значений, которые мне необходимы в данном случае.

С помощью ${name} в самом шаблоне можно получить значение объекта name, и дальше обращаться к его полям, если это не примитив.

Вот пример activation.ftlh

<html lang="en">
    <head>
        <title>Activation</title>
    </head>
    <body>
        <h1>Activation</h1>
        <p>Hi, ${name}!</p>
        <p>Thank you for registering on our site. Please click the link below to activate your account.</p>
        <p><a href="${link}">Activate</a></p>
        <p>Best regards, <br> QaproTours</p>
    </body>
</html>

Если Вам помог ответ, то отметьте его решением