@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
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
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
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
@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
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]
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"