Java- Как использовать сервисы для отправки электронной почты?

У меня есть простое веб-приложение, в которое могут входить разные пользователи. Одной из важных функций является то, что пользователь может получить доступ к документу и отправить электронное письмо с его содержимым постороннему лицу, например третьему лицу. Ниже показано, как выглядит электронное письмо, чтобы дать представление:

Java- Как использовать сервисы для отправки электронной почты?

Это довольно понятно, и я могу отправить нескольким пользователям, если захочу, как [email protected],[email protected],... в показанном поле поля. При всем этом я использую Java Mail API, чтобы заставить его работать, и после нажатия кнопки отправки он отправляет непосредственно получателю. Никаких проблем.

Теперь я хочу изменить это, выполнив эту функцию электронной почты в качестве службы. Это означает, что когда я отправляю электронное письмо, заполненный контент и информация будут храниться в таблице в MYSQL, и служба (работающая в фоновом режиме) выберет встать из-за стола и сделать посылку.

Это моя функция:

public void sendEmail(String recipient, String subject, String content,
                      String host, String port, final String senderaddress, 
                      final String password) {
    try {
        System.out.println("Please Wait, sending email...");

        /*Setup mail server */
        Properties props = new Properties();
        props.put("mail.smtp.host", host); //SMTP Host
        props.put("mail.smtp.port", port); //TLS Port
        props.put("mail.smtp.auth", "true"); //enable authentication
        props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
        //create Authenticator object to pass in Session.getInstance argument
        Authenticator auth = new Authenticator() {
            //override the getPasswordAuthentication method
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(senderaddress, password);
            }
        };
        Session session = Session.getInstance(props, auth);
        session.setDebug(true);

        // Define message
        MimeMessage message = new MimeMessage(session);
        // Set From: header field of the header.
        message.setFrom(new InternetAddress(senderaddress));
        message.addRecipients(Message.RecipientType.TO,
                              InternetAddress.parse(recipient));
        // Set Subject: header field
        message.setSubject(subject);

        // Now set the actual message
        message.setText(content);
        try {
            Transport.send(message);
        } catch (AddressException addressException) {
            addressException.printStackTrace();
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

Можно ли это сделать так, как я хочу, потому что я не уверен, как заставить это работать?

Я так понимаю ваше основное приложение его сохраняет и не вызывает службу отправки почты? Вы можете использовать запланированное задание, чтобы забрать недавно сохраненные электронные письма и отправить их.

Cray 09.04.2019 06:45

(О, я понял. Этот вопрос не о коде, который вы разместили. Он касается кода, который вы еще не написали. Вопрос: почему вы включили этот код... если он не имеет отношения к вашему вопросу? )

Stephen C 09.04.2019 06:50

Ответ: да, это можно сделать так, как вы хотите. 1) Периодически запрашивайте базу данных для извлечения писем для отправки. 2) Отправьте каждую строку по очереди. 3) Отправить письмо. 4) Удалить строку или пометить строку как отправленную. Обратите внимание, что это не гарантирует, что электронные письма действительно будут доставлены, и не касается адресов электронной почты, которые могут быть неправильно отформатированы.

Stephen C 09.04.2019 06:55

@Cray Да, это правильно, можешь рассказать больше? Потому что я планирую создать еще один модуль (main, java), чтобы обрабатывать это как услугу.

Daredevil 09.04.2019 07:34

@StephenC Да, речь идет о коде, который я не писал. Я подумал, что включение кода даст представление о том, как я отправляю электронное письмо напрямую.

Daredevil 09.04.2019 07:35

@StephenC Понятно. Я еще создал таблицу и думаю, сколько столбцов подойдет для этого случая?

Daredevil 09.04.2019 07:36

Ну, у вас есть 2 вещи: 1. сохранить электронные письма в БД, 2. запланированный отправитель электронной почты. Проведите некоторое исследование того, как сделать любой из них, и если вы получите ошибки, попросите о помощи.

Cray 09.04.2019 07:39

Один столбец для каждого поля, относящегося к электронному письму (например, тема, получатель, содержание и т. д.), а также столбцы для записи уникального идентификатора, временных меток и статуса. Вы должны быть в состоянии работать с нашими требованиями.

Stephen C 09.04.2019 07:47

Понимаю. С точки зрения дизайна, если служба получает электронное письмо и отправляет его, эта запись должна быть удалена из этой таблицы, без каких-либо причин для статуса, временной метки и т. д. Будет ли столбец содержимого проблемой, если сообщение длинное?

Daredevil 09.04.2019 07:50

Это зависит от базы данных и типа, который вы используете для столбца. Для MySQL столбец varchar может содержать до 4096 символов. Кроме того, вам нужно будет использовать clob, что усложняется. Но вам действительно нужно начать искать эти вещи для себя в документации MySQL, документации JDBC (или учебнике) и так далее.

Stephen C 09.04.2019 07:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
10
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

1) После нажатия кнопки «Отправка почты» из пользовательского интерфейса вам необходимо вызвать метод для сохранения данных, например получатель, тема, содержание, в БД.

2) Напишите службу отправителя электронной почты, которая извлекает почту не доставлено / в ожидании из таблицы БД и отправляет ее через Java Mail API.

3) Запланированная служба отправителя электронной почты с помощью ScheduledExecutorService

Какие столбцы должны быть в моей таблице?

Daredevil 09.04.2019 08:06

@Daredevil, вы можете сделать столбец, например, получатель, тема, контент, mailStaus

Ajinkya 09.04.2019 08:08

Нужен ли mailstatus? Я думал, что после планирования службы она удалит запись из таблицы после отправки.

Daredevil 09.04.2019 08:10

@Daredevil столбец mailStatus может иметь значение Доставленный (если служба отправителя почты уже отправляет вызов) или В ожидании (если запись новая, а служба отправителя почты еще не вызывала эту запись)

Ajinkya 09.04.2019 08:12

То есть не нужно удалять записи при закачке данных в таблицу?

Daredevil 09.04.2019 08:13

@Daredevil, если вы удаляете запись после отправки, тогда столбец mailStatus не нужен, но для вас это очень надежно, если вы храните записи в течение определенного времени в БД даже после отправки почты (вы можете написать другую службу для удаления старой записи из БД и Секулировал это еженедельно )

Ajinkya 09.04.2019 08:18

Какой подход лучше?

Daredevil 09.04.2019 08:19

Давайте продолжить обсуждение в чате.

Ajinkya 09.04.2019 08:19

Другие вопросы по теме