commit 80cb133bb5fbb906e07780b7b1f5e9557ee0b7ff
parent 2f085ea43e52f6e74cae5e00f355a974e7a592ae
Author: wmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Date: Thu, 4 Jan 2007 01:19:54 +0000
fixed imap error handling
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@162 5c8cc53c-5e98-4d25-b20a-d8db53a31250
Diffstat:
2 files changed, 23 insertions(+), 13 deletions(-)
diff --git a/lib/sup/imap.rb b/lib/sup/imap.rb
@@ -50,6 +50,8 @@ class IMAP < Source
@labels << :inbox unless archived?
@labels << mailbox.intern unless mailbox =~ /inbox/i
@mutex = Mutex.new
+
+ @recover_msg = "It is likely that messages have been deleted from this IMAP mailbox. Please run sup-import --rebuild #{to_s} to correct this problem."
end
def say s
@@ -93,8 +95,7 @@ class IMAP < Source
say "Reading headers (because IMAP sucks)..."
values = @imap.fetch(1 .. last_id, ['RFC822.SIZE', 'INTERNALDATE'])
-
- say "Successfully connected to #{@parsed_uri}"
+ say "Successfully connected to #{@parsed_uri}."
values.each do |v|
id = make_id v
@@ -104,7 +105,9 @@ class IMAP < Source
rescue SocketError, Net::IMAP::Error, SourceError => e
self.broken_msg = e.message.chomp # fucking chomp! fuck!!!
@imap = nil
- Redwood::log "error connecting to IMAP server: #{self.broken_msg}"
+ msg = "error connecting to IMAP server: #{self.broken_msg}"
+ Redwood::log msg
+ BufferManager.flash msg
ensure
shutup
end
@@ -154,11 +157,11 @@ class IMAP < Source
def get_imap_field id, field
retries = 0
f = nil
- imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. It is likely that messages have been deleted from this IMAP mailbox."
+ imap_id = @imap_ids[id] or raise SourceError, "Unknown message id #{id}. #@recover_msg"
begin
f = @imap.fetch imap_id, [field, 'RFC822.SIZE', 'INTERNALDATE']
got_id = make_id f[0]
- raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. It is likely the IMAP mailbox has been modified." unless got_id == id
+ raise SourceError, "IMAP message mismatch: requested #{id}, got #{got_id}. #@recover_msg" unless got_id == id
rescue Net::IMAP::Error => e
raise SourceError, e.message
rescue Errno::EPIPE
@@ -178,7 +181,11 @@ class IMAP < Source
@mutex.synchronize { connect or raise SourceError, broken_msg }
start = @ids.index(cur_offset || start_offset)
- start.upto(@ids.length - 1) do |i|
+ if start.nil? # couldn't find the most recent email
+ self.broken_msg = "Unknown message id #{cur_offset || start_offset}. #@recover_msg"
+ raise SourceError, broken_msg
+ end
+ start.upto(@ids.length - 1) do |i|
id = @ids[i]
self.cur_offset = id
yield id, labels
diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb
@@ -54,10 +54,10 @@ class PollManager
start_offset = nil
num = 0
num_inbox = 0
- source.each do |offset, labels|
- start_offset ||= offset
- yield "Found message at #{offset} with labels #{labels * ', '}"
- begin
+ begin
+ source.each do |offset, labels|
+ start_offset ||= offset
+ yield "Found message at #{offset} with labels #{labels * ', '}"
m = Redwood::Message.new :source => source, :source_info => offset,
:labels => labels
if found[m.id]
@@ -73,17 +73,20 @@ class PollManager
total_num += 1
total_numi += 1 if m.labels.include? :inbox
end
- rescue SourceError, MessageFormatError => e
- yield "Ignoring erroneous message at #{source}##{offset}: #{e.message}"
end
-
+
if num % 1000 == 0 && num > 0
elapsed = Time.now - start
pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset)
remaining = (source.end_offset.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset))
yield "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining"
end
+ rescue SourceError, MessageFormatError => e
+ msg = "#{source.broken? ? 'Fatal' : 'Non-fatal'} error loading from #{source}: #{e.message}"
+ Redwood::log msg
+ yield msg
end
+
yield "Found #{num} messages" unless num == 0
end
yield "Done polling; loaded #{total_num} new messages total"