88using System . Collections . Generic ;
99using MailKitSimplified . Receiver . Abstractions ;
1010using MailKitSimplified . Receiver . Extensions ;
11+ using Microsoft . Extensions . Logging ;
12+ using Microsoft . Extensions . Logging . Abstractions ;
1113
1214namespace MailKitSimplified . Receiver . Services
1315{
@@ -59,13 +61,16 @@ public static SearchQuery QueryMessageId(string messageId, bool addAngleBrackets
5961 private int _take = _all ;
6062 private bool _continueTake = false ;
6163 private static readonly int _all = - 1 ;
64+ private static readonly int _queryAmount = 250 ;
6265 private SearchQuery _searchQuery = _queryAll ;
6366 private static readonly SearchQuery _queryAll = SearchQuery . All ;
6467 private MessageSummaryItems _messageSummaryItems = MessageSummaryItems . Envelope ;
68+ private readonly ILogger _logger ;
6569 private readonly IImapReceiver _imapReceiver ;
6670
67- public MailFolderReader ( IImapReceiver imapReceiver )
71+ public MailFolderReader ( IImapReceiver imapReceiver , ILogger < MailFolderReader > logger = null )
6872 {
73+ _logger = logger ?? NullLogger < MailFolderReader > . Instance ;
6974 _imapReceiver = imapReceiver ?? throw new ArgumentNullException ( nameof ( imapReceiver ) ) ;
7075 }
7176
@@ -98,22 +103,40 @@ public IMailReader Items(MessageSummaryItems messageSummaryItems)
98103 return this ;
99104 }
100105
101- public async Task < IList < IMessageSummary > > GetMessageSummariesAsync ( MessageSummaryItems filter , CancellationToken cancellationToken = default )
106+ private async Task < IMailFolder > OpenMailFolderAsync ( CancellationToken cancellationToken = default )
102107 {
103108 if ( _take == 0 )
104- return Array . Empty < IMessageSummary > ( ) ;
109+ return null ;
105110 var mailFolder = await _imapReceiver . ConnectMailFolderAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
106111 _ = await mailFolder . OpenAsync ( FolderAccess . ReadOnly , cancellationToken ) . ConfigureAwait ( false ) ;
107- if ( _skip >= mailFolder . Count )
112+ if ( _skip >= mailFolder . Count || ( _skip > _queryAmount && _searchQuery != _queryAll ) )
108113 {
114+ if ( _skip < mailFolder . Count )
115+ {
116+ _logger . LogWarning ( $ "Skip({ _skip } ) limited to mail folder count of { mailFolder . Count } .") ;
117+ if ( _continueTake )
118+ _skip = mailFolder . Count ;
119+ }
120+ else
121+ _logger . LogWarning ( $ "Skip({ _skip } ) exceeded SearchQuery limit of 250 results.") ;
109122 await mailFolder . CloseAsync ( false , CancellationToken . None ) . ConfigureAwait ( false ) ;
110- return Array . Empty < IMessageSummary > ( ) ;
123+ return null ;
111124 }
125+ return mailFolder ;
126+ }
127+
128+ public async Task < IList < IMessageSummary > > GetMessageSummariesAsync ( MessageSummaryItems filter , CancellationToken cancellationToken = default )
129+ {
130+ var mailFolder = await OpenMailFolderAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
131+ if ( mailFolder == null )
132+ return Array . Empty < IMessageSummary > ( ) ;
112133
113134 IList < IMessageSummary > filteredSummaries ;
114135 filter |= MessageSummaryItems . UniqueId ;
115136 if ( _searchQuery != _queryAll )
116137 {
138+ if ( _take > _queryAmount )
139+ _logger . LogWarning ( $ "Take({ _take } ) limited by SearchQuery to 250 results.") ;
117140 var uniqueIds = await mailFolder . SearchAsync ( _searchQuery , cancellationToken ) . ConfigureAwait ( false ) ;
118141 var descendingUids = uniqueIds . OrderByDescending ( u => u . Id ) . Skip ( _skip ) ;
119142 var filteredUids = _take == _all ? descendingUids : descendingUids . Take ( _take ) ;
@@ -127,12 +150,7 @@ public async Task<IList<IMessageSummary>> GetMessageSummariesAsync(MessageSummar
127150 filteredSummaries = await mailFolder . FetchAsync ( _skip , endIndex , filter , cancellationToken ) . ConfigureAwait ( false ) ;
128151 }
129152 if ( _continueTake && _take > 0 )
130- {
131- if ( _skip < mailFolder . Count )
132- _skip += _take ;
133- else
134- _skip = mailFolder . Count ;
135- }
153+ _skip += _take ;
136154 await mailFolder . CloseAsync ( false , CancellationToken . None ) . ConfigureAwait ( false ) ;
137155
138156 return filteredSummaries ;
@@ -145,18 +163,15 @@ public async Task<IList<MimeMessage>> GetMimeMessagesAsync(CancellationToken can
145163 {
146164 if ( _take == 0 )
147165 return Array . Empty < MimeMessage > ( ) ;
148- var mailFolder = await _imapReceiver . ConnectMailFolderAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
149- _ = await mailFolder . OpenAsync ( FolderAccess . ReadOnly , cancellationToken ) . ConfigureAwait ( false ) ;
150- if ( _skip >= mailFolder . Count )
151- {
152- await mailFolder . CloseAsync ( false , CancellationToken . None ) . ConfigureAwait ( false ) ;
166+ var mailFolder = await OpenMailFolderAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
167+ if ( mailFolder == null )
153168 return Array . Empty < MimeMessage > ( ) ;
154- }
155169
156- _ = await mailFolder . OpenAsync ( FolderAccess . ReadOnly , cancellationToken ) . ConfigureAwait ( false ) ;
157170 var mimeMessages = new List < MimeMessage > ( ) ;
158171 if ( _take == _all || _searchQuery != _queryAll )
159172 {
173+ if ( _take > _queryAmount )
174+ _logger . LogWarning ( $ "Take({ _take } ) limited by SearchQuery to 250 results.") ;
160175 var uniqueIds = await mailFolder . SearchAsync ( _searchQuery , cancellationToken ) . ConfigureAwait ( false ) ;
161176 var descendingUids = uniqueIds . OrderByDescending ( u => u . Id ) . Skip ( _skip ) ;
162177 var filteredUids = _take == _all ? descendingUids : descendingUids . Take ( _take ) ;
0 commit comments