3. Генерация email из шаблонов
В этом разделе показано, как сгенерировать email на основе шаблонов темы и тела письма, созданных в предыдущем разделе.
Перед началом убедитесь, что установлено дополнение Email Sending и настроены соответствующие параметры отправки.
Добавление кнопки Notify by Email
Добавьте кнопку Notify by Email в экран списка бронирований. Эта кнопка отправляет email создателю выбранного бронирования.
Откройте booking-list-view.xml и добавьте действие notifyEmail для bookingsDataGrid:
<action id="notifyEmail"
type="list_itemTracking"
icon="ENVELOPE"
text="msg://notifyEmail.text"/>
Затем привяжите действие к кнопке:
<hbox id="buttonsPanel" classNames="buttons-panel">
<!--...-->
<button id="notifyEmailButton" action="bookingsDataGrid.notifyEmail"/>
</hbox>
Генерация email из шаблона
Сгенерируйте метод-обработчик события ActionPerformedEvent для действия notifyEmailButton и добавьте следующую логику:
@ViewComponent
private DataGrid<Booking> bookingsDataGrid;
@Autowired
private MessageTemplatesGenerator messageTemplatesGenerator; (1)
@Autowired
private Emailer emailer; (2)
@Autowired
private Notifications notifications; (3)
@Subscribe("bookingsDataGrid.notifyEmail")
public void onBookingsDataGridNotifyEmail(final ActionPerformedEvent event) {
Booking booking = bookingsDataGrid.getSingleSelectedItem();
User creator = booking.getCreator(); (4)
String email = creator.getEmail();
if (email == null) {
showNoEmailNotification(creator); (5)
return;
}
List<String> messages = messageTemplatesGenerator.generateMultiTemplate()
.withTemplateCodes("booking-email-subject", "booking-email-body") (6)
.withParams(
Map.of(
"booking", booking,
"today", new Date()
)) (7)
.generate();
EmailInfo emailInfo = EmailInfoBuilder.create()
.setAddresses(email)
.setSubject(messages.get(0))
.setBody(messages.get(1))
.setBodyContentType("text/html; charset=UTF-8")
.build(); (8)
try {
emailer.sendEmail(emailInfo); (9)
} catch (EmailException e) {
showSendingErrorNotification(email);
}
showSendingSuccessNotification(email); (10)
}
private void showSendingErrorNotification(String email) {
notifications.create("Failed to send email to %s".formatted(email))
.withThemeVariant(NotificationVariant.LUMO_ERROR)
.show();
}
private void showNoEmailNotification(User creator) {
notifications.create("%s did not specify an email".formatted(creator.getDisplayName()))
.withThemeVariant(NotificationVariant.LUMO_ERROR)
.show();
}
private void showSendingSuccessNotification(String email) {
notifications.create("The message has been successfully sent to %s".formatted(email))
.withThemeVariant(NotificationVariant.LUMO_SUCCESS)
.show();
}
| 1 | Бин для генерации сообщений из шаблонов. |
| 2 | Бин для отправки email. |
| 3 | Бин для отображения уведомлений пользователю. |
| 4 | Получает выбранное booking и его creator из bookingsDataGrid. |
| 5 | Проверяет, указан ли у creator адрес email. Если нет, метод показывает уведомление и завершает работу. |
| 6 | Генерирует тему и тело письма на основе шаблонов booking-email-subject и booking-email-body. |
| 7 | Передает в шаблоны параметры booking и today. |
| 8 | Создает объект EmailInfo с адресом получателя, темой, телом и типом содержимого. |
| 9 | Отправляет email с помощью бина emailer. Если возникает ошибка, метод показывает уведомление об ошибке. |
| 10 | Показывает уведомление об успешной отправке. |
Отправка и просмотр email
Чтобы проверить процесс генерации email:
-
Запустите приложение и перейдите в экран Application → Bookings.
-
Создайте новое бронирование. Выберите существующего пользователя с действующим адресом email в поле
creatorи заполните остальные обязательные поля. -
Выберите бронирование и нажмите Notify by Email. После этого приложение покажет уведомление об успехе.
-
Проверьте почтовый ящик получателя и убедитесь, что содержимое email соответствует данным бронирования и настроенному шаблону.