powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Отправка почты через Spring Boot Mail
12 сообщений из 12, страница 1 из 1
Отправка почты через Spring Boot Mail
    #40005705
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привествую,
Хочу написать сервис по отправке сообщений на почту определенным пользователям. Достаю данные из БД, закидываю их в список (в виде объектов) и далее "дергаю" необходимые мне поля.

Есть конфиг для mail sender, в котором ничего интересного:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
@Configuration
public class MailConfig {

    @Value("${spring.mail.host}")
    private String host;
    @Value("${spring.mail.username}")
    private String username;
    @Value("${spring.mail.password}")
    private String password;
    @Value("${spring.mail.port}")
    private int port;
    @Value("${spring.mail.protocol}")
    private String protocol;
    @Value("${spring.mail.debug}")
    private String debug;
    @Value("${spring.mail.properties.mail.smtp.auth}")
    private String auth;
    @Value("${spring.mail.properties.mail.smtp.starttls.enable}")
    private String enable;

    @Bean
    public JavaMailSender getMailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(host);
        javaMailSender.setPort(port);
        javaMailSender.setUsername(username);
        javaMailSender.setPassword(password);
        javaMailSender.setProtocol(protocol);
        Properties properties = javaMailSender.getJavaMailProperties();
        properties.setProperty("mail.transport.protocol", protocol);
        properties.setProperty("mail.debug", debug);
        properties.setProperty("mail.smtp.auth", auth);
        properties.setProperty("mail.smtp.starttls.enable", enable);
        return javaMailSender;
    }
}



Но отправляемое сообщение должно представлять собой таблицу. Пока лучшего решения не нашел, накидал такой сервис, который строит таблицу через StringBuilder:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@Service
public class TableGenerationService {

    @Autowired
    private Message messageRepository;

    public String generateReportMessage(List<Message> messages) {
        StringBuilder stringBuilder = generateCommonHtmlHead();

        for (Message message : messages) {

            stringBuilder.append("<tr>");
            stringBuilder.append("<td>").append(message.getAuthorName()).append("</td>");
            stringBuilder.append("<td>").append(message.getUsername()).append("</td>");
            stringBuilder.append("<td>").append(message.getContent()).append("</td>");
            stringBuilder.append("<td>").append(message.getDate()).append("</td>");
            stringBuilder.append("<td>").append(message.getTag()).append("</td>");
            stringBuilder.append("</tr>");
        }
        generateCommonFooter(stringBuilder);
        return stringBuilder.toString();
    }


    private StringBuilder generateCommonHtmlHead() {
        StringBuilder stringBuilder = new StringBuilder();

        return stringBuilder.append("<head>")
                .append("<h1>Status<h1>")
                .append("</head>")
                .append("<body>")
                .append("<table border=1>")
                .append("<tr>")
                .append("<th>Author name</th><th>Username</th><th>Content</th><th>Date</th><th>Tag</th>")
                .append("</tr>");
    }

    private void generateCommonFooter(StringBuilder stringBuilder) {
        stringBuilder.append("</table></body>");
    }


    public String generateReportMessage() {
        List<Message> all = messageRepository.findAll();
        return generateReportMessage(all);
    }
}


И отдельный сервис для отправки сообщения с методом для отправки:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public void send(String subject, String htmlMsg, String to)  {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, false, "utf-8");
            message.setContent(htmlMsg, "text/html");
            helper.setTo(to);
            helper.setSubject(subject);
            mailSender.send(message);
        } catch (MessagingException e) {
            log.error(e.toString());
        }
    }



Решение через StringBuilder конечно интересное, но может есть какие-то другие пути для решения данного вопроса? Например, готовые библиотеки для генерации подобных таблиц? А если подключать CSS-стили? Либо стоит создавать отдельный динамически генерируемый html файл (через thymeleaf/freemarker) и отправлять его?
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40005756
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте использовать шаблоны Velocity
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40005868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha, а чего у тебя так много MailConfig? Зачем оно вообще? Переливание из одних пропертей в другие.

Вот более лаконичный вариант https://www.baeldung.com/spring-email
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40005947
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
miroooha, а чего у тебя так много MailConfig? Зачем оно вообще? Переливание из одних пропертей в другие.

Вот более лаконичный вариант https://www.baeldung.com/spring-email

Если соберетесь отправлять письма с аттачами приготовьтесь к непонятным глюкам
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40005949
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие аттачменты? Тут - просто рассылка алёртов.
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006001
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Какие аттачменты? Тут - просто рассылка алёртов.

Тогда норм!
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006049
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение нашел, через FreeMarker, вроде неплохо выглядит на тестовом этапе.

У меня возник такой вопрос (не хочется отдельный топик заводить): есть сущность, которая заполняется данными из БД. Но у меня возникла потребность в добавлении нового поля для этой сущности, хранение которого не предполагается в таблице, оно лишь нужно для "внутренних" преобразований. В таком случае лучше использовать DTO, либо просто добавить в сущность поле, помеченное @Transient? Есть ли смысл делать DTO, если такой объект используется грубо говоря в одном месте. Не будет ли это оверхедом?
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreeMarker почти тоже что и Velocity. Ну я особой разницы не видел.
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006139
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,

Не хранится, то есть ВЫЧИСЛЯЕМОЕ?
Секрет что ли по человечески рассказать?
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006146
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha, как программист ты можешь заводить в сущности столько полей сколько тебе надо.
В полях нет никакого колдунства или черной магии. Просто убери маппинг для этого поля
если у тебя используется какой-то ORM.
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006159
miroooha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

Ну это отдельное поле (мапа), которая нужна для того, чтобы связать FreeMarker и мой объект, который я и поставляю этому шаблонизатору.
...
Рейтинг: 0 / 0
Отправка почты через Spring Boot Mail
    #40006166
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miroooha,
Ну, получается так.
В веб сессии короткие, доли сек.
Ты из бд берешь объект, с этим пустым полем. Потом сразу его заполняешь и другой кто читает.
И все это за доли сек.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Отправка почты через Spring Boot Mail
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]