vmail 0.8.8 → 0.8.9
Sign up to get free protection for your applications and to get access to all the features.
- 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