计划在spring boot中发送电子邮件

7ajki6be  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(529)

我想安排发送电子邮件通知使用 Spring 启动,用户创建通知(主题,消息,发送日期…)

  1. public class EmailNotification implements Serializable {
  2. /**
  3. *
  4. */
  5. private static final long serialVersionUID = 3400952201530474821L;
  6. @Id
  7. @GeneratedValue(strategy = GenerationType.AUTO)
  8. private long id;
  9. private String subject;
  10. private String message;
  11. @Column(name = "sending_date")
  12. @Basic(fetch = FetchType.EAGER)
  13. private String sendingDate;

通常情况下,我会从db获得一个通知列表,我应该使用循环“for”发送每个通知,其中包含它自己的信息(由客户端指定),但是我发现发送时间有问题,我无法使用@scheduled注解,因为这里的cron表达式应该是动态的(从db检索)这里是我的方法:

  1. public void periodicNotification() {
  2. JavaMailSenderImpl jms = (JavaMailSenderImpl) sender;
  3. MimeMessage message = jms.createMimeMessage();
  4. MimeMessageHelper helper;
  5. try {
  6. helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());
  7. //get the list of notifs from the DB
  8. List<EmailNotification> emailNotifs = emailNotificationsRepo.findAll();
  9. for (EmailNotification i : emailNotifs)
  10. {
  11. helper.setFrom("mail");
  12. List<String> recipients = fileRepo.findWantedEmails(i.getDaysNum());
  13. String[] to = recipients.stream().toArray(String[]::new);
  14. helper.setTo(to);
  15. helper.setText(i.getMessage());
  16. helper.setSubject(i.getSubject());
  17. sender.send(message);
  18. System.out.println("Email successfully sent to: " + Arrays.toString(to));
  19. }
  20. }
  21. catch (MessagingException e) {
  22. e.print...
  23. }
  24. }

我开始了这个方法:

  1. public static void main(String[] args) {
  2. try {
  3. JobDetail job1 = JobBuilder.newJob(Job1.class).withIdentity("job1", "group1").build();
  4. Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity("cronTrigger1", "group1")
  5. .withSchedule(CronScheduleBuilder.cronSchedule("0/30 * * * * ?")).build();
  6. Scheduler scheduler1 = new StdSchedulerFactory().getScheduler();
  7. scheduler1.start();
  8. scheduler1.scheduleJob(job1, trigger1);
  9. Thread.sleep(100000);
  10. scheduler1.shutdown();
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }

但是我想在客户机指定的时间安排电子邮件的发送,在上面的方法中,cron表达式是静态的,这不是我想要的

lqfhib0f

lqfhib0f1#

我建议你去探索石英图书馆。首先:https://www.baeldung.com/spring-quartz-schedule. 它与spring很好地集成,并提供比标准spring实现更智能的调度。它还支持计划任务的持久性。
这里还有一个人工创造就业机会的例子。因此,您可以使用客户指定的时间和日期发送电子邮件。
或者,您可以使用默认的spring@scheduled注解获取当前发送日期(例如每午夜)的所有未发送电子邮件,然后发送并将通知标记为已发送。但当然,如果你的应用程序有几个复制品的话,就会出现问题。所以我认为使用石英是最成熟的解决方案。

相关问题