diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index 6c4ef31..a244d0c 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -7,6 +7,7 @@ import utils.DateUtilities; import utils.Printer; import utils.reflection.ReflectionUtilities; + import java.io.FileWriter; import java.io.IOException; import java.io.File; @@ -74,6 +75,7 @@ public Boolean sendEmail(String subject, String content, String contentType, Str properties.put("mail.smtp.host", host); properties.put("mail.smtp.port", "587"); properties.put("mail.smtp.auth", "true"); + properties.put("mail.smtp.starttls.enable", "true"); // Get the Session object.// and pass username and password Session session = Session.getInstance(properties, new Authenticator() { @@ -227,7 +229,7 @@ public static EmailMessage from(Message message) { return new EmailMessage(message); } - public void setFileName(String fileName){ + public void setFileName(String fileName) { this.fileName = fileName + ".html"; } } @@ -275,6 +277,7 @@ public Inbox(String host, this.userName = userName; this.password = password; this.secureCon = secureCon; + messages = new ArrayList<>(); } public static EmailMessage getEmail( @@ -386,7 +389,7 @@ public void load(boolean print, boolean save, boolean saveAttachments, List messages = List.of(folderInbox.getMessages()); + List messages = new ArrayList<>(List.of(folderInbox.getMessages())); + + // Reverse the order of the list + Collections.reverse(messages); for (Message message : messages) { if (emailMatch(EmailMessage.from(message), filterPairs)) @@ -653,18 +659,93 @@ public static void clearInbox( ); } + /** + * IMAP connection to get the inbox + */ + private Store getImapStore() { + Properties properties = new Properties(); + + //---------- Server Setting--------------- + properties.put("mail.imap.host", host); + properties.put("mail.imap.port", port); + if (secureCon.equalsIgnoreCase("ssl")) { + properties.put("mail.imap.ssl.enable", "true"); + } else { + properties.put("mail.imap.ssl.enable", "false"); + } + //---------- SSL setting------------------ + properties.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + properties.setProperty("mail.imap.socketFactory.fallback", "false"); + properties.setProperty("mail.imap.socketFactory.port", String.valueOf(port)); + Session session = Session.getInstance(properties); + Store store = null; + try { + log.info("Connecting please wait...."); + store = session.getStore("imap"); + store.connect(userName, password); + } catch (MessagingException exception) { + log.error(exception.getLocalizedMessage(), exception); + } + return store; + } + + /** * Clears the email inbox using the configured email credentials and server settings. */ public void clearInbox() { - log.info("Flushing email inbox..."); - new EmailUtilities.Inbox( - host, - port, - userName, - password, - secureCon - ); + try { + Store store = getImapStore(); + Folder folderInbox = store.getFolder("INBOX"); + folderInbox.open(Folder.READ_WRITE); + + // fetches new messages from server + log.info("Getting inbox.."); + List messages = List.of(folderInbox.getMessages()); + + log.info("Deleting messages.."); + // Delete all the messages + for (Message message : messages) { + message.setFlag(Flags.Flag.DELETED, true); + } + + // Delete messages and close connection + folderInbox.close(true); + store.close(); + log.info(messages.size() + " messages have been successfully deleted!"); + + } catch (MessagingException exception) { + log.error(exception.getLocalizedMessage(), exception); + } + } + + /** + * Clear inbox in batches - use it on the large inboxes to optimize the process + */ + public void clearInboxInBatches(int batchSize) { + try { + Store store = getImapStore(); + Folder folderInbox = store.getFolder("INBOX"); + folderInbox.open(Folder.READ_WRITE); + + // fetches new messages from server + log.info("Getting inbox.."); + List messages = List.of(folderInbox.getMessages()); + List batchToDelete = messages.subList(0, batchSize); + log.info("Deleting messages.."); + // Delete all the messages + for (Message message : batchToDelete) { + message.setFlag(Flags.Flag.DELETED, true); + } + + // Delete messages and close connection + folderInbox.close(true); + store.close(); + log.info(batchToDelete.size() + " messages out of " + messages.size() + " have been successfully deleted!"); + + } catch (MessagingException exception) { + log.error(exception.getLocalizedMessage(), exception); + } } } } diff --git a/src/test/java/AppTest.java b/src/test/java/AppTest.java index 8592adc..48a5c80 100644 --- a/src/test/java/AppTest.java +++ b/src/test/java/AppTest.java @@ -178,7 +178,47 @@ public void getCurrentDateTest() { ); printer.success("The getSimpleDateFormatStringFromTest() test passed!"); } - + + @Test + public void cleanEmailTest() { + EmailUtilities.Inbox inbox = new EmailUtilities.Inbox("pop.gmail.com", + "995", + ContextStore.get("test-email"), + ContextStore.get("test-email-application-password"), + "ssl"); + + String emailTestContent = "username:xyz"; + String emailSubject = "Test subject of email for deletion"; + EmailUtilities emailUtilities = new EmailUtilities(ContextStore.get("host")); + emailUtilities.sendEmail( + emailSubject, + emailTestContent, + ContextStore.get("test-email"), + ContextStore.get("sender-test-email"), + ContextStore.get("test-email-master-password"), + null); + + inbox.load(30, 1, false, false, false, + List.of(Pair.of(SUBJECT, emailSubject))); + Assert.assertEquals("Unexpected number of emails found!", 1, inbox.getMessages().size()); + + new EmailUtilities.Inbox("imap.gmail.com", + "993", + ContextStore.get("test-email"), + ContextStore.get("test-email-application-password"), + "ssl").clearInbox(); + + EmailUtilities.Inbox newInbox = new EmailUtilities.Inbox("pop.gmail.com", + "995", + ContextStore.get("test-email"), + ContextStore.get("test-email-application-password"), + "ssl"); + newInbox.load(SUBJECT, emailSubject, false, true, true); + + Assert.assertEquals("Unexpected number of emails found!", 0, newInbox.getMessages().size()); + printer.success("cleanEmailTest() is successful!"); + } + @Test public void filterEmailTest() { EmailUtilities.Inbox inbox = new EmailUtilities.Inbox( @@ -189,7 +229,12 @@ public void filterEmailTest() { "ssl" ); - inbox.clearInbox(); + new EmailUtilities.Inbox("imap.gmail.com", + "993", + ContextStore.get("test-email"), + ContextStore.get("test-email-application-password"), + "ssl").clearInbox(); + String emailTestContent = "username:xyz"; EmailUtilities emailUtilities = new EmailUtilities(ContextStore.get("host")); emailUtilities.sendEmail(