rgrove-larch 1.0.0.3 → 1.0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +1 -0
- data/lib/larch/imap.rb +13 -55
- data/lib/larch/version.rb +1 -1
- metadata +1 -1
data/HISTORY
CHANGED
@@ -4,6 +4,7 @@ Larch History
|
|
4
4
|
Version 1.0.1 (?)
|
5
5
|
* Much more robust handling of unexpected server disconnects and dropped
|
6
6
|
connections.
|
7
|
+
* Fix excessive post-scan processing times for very large mailboxes.
|
7
8
|
* Fetch message headers in blocks of up to 1024 at a time rather than all at
|
8
9
|
once, to prevent potential problems with certain servers when a mailbox
|
9
10
|
contains a huge number of messages.
|
data/lib/larch/imap.rb
CHANGED
@@ -63,7 +63,6 @@ class IMAP
|
|
63
63
|
@imap = nil
|
64
64
|
@last_id = 0
|
65
65
|
@last_scan = nil
|
66
|
-
@message_ids = nil
|
67
66
|
|
68
67
|
# Create private convenience methods (debug, info, warn, etc.) to make
|
69
68
|
# logging easier.
|
@@ -284,76 +283,35 @@ class IMAP
|
|
284
283
|
# Fetches the specified _fields_ for the specified message sequence id(s) from
|
285
284
|
# the IMAP server.
|
286
285
|
def imap_fetch(ids, fields)
|
287
|
-
ids
|
288
|
-
|
289
|
-
|
290
|
-
pos = 0
|
291
|
-
results = []
|
286
|
+
ids = ids.to_a
|
287
|
+
data = []
|
288
|
+
pos = 0
|
292
289
|
|
290
|
+
safely do
|
293
291
|
while pos < ids.length
|
294
|
-
|
295
|
-
pos
|
292
|
+
data += @imap.fetch(ids[pos, MAX_FETCH_COUNT], fields)
|
293
|
+
pos += MAX_FETCH_COUNT
|
296
294
|
end
|
297
|
-
|
298
|
-
results
|
299
295
|
end
|
300
296
|
|
301
|
-
|
302
|
-
fields = REGEX_FIELDS.match(fields).captures unless fields.is_a?(Array)
|
303
|
-
|
304
|
-
# Translate BODY.PEEK to BODY in fields, since that's how it'll come back in
|
305
|
-
# the response.
|
306
|
-
fields.map! {|f| f.sub(/^BODY\.PEEK\[/, 'BODY[') }
|
307
|
-
|
308
|
-
good_results = ids.respond_to?(:member?) ?
|
309
|
-
data.find_all {|i| ids.member?(i.seqno) && fields.all? {|f| i.attr.member?(f) }} :
|
310
|
-
data.find_all {|i| ids == i.seqno && fields.all? {|f| i.attr.member?(f) }}
|
311
|
-
|
312
|
-
if good_results.empty?
|
313
|
-
raise FatalError, "0 out of #{data.length} items in IMAP response for message(s) #{ids} contained all requested fields: #{fields.join(', ')}"
|
314
|
-
elsif good_results.length < data.length
|
315
|
-
error "IMAP server sent #{good_results.length} results in response to a request for #{data.length} messages"
|
316
|
-
end
|
317
|
-
|
318
|
-
good_results
|
297
|
+
data
|
319
298
|
end
|
320
299
|
|
321
300
|
# Fetches the specified _fields_ for the specified UID(s) from the IMAP
|
322
301
|
# server.
|
323
302
|
def imap_uid_fetch(uids, fields)
|
324
303
|
uids = uids.to_a
|
304
|
+
data = []
|
305
|
+
pos = 0
|
325
306
|
|
326
|
-
|
327
|
-
pos = 0
|
328
|
-
results = []
|
329
|
-
|
307
|
+
safely do
|
330
308
|
while pos < uids.length
|
331
|
-
|
332
|
-
pos
|
309
|
+
data += @imap.uid_fetch(uids[pos, MAX_FETCH_COUNT], fields)
|
310
|
+
pos += MAX_FETCH_COUNT
|
333
311
|
end
|
334
|
-
|
335
|
-
results
|
336
|
-
end
|
337
|
-
|
338
|
-
# If fields isn't an array, make it one.
|
339
|
-
fields = REGEX_FIELDS.match(fields).captures unless fields.is_a?(Array)
|
340
|
-
|
341
|
-
# Translate BODY.PEEK to BODY in fields, since that's how it'll come back in
|
342
|
-
# the response.
|
343
|
-
fields.map! {|f| f.sub(/^BODY\.PEEK\[/, 'BODY[') }
|
344
|
-
|
345
|
-
good_results = data.find_all do |i|
|
346
|
-
i.attr.member?('UID') && uids.member?(i.attr['UID']) &&
|
347
|
-
fields.all? {|f| i.attr.member?(f) }
|
348
|
-
end
|
349
|
-
|
350
|
-
if good_results.empty?
|
351
|
-
raise FatalError, "0 out of #{data.length} items in IMAP response for message UID(s) #{uids.join(', ')} contained all requested fields: #{fields.join(', ')}"
|
352
|
-
elsif good_results.length < data.length
|
353
|
-
error "IMAP server sent #{good_results.length} results in response to a request for #{data.length} messages"
|
354
312
|
end
|
355
313
|
|
356
|
-
|
314
|
+
data
|
357
315
|
end
|
358
316
|
|
359
317
|
def safe_connect
|
data/lib/larch/version.rb
CHANGED