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

Есть конфиг для 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
06.10.2020, 15:01
    #40005756
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отправка почты через Spring Boot Mail
Попробуйте использовать шаблоны Velocity
...
Рейтинг: 0 / 0
06.10.2020, 16:55
    #40005868
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отправка почты через Spring Boot Mail
miroooha, а чего у тебя так много MailConfig? Зачем оно вообще? Переливание из одних пропертей в другие.

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

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

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

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

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

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

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


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