EmailMessageBroker.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package cz.senslog.watchdog.messagebroker.email;
  2. import cz.senslog.watchdog.config.EmailMessageBrokerConfig;
  3. import cz.senslog.watchdog.config.MessageBrokerType;
  4. import cz.senslog.watchdog.domain.*;
  5. import cz.senslog.watchdog.messagebroker.MessageBroker;
  6. import cz.senslog.watchdog.messagebroker.MessageBrokerHandler;
  7. import cz.senslog.watchdog.messagebroker.MessageStatus;
  8. import cz.senslog.watchdog.messagebroker.writer.HtmlTableWriter;
  9. import cz.senslog.watchdog.messagebroker.writer.TableWriter;
  10. import cz.senslog.watchdog.provider.Record;
  11. import org.apache.logging.log4j.LogManager;
  12. import org.apache.logging.log4j.Logger;
  13. import javax.mail.*;
  14. import javax.mail.internet.*;
  15. import java.time.Instant;
  16. import java.time.format.DateTimeFormatter;
  17. import java.util.*;
  18. import static cz.senslog.watchdog.util.TimeConverter.dayToSec;
  19. import static java.time.format.DateTimeFormatter.ofPattern;
  20. import static javax.mail.Message.RecipientType.TO;
  21. public class EmailMessageBroker implements MessageBroker {
  22. private static final String BREAK_LINE = "<br />";
  23. private static final Logger logger = LogManager.getLogger(EmailMessageBroker.class);
  24. private final EmailMessageBrokerConfig config;
  25. private final Session session;
  26. public EmailMessageBroker(EmailMessageBrokerConfig config) {
  27. this.config = config;
  28. this.session = openSession(config);
  29. }
  30. private Session openSession(EmailMessageBrokerConfig config) {
  31. Properties props = new Properties();
  32. props.put("mail.smtp.host", config.getHost());
  33. props.put("mail.smtp.port", config.getPort());
  34. props.put("mail.smtp.auth", "true");
  35. props.put("mail.smtp.starttls.enable", "true");
  36. props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  37. Authenticator auth = new Authenticator() {
  38. protected PasswordAuthentication getPasswordAuthentication() {
  39. return new PasswordAuthentication(config.getUsername(), config.getPass());
  40. }
  41. };
  42. return Session.getInstance(props, auth);
  43. }
  44. private Message createMessage(Report report) throws MessagingException {
  45. Message message = new MimeMessage(session);
  46. message.setFrom(new InternetAddress(config.getSender()));
  47. message.setRecipients(TO, InternetAddress.parse(config.getRecipient()));
  48. message.setSubject(config.getSubject());
  49. MimeBodyPart mimeBodyPart = new MimeBodyPart();
  50. StringBuilder content = new StringBuilder();
  51. TableWriter tableWriter = HtmlTableWriter.createWithHeader("width: 100%;", "background-color: #dddddd")
  52. .cell("unitName (unitId)").cell("sensorName (sensorId)").cell("timestamp").cell("reported").cell("status").end();
  53. String reportedTime = report.getCreated().format(ofPattern("yyyy-MM-dd HH:mm:ss"));
  54. final String rowStyle = "border: 1px solid #dddddd; text-align: left; padding: 8px;";
  55. for (SimpleReport simpleReport : report.getReports()) {
  56. if (simpleReport.getRecord() instanceof ObservationInfo) {
  57. ObservationInfo observation = (ObservationInfo)simpleReport.getRecord();
  58. Source source = observation.getSource();
  59. boolean isOk = simpleReport.getStatus().equals(StatusReport.OK);
  60. String unitCell = String.format("%s (%s)", source.getUnit().getName(), source.getUnit().getId());
  61. String sensorCell = String.format("%s (%s)", source.getSensor().getName(), source.getSensor().getId());
  62. tableWriter.row(rowStyle + (isOk ? "background-color: #CCFFCC" : "background-color: #FFCCCC"))
  63. .cell(unitCell, rowStyle)
  64. .cell(sensorCell, rowStyle)
  65. .cell(observation.getTimestamp().toString(), rowStyle)
  66. .cell(reportedTime, rowStyle)
  67. .cell(simpleReport.getStatus().name(), rowStyle)
  68. .end();
  69. }
  70. }
  71. content.append(tableWriter.table()).append(BREAK_LINE);
  72. mimeBodyPart.setContent(content.toString(), "text/html");
  73. Multipart multipart = new MimeMultipart();
  74. multipart.addBodyPart(mimeBodyPart);
  75. message.setContent(multipart);
  76. return message;
  77. }
  78. @Override
  79. public void send(Report report, MessageBrokerHandler status) {
  80. if (report == null) {
  81. logger.info("Nothing to send. The receive report is null.");
  82. status.handle(new MessageStatus(null, "No report to send.")); return;
  83. }
  84. try {
  85. Message message = createMessage(report);
  86. logger.info("Sending a message via email.");
  87. Transport.send(message);
  88. logger.info("The message was send successfully.");
  89. status.handle(new MessageStatus(report));
  90. } catch (MessagingException e) {
  91. logger.catching(e);
  92. status.handle(new MessageStatus(report, e.getMessage()));
  93. }
  94. // vanish();
  95. }
  96. @Override
  97. public MessageBrokerType getType() {
  98. return MessageBrokerType.EMAIL;
  99. }
  100. public Record[] vanish() {
  101. Instant deadline = Instant.now().minusSeconds(dayToSec(config.getVanishPeriodDays()));
  102. List<Record> deletedRecords = new ArrayList<>();
  103. Iterator<Record> iterator = Collections.emptyListIterator();
  104. while(iterator.hasNext()) {
  105. Record record = iterator.next();
  106. if (record.getTimestamp().isBefore(deadline)) {
  107. deletedRecords.add(record);
  108. iterator.remove();
  109. }
  110. }
  111. return deletedRecords.toArray(new Record[0]);
  112. }
  113. }