Как отправлять почту с использованием Java в определенное время ежедневно - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над приложением web_application sing Java, servlets, JSP и использую apache Tomcat в качестве сервера приложений

Что я сделал

  • Я создал UI, где пользователь выбирает почтовые идентификаторы (они могут выбрать более одного)
  • И когда пользователь нажимает кнопку отправки, я запускаю свой класс Java и отправляю почту

Теперь, что я должен сделать

  • Теперь я должен делать это динамически, каждую ночь в 12:00. Я должен отправлять почту некоторым конкретным пользователям

  • Пользователь, которому я должен отправить почту, получает этот почтовый идентификатор из запроса на вход в систему, так что это не проблема

  • Я просто хочу знать, как я могу отправлять почту, когда полночь 12:00

Кодирование, которое я делал до сих пор

класс сервлетов

public class EmailSendingServlet extends HttpServlet {

private static final long serialVersionUID = 1L;
private String host;
private String port;
private String user;
private String pass;

public void init() {

    ServletContext context = getServletContext();
    host = context.getInitParameter("host");
    port = context.getInitParameter("port");
    user = context.getInitParameter("user");
    pass = context.getInitParameter("pass");
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String recipient = request.getParameter("To"); // this i will get from login query
    String subject = request.getParameter("subject");//this i can define manually
    String content = request.getParameter("content");//same for this also


    String resultMessage = "";

    try {
        EmailUtility.sendEmail(host, port, user, pass, recipient, subject,
                content);
        resultMessage = "The e-mail was sent successfully";
    } catch (Exception ex) {
        ex.printStackTrace();
        resultMessage = "There were an error: " + ex.getMessage();
    } 
}

}

Класс Java Utility

public class EmailUtility {
public static void sendEmail(String host, String port, final String userName, final String password,
        String toAddress, String subject, String message) throws AddressException, MessagingException {


    Properties properties = new Properties();
    properties.put("mail.smtp.host", host);
    properties.put("mail.smtp.port", port);
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.starttls.enable", "true");
    Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password);
        }
    });
    session.setDebug(false);
    Message msg = new MimeMessage(session);

    msg.setFrom(new InternetAddress(userName));
    if (toAddress!= null) {
        List<String> emails = new ArrayList<>();
        if (toAddress.contains(",")) {
            emails.addAll(Arrays.asList(toAddress.split(",")));
        } else {
            emails.add(toAddress);
        }
        Address[] to = new Address[emails.size()];
        int counter = 0;
        for(String email : emails) {
            to[counter] = new InternetAddress(email.trim());
            counter++;
        }
        msg.setRecipients(Message.RecipientType.TO, to);
    }
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    msg.setText(message);

    Transport.send(msg);

}

} * * тысяча пятьдесят-один

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Вы можете использовать ScheduledExecutorService для обработки этого в "простой" Java:

 ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
 int count = 0;

        Runnable task = () -> {
            count++;
            System.out.println(count);
        };

        ScheduledFuture<?> scheduledFuture = ses.scheduleAtFixedRate(task, 12, TimeUnit.HOURS);

Существует также метод для использования начальной задержки, но вы можете прочитать больше здесь: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

Для вашего случая использования:

Введите новый класс EmailSendJobUtil:

public class EmailSendUtil {
  public void createAndSubmitSheduledJob() {
   ScheduledExecutorService ses = Executors.sheduledThreadPool(1);
   ScheduledFuture<> sheduledFuture = ses.sheduleAtFixedRate(EmailUtility.sendMail(), 12, TimeUnit.HOURS);
  }
}

Однако у вас будут проблемы с вашей структурой кода.Попробуйте ввести в свой EmailUtility метод, который включает в себя автоматическую отправку писем.

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

public class MailJobRepository {
  private List<MailJob> jobs;

  void add();
  void remove();
  List<> getJobs();
}

И в вашем EmailUtility ввести новый метод:

public void sendAutomatedEmails() {
  jobRepository.getJobs().foreach(job -> {
   sendMail(job.getToAddress(), job.getSubject(), job.getMessage());
  });
}

Затем вы можете запланировать этот новый метод и разбить свой код налогические отдельные части.

Небольшая подсказка:

String host, String port, final String userName, final String password  

Это данные для вашей "стороны" отправки электронной почты, которые не должны передаваться в качестве параметра метода.Вы можете сохранить эти данные в своем EmailUtility классе.

0 голосов
/ 22 мая 2019

Вам стоит взглянуть на Заводной механизм isocline , который является движком Java-процесса. Он способен кодировать различные функции более эффективно, чем Quartz, и имеет специфическую функцию выполнения.

0 голосов
/ 14 мая 2019

В Java планировщик используется для планирования потока или задачи , которая выполняется в определенный период времени или периодически с фиксированным интервалом. Есть несколько способов запланировать задачу в Java:

  • java.util.TimerTask
  • java.util.concurrent.ScheduledExecutorService
  • Кварцевый планировщик
  • org.springframework.scheduling.TaskScheduler

Для чистой реализации java без использования фреймворка с использованием ScheduledExecutorService запуска задачи в определенные периоды:

public void givenUsingExecutorService_whenSchedulingRepeatedTask_thenCorrect() 
  throws InterruptedException {
    TimerTask repeatedTask = new TimerTask() {
        public void run() {
        EmailUtility.sendEmail(host, port, user, pass, recipient,object,content);
        System.out.println("The e-mail was sent successfully");
    }
};

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
ZonedDateTime nextRun = now.withHour(5).withMinute(0).withSecond(0);
if(now.compareTo(nextRun) > 0)
  nextRun = nextRun.plusDays(1);
Duration duration = Duration.between(now, nextRun);
long initalDelay = duration.getSeconds();

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(repeatedTask,
initalDelay,
TimeUnit.DAYS.toSeconds(1),
TimeUnit.SECONDS);
executor.shutdown();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...