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:

  1. Запустите приложение и перейдите в экран Application → Bookings.

  2. Создайте новое бронирование. Выберите существующего пользователя с действующим адресом email в поле creator и заполните остальные обязательные поля.

  3. Выберите бронирование и нажмите Notify by Email. После этого приложение покажет уведомление об успехе.

  4. Проверьте почтовый ящик получателя и убедитесь, что содержимое email соответствует данным бронирования и настроенному шаблону.

    resulting email