@@ -316,65 +316,78 @@ protected int getFolderOpenMode() {
316316
317317 /**
318318 * Subclasses must implement this method to return new mail messages.
319+ * @param folder the folder for fetching mail messages.
319320 * @return An array of messages.
320321 * @throws MessagingException Any MessagingException.
321322 */
322- protected abstract Message [] searchForNewMessages () throws MessagingException ;
323+ protected abstract Message [] searchForNewMessages (Folder folder ) throws MessagingException ;
323324
324- private void openSession () {
325- if (this .session == null ) {
325+ private Session openSession () {
326+ Session sessionToUse = this .session ;
327+ if (sessionToUse == null ) {
326328 if (this .javaMailAuthenticator != null ) {
327- this . session = Session .getInstance (this .javaMailProperties , this .javaMailAuthenticator );
329+ sessionToUse = Session .getInstance (this .javaMailProperties , this .javaMailAuthenticator );
328330 }
329331 else {
330- this . session = Session .getInstance (this .javaMailProperties );
332+ sessionToUse = Session .getInstance (this .javaMailProperties );
331333 }
332334 }
335+ this .session = sessionToUse ;
336+ return sessionToUse ;
333337 }
334338
335- private void connectStoreIfNecessary () throws MessagingException {
336- if (this .store == null ) {
339+ private Store connectStoreIfNecessary (Session session ) throws MessagingException {
340+ Store storeToUse = this .store ;
341+ if (storeToUse == null ) {
337342 if (this .url != null ) {
338- this . store = this . session .getStore (this .url );
343+ storeToUse = session .getStore (this .url );
339344 }
340345 else if (this .protocol != null ) {
341- this . store = this . session .getStore (this .protocol );
346+ storeToUse = session .getStore (this .protocol );
342347 }
343348 else {
344- this . store = this . session .getStore ();
349+ storeToUse = session .getStore ();
345350 }
346351 }
347- if (!this .store .isConnected ()) {
348- this .logger .debug (() -> "connecting to store [" + this .store .getURLName () + "]" );
349- this .store .connect ();
352+ if (!storeToUse .isConnected ()) {
353+ URLName urlName = storeToUse .getURLName ();
354+ this .logger .debug (() -> "connecting to store [" + urlName + "]" );
355+ storeToUse .connect ();
350356 }
357+ this .store = storeToUse ;
358+ return storeToUse ;
351359 }
352360
353- protected void openFolder () throws MessagingException {
354- if (this .folder == null ) {
355- openSession ();
356- connectStoreIfNecessary ();
357- this .folder = obtainFolderInstance ();
361+ protected Folder openFolder () throws MessagingException {
362+ Folder folderToUse = this .folder ;
363+ if (folderToUse == null ) {
364+ Session session = openSession ();
365+ Store storeToUse = connectStoreIfNecessary (session );
366+ folderToUse = obtainFolderInstance (storeToUse );
358367 }
359368 else {
360- connectStoreIfNecessary ();
369+ connectStoreIfNecessary (this . session );
361370 }
362- if (this .folder == null || !this .folder .exists ()) {
363- throw new IllegalStateException ("no such folder [" + this .url .getFile () + "]" );
371+ if (folderToUse == null || !folderToUse .exists ()) {
372+ String file = this .url != null ? this .url .getFile () : "" ;
373+ throw new IllegalStateException ("no such folder [" + file + "]" );
364374 }
365- if (this .folder .isOpen ()) {
366- return ;
375+ if (folderToUse .isOpen ()) {
376+ this .folder = folderToUse ;
377+ return folderToUse ;
367378 }
368- URLName urlName = this . folder .getURLName ();
379+ URLName urlName = folderToUse .getURLName ();
369380 this .logger .debug (() -> "opening folder [" + urlName + "]" );
370- this .folder .open (this .folderOpenMode );
381+ folderToUse .open (this .folderOpenMode );
382+ this .folder = folderToUse ;
383+ return folderToUse ;
371384 }
372385
373- private Folder obtainFolderInstance () throws MessagingException {
386+ private Folder obtainFolderInstance (Store store ) throws MessagingException {
374387 if (this .url == null ) {
375- return this . store .getDefaultFolder ();
388+ return store .getDefaultFolder ();
376389 }
377- return this . store .getFolder (this .url );
390+ return store .getFolder (this .url );
378391 }
379392
380393 @ Override
@@ -388,14 +401,14 @@ public Object[] receive() throws jakarta.mail.MessagingException {
388401 this .folderReadLock .unlock ();
389402 this .folderWriteLock .lock ();
390403 try {
391- openFolder ();
404+ folderToCheck = openFolder ();
392405 this .folderReadLock .lock ();
393406 }
394407 finally {
395408 this .folderWriteLock .unlock ();
396409 }
397410 }
398- messagesToReturn = convertMessagesIfNecessary (searchAndFilterMessages ());
411+ messagesToReturn = convertMessagesIfNecessary (searchAndFilterMessages (folderToCheck ));
399412 return messagesToReturn ;
400413 }
401414 finally {
@@ -421,10 +434,10 @@ protected void closeFolder() {
421434 }
422435 }
423436
424- private MimeMessage [] searchAndFilterMessages () throws MessagingException {
425- this .logger .debug (() -> "attempting to receive mail from folder [" + this . folder .getFullName () + "]" );
437+ private MimeMessage [] searchAndFilterMessages (Folder folder ) throws MessagingException {
438+ this .logger .debug (() -> "attempting to receive mail from folder [" + folder .getFullName () + "]" );
426439 Message [] messagesToProcess ;
427- Message [] messages = searchForNewMessages ();
440+ Message [] messages = searchForNewMessages (folder );
428441 if (this .maxFetchSize > 0 && messages .length > this .maxFetchSize ) {
429442 Message [] reducedMessages = new Message [this .maxFetchSize ];
430443 System .arraycopy (messages , 0 , reducedMessages , 0 , this .maxFetchSize );
@@ -435,14 +448,14 @@ private MimeMessage[] searchAndFilterMessages() throws MessagingException {
435448 }
436449 this .logger .debug (() -> "found " + messagesToProcess .length + " new messages" );
437450 if (messagesToProcess .length > 0 ) {
438- fetchMessages (messagesToProcess );
451+ fetchMessages (messagesToProcess , folder );
439452 }
440453
441454 this .logger .debug (() -> "Received " + messagesToProcess .length + " messages" );
442455
443456 MimeMessage [] filteredMessages = filterMessagesThruSelector (messagesToProcess );
444457
445- postProcessFilteredMessages (filteredMessages );
458+ postProcessFilteredMessages (filteredMessages , folder );
446459 return filteredMessages ;
447460 }
448461
@@ -519,7 +532,7 @@ private Object byteArrayToContent(Map<String, Object> headers, ByteArrayOutputSt
519532 return baos .toByteArray ();
520533 }
521534
522- private void postProcessFilteredMessages (Message [] filteredMessages ) throws MessagingException {
535+ private void postProcessFilteredMessages (Message [] filteredMessages , Folder folder ) throws MessagingException {
523536 // Copy messages to cause an eager fetch
524537 Message [] messages = filteredMessages ;
525538 if (this .headerMapper == null && (this .autoCloseFolder || this .simpleContent )) {
@@ -532,25 +545,23 @@ private void postProcessFilteredMessages(Message[] filteredMessages) throws Mess
532545 }
533546 }
534547
535- setMessageFlagsAndMaybeDeleteMessages (messages );
548+ setMessageFlagsAndMaybeDeleteMessages (messages , folder );
536549 if (filteredMessages .length > 0 && filteredMessages [0 ] instanceof IntegrationMimeMessage ) {
537- setMessageFlagsAndMaybeDeleteMessages (filteredMessages );
550+ setMessageFlagsAndMaybeDeleteMessages (filteredMessages , folder );
538551 }
539552 }
540553
541- private void setMessageFlagsAndMaybeDeleteMessages (Message [] messages ) throws MessagingException {
542- setMessageFlags (messages );
554+ private void setMessageFlagsAndMaybeDeleteMessages (Message [] messages , Folder folder ) throws MessagingException {
555+ setMessageFlags (messages , folder . getPermanentFlags () );
543556
544557 if (shouldDeleteMessages ()) {
545558 deleteMessages (messages );
546559 }
547560 }
548561
549- private void setMessageFlags (Message [] filteredMessages ) throws MessagingException {
562+ private void setMessageFlags (Message [] filteredMessages , Flags flags ) throws MessagingException {
550563 boolean recentFlagSupported = false ;
551564
552- Flags flags = getFolder ().getPermanentFlags ();
553-
554565 if (flags != null ) {
555566 recentFlagSupported = flags .contains (Flags .Flag .RECENT );
556567 }
@@ -605,14 +616,15 @@ private MimeMessage[] filterMessagesThruSelector(Message[] messages) throws Mess
605616 * implementation {@link Folder#fetch(Message[], FetchProfile) fetches}
606617 * every {@link jakarta.mail.FetchProfile.Item}.
607618 * @param messages the messages to fetch
619+ * @param folder the folder to fetch from
608620 * @throws MessagingException in case of JavaMail errors
609621 */
610- protected void fetchMessages (Message [] messages ) throws MessagingException {
622+ protected void fetchMessages (Message [] messages , Folder folder ) throws MessagingException {
611623 FetchProfile contentsProfile = new FetchProfile ();
612624 contentsProfile .add (FetchProfile .Item .ENVELOPE );
613625 contentsProfile .add (FetchProfile .Item .CONTENT_INFO );
614626 contentsProfile .add (FetchProfile .Item .FLAGS );
615- this . folder .fetch (messages , contentsProfile );
627+ folder .fetch (messages , contentsProfile );
616628 }
617629
618630 /**
@@ -706,7 +718,7 @@ public Folder getFolder() {
706718 }
707719 else {
708720 try {
709- return obtainFolderInstance ();
721+ return obtainFolderInstance (AbstractMailReceiver . this . store );
710722 }
711723 catch (MessagingException e ) {
712724 throw new org .springframework .messaging .MessagingException ("Unable to obtain the mail folder" , e );
0 commit comments