diff --git a/greenmail-core/src/main/java/com/icegreen/greenmail/util/GreenMail.java b/greenmail-core/src/main/java/com/icegreen/greenmail/util/GreenMail.java index 85e2550415..aa5b264d1b 100644 --- a/greenmail-core/src/main/java/com/icegreen/greenmail/util/GreenMail.java +++ b/greenmail-core/src/main/java/com/icegreen/greenmail/util/GreenMail.java @@ -348,7 +348,7 @@ public GreenMailOperations loadEmails(Path sourceDirectory) throws IOException, try (final Stream pathStream = Files.walk(sourceDirectory)) { for (Path emailPath : pathStream - .filter(path -> !path.equals(sourceDirectory)) // Skip base dir + .filter(path -> !path.equals(sourceDirectory) && !isHiddenOrInHiddenDir(path)) // Skip base dir and files which are hidden or in hidden dirs .map(Path::toAbsolutePath) .collect(Collectors.toList())) { loadEmail(sourceDirectory, emailPath, sourceNameCount, userManager, store, imapHostManager, session); @@ -379,15 +379,16 @@ private void loadEmail(Path sourceDirectory, Path emailPath, int sourceNameCount } // Extract and optionally create intermediate folders - MailFolder folder = null; - folder = store.getMailbox(getUserBaseMailboxName(imapHostManager, user)); - for (int i = sourceNameCount + 1; i < emailPathNameCount - 1; i++) { - String namePart = emailPath.getName(i).toString(); - MailFolder child = store.getMailbox(folder, namePart); - if (null == child) { - child = store.createMailbox(folder, namePart, true); + MailFolder folder = store.getMailbox(getUserBaseMailboxName(imapHostManager, user));; + for (int i = sourceNameCount + 1; i < emailPathNameCount; i++) { + if (i < emailPathNameCount - 1 || Files.isDirectory(emailPath)) { + String namePart = emailPath.getName(i).toString(); + MailFolder child = store.getMailbox(folder, namePart); + if (null == child) { + child = store.createMailbox(folder, namePart, true); + } + folder = child; } - folder = child; } if (Files.isRegularFile(emailPath) && emailPath.toString().endsWith(".eml")) { @@ -410,4 +411,12 @@ private String getUserBaseMailboxName(ImapHostManager imapHostManager, GreenMail } return inbox.substring(0, inbox.length() - ImapConstants.INBOX_NAME.length()); } + + private boolean isHiddenOrInHiddenDir(Path path) { + try { + return Files.isHidden(path) || (path.getParent() != null && isHiddenOrInHiddenDir(path.getParent())); + } catch (IOException e) { + throw new IllegalStateException("Failed during preloading '" + path + "'"); + } + } } diff --git a/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.hidden/test-5.eml b/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.hidden/test-5.eml new file mode 100644 index 0000000000..bf8b58b65d --- /dev/null +++ b/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.hidden/test-5.eml @@ -0,0 +1,11 @@ +Date: Sat, 16 Sep 2023 17:10:44 +0200 (CEST) +From: bar@localhost +To: foo@localhost +Message-ID: <1882145060.266.1694877044545@127.0.0.1> +Subject: test-5 +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Test message saved as eml (electronic mail format, aka internet message format) +File is in hidden folder, so it should not be preloaded diff --git a/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.test-5.eml b/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.test-5.eml new file mode 100644 index 0000000000..3b49d56f3a --- /dev/null +++ b/greenmail-core/src/test/resources/preload/bar@localhost/INBOX/.test-5.eml @@ -0,0 +1,11 @@ +Date: Sat, 16 Sep 2023 17:10:44 +0200 (CEST) +From: bar@localhost +To: foo@localhost +Message-ID: <1882145060.266.1694877044545@127.0.0.1> +Subject: test-5 +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Test message saved as eml (electronic mail format, aka internet message format). +File is hidden, so it should not be preloaded