diff --git a/pom.xml b/pom.xml index 7103068..5533462 100644 --- a/pom.xml +++ b/pom.xml @@ -34,6 +34,7 @@ 2.8.5 0.5.13-SNAPSHOT 1.7.26 + 1.4 @@ -48,6 +49,12 @@ ${slf4j.ver} + + javax.mail + mail + ${mail.ver} + + org.apache.logging.log4j log4j-slf4j-impl diff --git a/src/main/java/org/sadtech/bot/core/domain/Person.java b/src/main/java/org/sadtech/bot/core/domain/Person.java index 80970ee..646d076 100644 --- a/src/main/java/org/sadtech/bot/core/domain/Person.java +++ b/src/main/java/org/sadtech/bot/core/domain/Person.java @@ -9,18 +9,7 @@ public class Person { private String lastName; private Integer sex; private String city; - - public Person() { - - } - - public Person(Integer id, String firstName, String lastName, Integer sex, String city) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - this.sex = sex; - this.city = city; - } + private String email; public Integer getId() { return id; @@ -62,21 +51,41 @@ public class Person { this.city = city; } + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (!(o instanceof Person)) return false; Person person = (Person) o; return Objects.equals(id, person.id) && Objects.equals(firstName, person.firstName) && Objects.equals(lastName, person.lastName) && Objects.equals(sex, person.sex) && - Objects.equals(city, person.city); + Objects.equals(city, person.city) && + Objects.equals(email, person.email); } @Override public int hashCode() { - return Objects.hash(id, firstName, lastName, sex, city); + return Objects.hash(id, firstName, lastName, sex, city, email); } + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", sex=" + sex + + ", city='" + city + '\'' + + ", email='" + email + '\'' + + '}'; + } } diff --git a/src/main/java/org/sadtech/bot/core/repository/impl/MailRepositoryList.java b/src/main/java/org/sadtech/bot/core/repository/impl/MailRepositoryList.java index 4231cb1..521b024 100644 --- a/src/main/java/org/sadtech/bot/core/repository/impl/MailRepositoryList.java +++ b/src/main/java/org/sadtech/bot/core/repository/impl/MailRepositoryList.java @@ -32,7 +32,7 @@ public class MailRepositoryList implements EventRepository, MailRepository public List getMailByTime(LocalDateTime timeFrom, LocalDateTime timeTo) { ArrayList rezultMails = new ArrayList<>(); for (int i = mails.size() - 1; i >= 0; i--) { - if (!(mails.get(i).getDate().isBefore(timeFrom) || mails.get(i).getDate().isAfter(timeTo))) { + if (!(mails.get(i).getDate().isBefore(timeFrom) || mails.get(i).getDate().isAfter(timeTo)) && mails.get(i).getDate().equals(timeFrom)) { rezultMails.add(this.mails.get(i)); } else if (mails.get(i).getDate().isBefore(timeFrom)) { break; diff --git a/src/main/java/org/sadtech/bot/core/sender/email/EmailConfig.java b/src/main/java/org/sadtech/bot/core/sender/email/EmailConfig.java new file mode 100644 index 0000000..abfbefe --- /dev/null +++ b/src/main/java/org/sadtech/bot/core/sender/email/EmailConfig.java @@ -0,0 +1,77 @@ +package org.sadtech.bot.core.sender.email; + +import java.util.Properties; + +public class EmailConfig { + + private Properties props = new Properties(); + private String username; + private String password; + + private EmailConfig() { + + } + + public Properties getProps() { + return props; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + + public static Builder builder() { + return new EmailConfig().new Builder(); + } + + public class Builder { + + private Builder() { + + } + + public Builder smtpHost(String smtpHost) { + EmailConfig.this.props.setProperty("mail.smtp.host", smtpHost); + return this; + } + + public Builder smtpSocketFactoryPort(Integer smtpSocketFactoryPortort) { + EmailConfig.this.props.setProperty("mail.smtp.socketFactory.port", smtpSocketFactoryPortort.toString()); + return this; + } + + public Builder smtpSocketFactoryClass(String smtpSocketFactoryClass) { + EmailConfig.this.props.setProperty("mail.smtp.socketFactory.class", smtpSocketFactoryClass); + return this; + } + + public Builder smtpAuth(Boolean smtpAuth) { + EmailConfig.this.props.setProperty("mail.smtp.auth", (smtpAuth) ? "true" : "false"); + return this; + } + + public Builder smtpPort(Integer smtpPort) { + EmailConfig.this.props.setProperty("mail.smtp.port", smtpPort.toString()); + return this; + } + + public Builder email(String username) { + EmailConfig.this.username = username; + return this; + } + + public Builder password(String password) { + EmailConfig.this.password = password; + return this; + } + + public EmailConfig build() { + return EmailConfig.this; + } + + } +} diff --git a/src/main/java/org/sadtech/bot/core/sender/email/EmailSent.java b/src/main/java/org/sadtech/bot/core/sender/email/EmailSent.java new file mode 100644 index 0000000..9f20425 --- /dev/null +++ b/src/main/java/org/sadtech/bot/core/sender/email/EmailSent.java @@ -0,0 +1,47 @@ +package org.sadtech.bot.core.sender.email; + +import org.sadtech.bot.core.domain.BoxAnswer; +import org.sadtech.bot.core.exception.MailSendException; +import org.sadtech.bot.core.sender.Sent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.mail.*; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; + +public class EmailSent implements Sent { + + private static final Logger log = LoggerFactory.getLogger(Sent.class); + + private final EmailConfig emailConfig; + + public EmailSent(EmailConfig emailConfig) { + this.emailConfig = emailConfig; + } + + @Override + public void send(Integer personId, String htmlText) { + Session session = Session.getDefaultInstance(emailConfig.getProps(), new Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(emailConfig.getUsername(), emailConfig.getPassword()); + } + }); + + try { + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(emailConfig.getUsername())); + message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(emailConfig.getUsername())); + message.setContent(htmlText, "text/html; charset=utf-8"); + Transport.send(message); + } catch (MessagingException e) { + log.error(e.getMessage()); + throw new MailSendException(); + } + } + + @Override + public void send(Integer personId, BoxAnswer boxAnswer) { + + } +} diff --git a/src/main/java/org/sadtech/bot/core/service/MailService.java b/src/main/java/org/sadtech/bot/core/service/MailService.java new file mode 100644 index 0000000..6a0db7e --- /dev/null +++ b/src/main/java/org/sadtech/bot/core/service/MailService.java @@ -0,0 +1,7 @@ +package org.sadtech.bot.core.service; + +import org.sadtech.bot.core.domain.Mail; + +public interface MailService extends EventService { + +} diff --git a/src/main/java/org/sadtech/bot/core/service/impl/MailServiceImpl.java b/src/main/java/org/sadtech/bot/core/service/impl/MailServiceImpl.java new file mode 100644 index 0000000..4cb0d04 --- /dev/null +++ b/src/main/java/org/sadtech/bot/core/service/impl/MailServiceImpl.java @@ -0,0 +1,72 @@ +package org.sadtech.bot.core.service.impl; + +import org.sadtech.bot.core.domain.Mail; +import org.sadtech.bot.core.repository.MailRepository; +import org.sadtech.bot.core.repository.impl.MailRepositoryList; +import org.sadtech.bot.core.service.MailService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class MailServiceImpl implements MailService { + + private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class); + + private final MailRepository mailRepository; + + public MailServiceImpl() { + this.mailRepository = new MailRepositoryList(); + } + + public MailServiceImpl(MailRepository mailRepository) { + this.mailRepository = mailRepository; + } + + @Override + public void add(Mail mail) { + mailRepository.add(mail); + log.info("Сообщение добавлено в репозиторий"); + log.info(mail.toString()); + } + + @Override + public List getFirstEventByTime(LocalDateTime timeFrom, LocalDateTime timeTo) { + log.info("Запрошены сообщения " + timeFrom + " - " + timeTo); + List mails = mailRepository.getMailByTime(timeFrom, timeTo); + Set people = new HashSet<>(); + List returnMails = new ArrayList<>(); + for (int i = mails.size() - 1; i >= 0; i--) { + if (!people.contains(mails.get(i).getPersonId())) { + returnMails.add(mails.get(i)); + people.add(mails.get(i).getPersonId()); + } + } + return returnMails; + } + + @Override + public List getLastEventByTime(LocalDateTime timeFrom, LocalDateTime timeTo) { + List mails = mailRepository.getMailByTime(timeFrom, timeTo); + Set people = new HashSet<>(); + List returnMails = new ArrayList<>(); + for (Mail mail : mails) { + if (!people.contains(mail.getPersonId())) { + returnMails.add(mail); + people.add(mail.getPersonId()); + } + } + return returnMails; + } + + @Override + public List getEvent(LocalDateTime timeFrom, LocalDateTime timeTo) { + log.info("Запрос на получение сообщений в интервале от " + timeFrom + " до " + timeTo); + return mailRepository.getMailByTime(timeFrom, timeTo); + } + +}