def fetch_and_cache(uid)
if data = message_cache[[@mailbox, uid]]
return data
end
fetch_data = reconnect_if_necessary do
res = @imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])
if res.nil?
res = @imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])
end
res[0]
end
size = fetch_data.attr["RFC822.SIZE"]
flags = fetch_data.attr["FLAGS"]
mail = Mail.new(fetch_data.attr['RFC822'])
formatter = Vmail::MessageFormatter.new(mail)
message_text = "\#{@mailbox} uid:\#{uid} \#{number_to_human_size size} \#{flags.inspect} \#{format_parts_info(formatter.list_parts)}\n\#{divider '-'}\n\#{format_headers(formatter.extract_headers)}\n\n\#{formatter.process_body}\n"
d = {:mail => mail, :size => size, :message_text => message_text, :seqno => fetch_data.seqno, :flags => flags}
message_cache[[@mailbox, uid]] = d
rescue
msg = "Error encountered parsing message uid #{uid}:\n#{$!}\n#{$!.backtrace.join("\n")}" +
"\n\nRaw message:\n\n" + mail.to_s
log msg
log message_text
{:message_text => msg}
end