Отправка шаблона html на почту (JavaMailSender)
Подскажите как мне передать по почте шаблон в формате HTML? Смог настроить только передачу текста. Нужно прокидывать шаблон в формате html в письме. По итогу пользователю должен отобразиться шаблон во входящем письме.
@Configuration
public class EmailConfig {
@Value("[email protected]")
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("[email protected]");
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>
Ответы (1 шт):
Используйте данную зависимость:
<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>
Если Вам помог ответ, то отметьте его решением