From eeb78f3b4edb388c83ebea8aef817ee48ca0fd4c Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 11:25:49 +0100 Subject: [PATCH 1/8] Update EmailUtilities.java --- src/main/java/utils/email/EmailUtilities.java | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index a244d0c..0c5d734 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -375,22 +375,8 @@ public void load(EmailField filterType, String filterKey, boolean print, boolean * @param filterPairs a list of pairs consisting of email fields and corresponding filter strings */ public void load(boolean print, boolean save, boolean saveAttachments, List> filterPairs) { - Properties properties = new Properties(); - - //---------- Server Setting--------------- - properties.put("mail.pop3.host", host); - properties.put("mail.pop3.port", port); - if (secureCon.equalsIgnoreCase("ssl")) { - properties.put("mail.smtp.ssl.enable", "true"); - } else { - properties.put("mail.smtp.ssl.enable", "false"); - } - //---------- SSL setting------------------ - properties.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); - properties.setProperty("mail.pop3.socketFactory.fallback", "false"); - properties.setProperty("mail.pop3.socketFactory.port", String.valueOf(port)); + Properties properties = getConnectionProperties(); Session session = Session.getInstance(properties); - //---------------------------------------- try { log.info("Connecting please wait...."); @@ -421,6 +407,24 @@ public void load(boolean print, boolean save, boolean saveAttachments, List Date: Thu, 15 Jan 2026 11:41:44 +0100 Subject: [PATCH 2/8] Update EmailUtilities.java --- src/main/java/utils/email/EmailUtilities.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index 0c5d734..edfb9ea 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -680,6 +680,62 @@ private Store getImapStore() { return store; } + /** + * Clears the email inbox using the configured email credentials and server settings. + */ + public void clearInbox(List> filterPairs) { + 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.."); + for (Message message : messages) + if (emailMatch(EmailMessage.from(message), filterPairs)) + 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); + } + } + + + /** + * Clears the email inbox using the configured email credentials and server settings. + */ + public void clearInbox(Flags.Flag flag, Pair... filterPairs) { + 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.."); + for (Message message : messages) + if (emailMatch(EmailMessage.from(message), List.of(filterPairs))) + message.setFlag(flag, 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); + } + } /** * Clears the email inbox using the configured email credentials and server settings. From f6c592f73a860aa2202e3ca69f26aa54f81afaf8 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:09:19 +0100 Subject: [PATCH 3/8] Update EmailUtilities.java --- src/main/java/utils/email/EmailUtilities.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index edfb9ea..b14e5e8 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -712,7 +712,8 @@ public void clearInbox(List> filterPairs) { /** * Clears the email inbox using the configured email credentials and server settings. */ - public void clearInbox(Flags.Flag flag, Pair... filterPairs) { + @SafeVarargs + public final void clearInbox(Flags.Flag flag, Pair... filterPairs) { try { Store store = getImapStore(); Folder folderInbox = store.getFolder("INBOX"); @@ -722,15 +723,18 @@ public void clearInbox(Flags.Flag flag, Pair... filterPairs) log.info("Getting inbox.."); List messages = List.of(folderInbox.getMessages()); - log.info("Deleting messages.."); + log.info("Marking messages as " + flag); + int markedMessageCounter = 0; for (Message message : messages) - if (emailMatch(EmailMessage.from(message), List.of(filterPairs))) + if (emailMatch(EmailMessage.from(message), List.of(filterPairs))) { message.setFlag(flag, true); + markedMessageCounter+=1; + } // Delete messages and close connection folderInbox.close(true); store.close(); - log.info(messages.size() + " messages have been successfully deleted!"); + log.info(markedMessageCounter + " messages have been successfully mark as " + flag + "!"); } catch (MessagingException exception) { log.error(exception.getLocalizedMessage(), exception); From 21822edb0efea6de16c1aec0379fc203713b29d6 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:16:50 +0100 Subject: [PATCH 4/8] Create EmailFlag.java --- .../java/utils/email/mapping/EmailFlag.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/utils/email/mapping/EmailFlag.java diff --git a/src/main/java/utils/email/mapping/EmailFlag.java b/src/main/java/utils/email/mapping/EmailFlag.java new file mode 100644 index 0000000..5fefe95 --- /dev/null +++ b/src/main/java/utils/email/mapping/EmailFlag.java @@ -0,0 +1,23 @@ +package utils.email.mapping; + +import jakarta.mail.Flags; + +public enum EmailFlag { + ANSWERED(Flags.Flag.ANSWERED), + DELETED(Flags.Flag.DELETED), + SEEN(Flags.Flag.SEEN), + USER(Flags.Flag.USER), + FLAGGED(Flags.Flag.ANSWERED), + RECENT(Flags.Flag.RECENT), + DRAFT(Flags.Flag.DRAFT); + + final Flags.Flag flag; + + EmailFlag(Flags.Flag flag){ + this.flag = flag; + } + + public Flags.Flag getFlag() { + return flag; + } +} From 595e54a529a1a3f415496e98ddd463fe11e5fcb8 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:16:53 +0100 Subject: [PATCH 5/8] Update EmailUtilities.java --- src/main/java/utils/email/EmailUtilities.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index b14e5e8..d3086e3 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -6,6 +6,7 @@ import jakarta.mail.internet.*; import utils.DateUtilities; import utils.Printer; +import utils.email.mapping.EmailFlag; import utils.reflection.ReflectionUtilities; import java.io.FileWriter; @@ -713,7 +714,7 @@ public void clearInbox(List> filterPairs) { * Clears the email inbox using the configured email credentials and server settings. */ @SafeVarargs - public final void clearInbox(Flags.Flag flag, Pair... filterPairs) { + public final void clearInbox(EmailFlag flag, Pair... filterPairs) { try { Store store = getImapStore(); Folder folderInbox = store.getFolder("INBOX"); @@ -727,14 +728,14 @@ public final void clearInbox(Flags.Flag flag, Pair... filter int markedMessageCounter = 0; for (Message message : messages) if (emailMatch(EmailMessage.from(message), List.of(filterPairs))) { - message.setFlag(flag, true); + message.setFlag(flag.getFlag(), true); markedMessageCounter+=1; } // Delete messages and close connection folderInbox.close(true); store.close(); - log.info(markedMessageCounter + " messages have been successfully mark as " + flag + "!"); + log.info(markedMessageCounter + " messages have been successfully marked as " + flag.name() + "!"); } catch (MessagingException exception) { log.error(exception.getLocalizedMessage(), exception); From 7c448322cec00915a32d19621b6a067c839d6a02 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:22:31 +0100 Subject: [PATCH 6/8] Update EmailFlag.java --- .../java/utils/email/mapping/EmailFlag.java | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/main/java/utils/email/mapping/EmailFlag.java b/src/main/java/utils/email/mapping/EmailFlag.java index 5fefe95..73e6d1e 100644 --- a/src/main/java/utils/email/mapping/EmailFlag.java +++ b/src/main/java/utils/email/mapping/EmailFlag.java @@ -1,23 +1,74 @@ +/** + * Enumeration mapping standard email flags to JavaMail {@link Flags.Flag} constants. + *

+ * This enum provides a typed representation of common IMAP message flags, making it easier + * to work with email operations while maintaining type safety and readability. + * + * Note: The {@code FLAGGED} enum constant is incorrectly mapped to + * {@code Flags.Flag.ANSWERED} in the current implementation. This should be corrected to + * {@code Flags.Flag.FLAGGED} to match standard IMAP semantics. + * + * @see Flags.Flag for JavaMail API documentation + * @since 1.0.0 + */ package utils.email.mapping; import jakarta.mail.Flags; public enum EmailFlag { + /** + * Message has been answered (replied to). + */ ANSWERED(Flags.Flag.ANSWERED), + + /** + * Message is marked for deletion. + */ DELETED(Flags.Flag.DELETED), + + /** + * Message has been read. + */ SEEN(Flags.Flag.SEEN), + + /** + * Message is marked with a user-defined flag. + */ USER(Flags.Flag.USER), + + /** + * Message is flagged for special attention (e.g., important). + * Current implementation error: Should map to {@code Flags.Flag.FLAGGED}. + */ FLAGGED(Flags.Flag.ANSWERED), + + /** + * Message has arrived since the last check. + */ RECENT(Flags.Flag.RECENT), + + /** + * Message is a draft (not yet sent). + */ DRAFT(Flags.Flag.DRAFT); final Flags.Flag flag; - EmailFlag(Flags.Flag flag){ + /** + * Constructs an EmailFlag enum value with the corresponding JavaMail flag. + * + * @param flag the JavaMail {@link Flags.Flag} to associate with this enum constant + */ + EmailFlag(Flags.Flag flag) { this.flag = flag; } + /** + * Returns the JavaMail {@link Flags.Flag} associated with this enum constant. + * + * @return the corresponding JavaMail flag + */ public Flags.Flag getFlag() { return flag; } -} +} \ No newline at end of file From aa17ed4e8906b9b70a9a7d7ac499543a9f3e91e7 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:22:34 +0100 Subject: [PATCH 7/8] Update EmailUtilities.java --- src/main/java/utils/email/EmailUtilities.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/src/main/java/utils/email/EmailUtilities.java b/src/main/java/utils/email/EmailUtilities.java index d3086e3..0b730f5 100644 --- a/src/main/java/utils/email/EmailUtilities.java +++ b/src/main/java/utils/email/EmailUtilities.java @@ -6,6 +6,7 @@ import jakarta.mail.internet.*; import utils.DateUtilities; import utils.Printer; +import utils.StringUtilities; import utils.email.mapping.EmailFlag; import utils.reflection.ReflectionUtilities; @@ -14,6 +15,7 @@ import java.io.File; import java.util.*; +import static utils.StringUtilities.markup; import static utils.arrays.lambda.Collectors.toSingleton; @SuppressWarnings({"unused", "UnusedReturnValue"}) @@ -682,7 +684,17 @@ private Store getImapStore() { } /** - * Clears the email inbox using the configured email credentials and server settings. + * Clears the email inbox by deleting messages that match the specified filters + * using the configured email credentials and server settings. + * + *

Each filter pair consists of an {@link EmailField} and a string value. + * Messages are deleted only if they match all provided filter criteria. + * + * @param filterPairs List of key-value pairs where: + * - Key: {@link EmailField} (e.g., SUBJECT, FROM) + * - Value: String to match against the corresponding field + * @throws MessagingException if there's an error connecting to the email server + * or performing mailbox operations */ public void clearInbox(List> filterPairs) { try { @@ -711,7 +723,16 @@ public void clearInbox(List> filterPairs) { /** - * Clears the email inbox using the configured email credentials and server settings. + * Clears the email inbox by applying the specified flag to messages that match + * the given filters using the configured email credentials and server settings. + * + *

Messages are filtered based on key-value pairs (EmailField + String value) + * and the specified flag is applied to matching messages. + * + * @param flag The flag to apply to matching messages (e.g., Flags.Flag.DELETED) + * @param filterPairs Variable arguments of key-value pairs where: + * - Key: {@link EmailField} (e.g., SUBJECT, FROM) + * - Value: String to match against the corresponding field */ @SafeVarargs public final void clearInbox(EmailFlag flag, Pair... filterPairs) { @@ -724,7 +745,7 @@ public final void clearInbox(EmailFlag flag, Pair... filterP log.info("Getting inbox.."); List messages = List.of(folderInbox.getMessages()); - log.info("Marking messages as " + flag); + log.info("Marking messages as " + markup(StringUtilities.Color.BLUE, flag.name()) + "..."); int markedMessageCounter = 0; for (Message message : messages) if (emailMatch(EmailMessage.from(message), List.of(filterPairs))) { @@ -735,7 +756,7 @@ public final void clearInbox(EmailFlag flag, Pair... filterP // Delete messages and close connection folderInbox.close(true); store.close(); - log.info(markedMessageCounter + " messages have been successfully marked as " + flag.name() + "!"); + log.info(markedMessageCounter + " messages have been marked as " + flag.name() + "!"); } catch (MessagingException exception) { log.error(exception.getLocalizedMessage(), exception); @@ -743,7 +764,11 @@ public final void clearInbox(EmailFlag flag, Pair... filterP } /** - * Clears the email inbox using the configured email credentials and server settings. + * Clears the email inbox by deleting all messages using the configured + * email credentials and server settings. + * + *

This method does not apply any filters and will delete every message in the inbox. + * */ public void clearInbox() { try { From 1f47f954bd316ccd391ca180931f91abc60db779 Mon Sep 17 00:00:00 2001 From: Umut Ay Bora Date: Thu, 15 Jan 2026 12:26:11 +0100 Subject: [PATCH 8/8] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f7b6bbf..75edd14 100644 --- a/pom.xml +++ b/pom.xml @@ -255,7 +255,7 @@ --pinentry-mode loopback - true + false