From 15efb130b87c17003a9695649e9390ae01ae7547 Mon Sep 17 00:00:00 2001 From: Valerie Ubei-Volk Date: Mon, 24 Mar 2025 18:14:11 +0100 Subject: [PATCH 1/3] Add clearInbox() method --- src/main/java/utils/email/EmailUtilities.java | 61 ++++++++++++++++--- src/test/java/AppTest.java | 42 ++++++++++++- 2 files changed, 92 insertions(+), 11 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index 6c4ef31..5b94933 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -74,6 +74,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() { @@ -275,6 +276,7 @@ public Inbox(String host, this.userName = userName; this.password = password; this.secureCon = secureCon; + messages = new ArrayList<>(); } public static EmailMessage getEmail( @@ -386,7 +388,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)) @@ -657,14 +662,50 @@ public static void clearInbox( * 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 - ); + 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); + //---------------------------------------- + + try { + log.info("Connecting please wait...."); + Store store = session.getStore("imap"); + store.connect(userName, password); + Folder folderInbox = store.getFolder("INBOX"); // TODO: Dynamically acquire folder + + folderInbox.open(Folder.READ_WRITE); + log.info("Connected to mail via " + host); + // opens the inbox folder + log.info("Getting inbox.."); + + // fetches new messages from server + List messages = List.of(folderInbox.getMessages()); + + // 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); + } } } } diff --git a/src/test/java/AppTest.java b/src/test/java/AppTest.java index 8592adc..6ae2f20 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( From 617e7b289e6edf508867d607dafd230972811395 Mon Sep 17 00:00:00 2001 From: Valerie Ubei-Volk Date: Tue, 25 Mar 2025 11:13:51 +0100 Subject: [PATCH 2/3] Add batch email clean up --- src/main/java/utils/email/EmailUtilities.java | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index 5b94933..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; @@ -228,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"; } } @@ -659,9 +660,9 @@ public static void clearInbox( } /** - * Clears the email inbox using the configured email credentials and server settings. + * IMAP connection to get the inbox */ - public void clearInbox() { + private Store getImapStore() { Properties properties = new Properties(); //---------- Server Setting--------------- @@ -677,22 +678,32 @@ public void clearInbox() { 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 store = session.getStore("imap"); + store = session.getStore("imap"); store.connect(userName, password); - Folder folderInbox = store.getFolder("INBOX"); // TODO: Dynamically acquire folder + } 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() { + try { + Store store = getImapStore(); + Folder folderInbox = store.getFolder("INBOX"); folderInbox.open(Folder.READ_WRITE); - log.info("Connected to mail via " + host); - // opens the inbox folder - log.info("Getting inbox.."); // 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); @@ -707,5 +718,34 @@ public void clearInbox() { 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); + } + } } } From 2963c0ba57ba453e39badbaeaa63f3b6a1d67c99 Mon Sep 17 00:00:00 2001 From: Valerie Ubei-Volk Date: Tue, 25 Mar 2025 12:51:06 +0100 Subject: [PATCH 3/3] Fix filterEmailTest() --- src/test/java/AppTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/AppTest.java b/src/test/java/AppTest.java index 6ae2f20..48a5c80 100644 --- a/src/test/java/AppTest.java +++ b/src/test/java/AppTest.java @@ -229,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(