@@ -59,6 +59,8 @@ public class ImapMailReceiver extends AbstractMailReceiver {
59
59
60
60
private static final int DEFAULT_CANCEL_IDLE_INTERVAL = 120000 ;
61
61
62
+ private static final String PROTOCOL = "imap" ;
63
+
62
64
private final MessageCountListener messageCountListener = new SimpleMessageCountListener ();
63
65
64
66
private final IdleCanceler idleCanceler = new IdleCanceler ();
@@ -77,17 +79,17 @@ public class ImapMailReceiver extends AbstractMailReceiver {
77
79
78
80
public ImapMailReceiver () {
79
81
super ();
80
- this . setProtocol ("imap" );
82
+ setProtocol (PROTOCOL );
81
83
}
82
84
83
85
public ImapMailReceiver (String url ) {
84
86
super (url );
85
87
if (url != null ) {
86
- Assert .isTrue (url .toLowerCase ().startsWith ("imap" ),
88
+ Assert .isTrue (url .toLowerCase ().startsWith (PROTOCOL ),
87
89
"URL must start with 'imap' for the IMAP Mail receiver." );
88
90
}
89
91
else {
90
- this . setProtocol ("imap" );
92
+ setProtocol (PROTOCOL );
91
93
}
92
94
}
93
95
@@ -126,7 +128,7 @@ public void setShouldMarkMessagesAsRead(Boolean shouldMarkMessagesAsRead) {
126
128
* @since 3.0.5
127
129
*/
128
130
public void setCancelIdleInterval (long cancelIdleInterval ) {
129
- this .cancelIdleInterval = cancelIdleInterval * 1000 ;
131
+ this .cancelIdleInterval = cancelIdleInterval * 1000 ; // NOSONAR - convert seconds to milliseconds
130
132
}
131
133
132
134
@ Override
@@ -140,7 +142,7 @@ protected void onInit() {
140
142
this .isInternalScheduler = true ;
141
143
}
142
144
Properties javaMailProperties = getJavaMailProperties ();
143
- for (String name : new String []{ "imap" , "imaps" }) {
145
+ for (String name : new String [] { PROTOCOL , "imaps" }) {
144
146
String peek = "mail." + name + ".peek" ;
145
147
if (javaMailProperties .getProperty (peek ) == null ) {
146
148
javaMailProperties .setProperty (peek , "true" );
@@ -154,6 +156,9 @@ public void destroy() {
154
156
if (this .isInternalScheduler ) {
155
157
((ThreadPoolTaskScheduler ) this .scheduler ).shutdown ();
156
158
}
159
+ if (this .pingTask != null ) {
160
+ this .pingTask .cancel (true );
161
+ }
157
162
}
158
163
159
164
/**
@@ -162,18 +167,16 @@ public void destroy() {
162
167
* @throws MessagingException Any MessagingException.
163
168
*/
164
169
public void waitForNewMessages () throws MessagingException {
165
- this . openFolder ();
166
- Folder folder = this . getFolder ();
170
+ openFolder ();
171
+ Folder folder = getFolder ();
167
172
Assert .state (folder instanceof IMAPFolder ,
168
- "folder is not an instance of [" + IMAPFolder .class .getName () + "]" );
173
+ () -> "folder is not an instance of [" + IMAPFolder .class .getName () + "]" );
169
174
IMAPFolder imapFolder = (IMAPFolder ) folder ;
170
175
if (imapFolder .hasNewMessages ()) {
171
176
return ;
172
177
}
173
- else if (!folder .getPermanentFlags ().contains (Flags .Flag .RECENT )) {
174
- if (searchForNewMessages ().length > 0 ) {
175
- return ;
176
- }
178
+ else if (!folder .getPermanentFlags ().contains (Flags .Flag .RECENT ) && searchForNewMessages ().length > 0 ) {
179
+ return ;
177
180
}
178
181
imapFolder .addMessageCountListener (this .messageCountListener );
179
182
try {
@@ -203,11 +206,11 @@ else if (!folder.getPermanentFlags().contains(Flags.Flag.RECENT)) {
203
206
*/
204
207
@ Override
205
208
protected Message [] searchForNewMessages () throws MessagingException {
206
- Flags supportedFlags = this . getFolder (). getPermanentFlags ();
207
- SearchTerm searchTerm = this . compileSearchTerms ( supportedFlags );
208
- Folder folder = this . getFolder ( );
209
- if (folder .isOpen ()) {
210
- return nullSafeMessages (searchTerm != null ? folder .search (searchTerm ) : folder .getMessages ());
209
+ Folder folderToUse = getFolder ();
210
+ Flags supportedFlags = folderToUse . getPermanentFlags ( );
211
+ SearchTerm searchTerm = compileSearchTerms ( supportedFlags );
212
+ if (folderToUse .isOpen ()) {
213
+ return nullSafeMessages (searchTerm != null ? folderToUse .search (searchTerm ) : folderToUse .getMessages ());
211
214
}
212
215
throw new MessagingException ("Folder is closed" );
213
216
}
@@ -257,9 +260,11 @@ public void run() {
257
260
folder .isOpen (); // resets idle state
258
261
}
259
262
}
260
- catch (Exception ignore ) {
263
+ catch (Exception ex ) {
264
+ logger .error ("Error during resetting idle state." , ex );
261
265
}
262
266
}
267
+
263
268
}
264
269
265
270
/**
@@ -327,28 +332,35 @@ public SearchTerm generateSearchTerm(Flags supportedFlags, Folder folder) {
327
332
}
328
333
329
334
if (!recentFlagSupported ) {
330
- NotTerm notFlagged = null ;
331
- if (folder .getPermanentFlags ().contains (Flags .Flag .USER )) {
335
+ searchTerm = applyTermsWhenNoRecentFlag (folder , searchTerm );
336
+ }
337
+ return searchTerm ;
338
+ }
339
+
340
+ private SearchTerm applyTermsWhenNoRecentFlag (Folder folder , SearchTerm searchTerm ) {
341
+ NotTerm notFlagged = null ;
342
+ if (folder .getPermanentFlags ().contains (Flag .USER )) {
343
+ if (logger .isDebugEnabled ()) {
332
344
logger .debug ("This email server does not support RECENT flag, but it does support " +
333
345
"USER flags which will be used to prevent duplicates during email fetch." +
334
346
" This receiver instance uses flag: " + getUserFlag ());
335
- Flags siFlags = new Flags ();
336
- siFlags .add (getUserFlag ());
337
- notFlagged = new NotTerm (new FlagTerm (siFlags , true ));
338
- }
339
- else {
340
- logger .debug ("This email server does not support RECENT or USER flags. " +
341
- "System flag 'Flag.FLAGGED' will be used to prevent duplicates during email fetch." );
342
- notFlagged = new NotTerm (new FlagTerm (new Flags (Flags .Flag .FLAGGED ), true ));
343
- }
344
- if (searchTerm == null ) {
345
- searchTerm = notFlagged ;
346
- }
347
- else {
348
- searchTerm = new AndTerm (searchTerm , notFlagged );
349
347
}
348
+ Flags siFlags = new Flags ();
349
+ siFlags .add (getUserFlag ());
350
+ notFlagged = new NotTerm (new FlagTerm (siFlags , true ));
351
+ }
352
+ else {
353
+ logger .debug ("This email server does not support RECENT or USER flags. " +
354
+ "System flag 'Flag.FLAGGED' will be used to prevent duplicates during email fetch." );
355
+ notFlagged = new NotTerm (new FlagTerm (new Flags (Flag .FLAGGED ), true ));
356
+ }
357
+
358
+ if (searchTerm == null ) {
359
+ return notFlagged ;
360
+ }
361
+ else {
362
+ return new AndTerm (searchTerm , notFlagged );
350
363
}
351
- return searchTerm ;
352
364
}
353
365
354
366
}
0 commit comments