    # File lib/vmail/imap_client.rb, line 455
        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?
              # retry one more time ( find a more elegant way to do this )
              res = @imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])
            end
            res[0]
          end
          # USE THIS
          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"
          # log "Storing message_cache[[#{@mailbox}, #{uid}]]"
          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