3. Генерация email из шаблонов
Давайте рассмотрим пример генерации электронного письма на основе шаблонов темы и тела сообщения, созданных в предыдущем разделе.
Прежде чем мы начнем, убедитесь, что установлено дополнение Email Sending. Если оно еще не установлено, пожалуйста, установите его перед продолжением.
Далее настройте необходимые параметры отправки электронной почты, чтобы обеспечить успешную доставку писем.
Добавление кнопки об уведомлении
Давайте добавим кнопку Notify by Email в экране списка бронирований. Эта кнопка позволит пользователям отправлять уведомление по электронной почте создателю бронирования, выбранного в таблице данных.
Найдите booking-list-view.xml
в окне инструментов Jmix и дважды щелкните по нему. Откроется дизайнер экранов. Выберите action
в панели иерархии Jmix UI или в XML-дескрипторе. Затем нажмите кнопку Add на панели инспектора компонентов. В выпадающем списке выберите Action:

В диалоговом окне Add Action выберите действие list_itemTracking
. Действие list_itemTracking
автоматически активируется только тогда, когда в связанной таблице данных выбран определенный элемент.
Настройте следующие атрибуты для этого действия:
<action id="notifyEmail"
type="list_itemTracking"
icon="ENVELOPE"
text="msg://notifyEmail.text"/>
Затем в контейнере buttonsPanel
добавьте кнопку и свяжите ее с вновь созданным действием.
<hbox id="buttonsPanel" classNames="buttons-panel">
<!--...-->
<button id="notifyEmailButton" action="bookingsDataGrid.notifyEmail"/>
</hbox>
Генерация email на основе шаблона
Сгенерируйте метод-обработчик события ActionPerformedEvent
для действия notifyEmailButton
. Добавьте в него следующую логику:
@ViewComponent
private DataGrid<Booking> bookingsDataGrid;
@Autowired
private MessageTemplateProperties messageTemplateProperties; (1)
@Autowired
private MessageTemplatesGenerator messageTemplatesGenerator; (2)
@Autowired
private Emailer emailer; (3)
@Autowired
private Notifications notifications; (4)
@Subscribe("bookingsDataGrid.notifyEmail")
public void onBookingsDataGridNotifyEmail(final ActionPerformedEvent event) {
Booking booking = bookingsDataGrid.getSingleSelectedItem();
User creator = booking.getCreator(); (5)
String email = creator.getEmail();
if (email == null) {
showNoEmailNotification(creator); (6)
return;
}
List<String> messages = messageTemplatesGenerator.generateMultiTemplate()
.withTemplateCodes("booking-email-subject", "booking-email-body") (7)
.withParams(
Map.of(
"booking", booking,
"today", new Date(),
"penalty", 5000
)) (8)
.generate();
EmailInfo emailInfo = EmailInfoBuilder.create()
.setAddresses(email)
.setSubject(messages.get(0))
.setBody(messages.get(1))
.setBodyContentType("text/html; charset=UTF-8")
.build(); (9)
try {
emailer.sendEmail(emailInfo); (10)
} catch (EmailException e) {
showSendingErrorNotification(email);
}
showSendingSuccessNotification(email); (11)
}
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 | Предоставляет свойства конфигурации для шаблонизатора FreeMarker. |
2 | Бин для генерации сообщений из шаблонов. |
3 | Бин для отправки электронных писем. |
4 | Бин для отображения уведомлений пользователю. |
5 | Извлекает выбранное бронирование (booking ) и его создателя (creator ) из bookingsDataGrid . |
6 | Проверяет, указан ли адрес электронной почты у создателя (creator ) бронирования. Если нет, отображается уведомление, и метод завершает работу. |
7 | Генерирует тему и тело сообщения, используя шаблоны FreeMarker (booking-email-subject и booking-email-body ). |
8 | Передает динамические параметры (booking , today , и penalty ) в шаблоны. |
9 | Создает объект EmailInfo , содержащий адрес электронной почты получателя, тему письма, тело письма и тип контента. |
10 | Пытается отправить электронное письмо, используя бин emailer . В случае ошибки отображается уведомление о неудаче. |
11 | Отображает уведомление об успехе, если электронное письмо успешно отправлено. |
Резюме
В этом разделе вы узнали, как работать с шаблонами сообщений для автоматизации отправки уведомлений по электронной почте в вашем приложении.
Вы получили практический опыт добавления кнопки Notify by Email в экран, настройки действия для запуска процесса отправки электронной почты и написания кода для динамической генерации электронного сообщения с использованием данных из выбранной сущности.
Вы также узнали о важности установки дополнения Email Sending и настройки параметров отправки электронной почты.