vmail 0.8.8 → 0.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/vmail/imap_client.rb +33 -21
- data/lib/vmail/version.rb +1 -1
- metadata +2 -2
data/lib/vmail/imap_client.rb
CHANGED
@@ -35,9 +35,15 @@ module Vmail
|
|
35
35
|
end
|
36
36
|
|
37
37
|
# holds mail objects keyed by [mailbox, uid]
|
38
|
-
# TODO
|
38
|
+
# TODO come up with a way to purge periodically
|
39
39
|
def message_cache
|
40
40
|
@message_cache ||= {}
|
41
|
+
size = @message_cache.values.reduce(0) {|sum, x| sum + x[:size]}
|
42
|
+
if size > 2_000_000 # TODO make this configurable
|
43
|
+
log "PRUNING MESSAGE CACHE; message cache is consuming #{number_to_human_size size}"
|
44
|
+
@message_cache.keys[0, @message_cache.size / 2].each {|k| @message_cache.delete(k)}
|
45
|
+
end
|
46
|
+
@message_cache
|
41
47
|
end
|
42
48
|
|
43
49
|
def open
|
@@ -249,7 +255,7 @@ module Vmail
|
|
249
255
|
# borrowed from ActionView/Helpers
|
250
256
|
def number_to_human_size(number)
|
251
257
|
if number.to_i < 1024
|
252
|
-
|
258
|
+
number = 1024 # round up to 1kh
|
253
259
|
else
|
254
260
|
max_exp = UNITS.size - 1
|
255
261
|
exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024
|
@@ -385,46 +391,52 @@ module Vmail
|
|
385
391
|
x
|
386
392
|
else
|
387
393
|
log "- fetching and storing to message_cache[[#{@mailbox}, #{uid}]]"
|
388
|
-
fetch_and_cache(
|
394
|
+
fetch_and_cache(index)
|
389
395
|
end
|
390
|
-
# pre-fetch prev and next
|
391
396
|
|
397
|
+
# make this more DRY later by directly using a ref to the hash
|
392
398
|
mail = data[:mail]
|
393
|
-
size = data[:size]
|
399
|
+
size = data[:size]
|
394
400
|
@current_message_index = index
|
395
401
|
@current_mail = mail # used later to show raw message or extract attachments if any
|
396
|
-
|
397
|
-
out = formatter.process_body
|
398
|
-
@current_message = <<-EOF
|
399
|
-
#{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
|
400
|
-
#{divider '-'}
|
401
|
-
#{format_headers(formatter.extract_headers)}
|
402
|
-
|
403
|
-
#{out}
|
404
|
-
EOF
|
402
|
+
@current_message = data[:message_text]
|
405
403
|
rescue
|
406
404
|
log "parsing error"
|
407
405
|
"Error encountered parsing this message:\n#{$!}\n#{$!.backtrace.join("\n")}"
|
408
406
|
end
|
409
407
|
|
410
|
-
def fetch_and_cache(
|
408
|
+
def fetch_and_cache(index)
|
409
|
+
envelope_data = @message_list[index]
|
410
|
+
return unless envelope_data
|
411
|
+
seqno = envelope_data[:seqno]
|
412
|
+
uid = envelope_data[:uid]
|
411
413
|
return if message_cache[[@mailbox, uid]]
|
412
414
|
fetch_data = reconnect_if_necessary do
|
415
|
+
# log "@imap.uid_fetch #{uid}"
|
413
416
|
@imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])[0]
|
414
417
|
end
|
415
|
-
|
418
|
+
size = fetch_data.attr["RFC822.SIZE"]
|
419
|
+
mail = Mail.new(fetch_data.attr['RFC822'])
|
420
|
+
formatter = Vmail::MessageFormatter.new(mail)
|
421
|
+
message_text = <<-EOF
|
422
|
+
#{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
|
423
|
+
#{divider '-'}
|
424
|
+
#{format_headers(formatter.extract_headers)}
|
425
|
+
|
426
|
+
#{formatter.process_body}
|
427
|
+
EOF
|
416
428
|
log "storing message_cache[[#{@mailbox}, #{uid}]]"
|
429
|
+
d = {:mail => mail, :size => size, :message_text => message_text}
|
417
430
|
message_cache[[@mailbox, uid]] = d
|
418
|
-
|
431
|
+
rescue
|
432
|
+
msg = "Error encountered parsing message index #{index} seqno #{seqno} uid #{uid}:\n#{$!}\n#{$!.backtrace.join("\n")}"
|
433
|
+
log msg
|
419
434
|
end
|
420
435
|
|
421
436
|
def prefetch_adjacent(index)
|
422
437
|
Thread.new do
|
423
438
|
[index + 1, index - 1].each do |idx|
|
424
|
-
|
425
|
-
next unless envelope_data
|
426
|
-
uid = envelope_data[:uid]
|
427
|
-
fetch_and_cache(uid)
|
439
|
+
fetch_and_cache(idx)
|
428
440
|
end
|
429
441
|
end
|
430
442
|
end
|
data/lib/vmail/version.rb
CHANGED