lib/gmail/mailbox.rb in gmail-0.4.2 vs lib/gmail/mailbox.rb in gmail-0.5.0

- old
+ new

@@ -7,80 +7,103 @@ :read => ['SEEN'], :unread => ['UNSEEN'], :flagged => ['FLAGGED'], :unflagged => ['UNFLAGGED'], :starred => ['FLAGGED'], - :unstarred => ['UNFLAGGED'], + :unstarred => ['UNFLAGGED'], :deleted => ['DELETED'], :undeleted => ['UNDELETED'], :draft => ['DRAFT'], :undrafted => ['UNDRAFT'] } - + attr_reader :name - attr_reader :external_name + attr_reader :encoded_name - def initialize(gmail, name="INBOX") - @name = name - @external_name = Net::IMAP.decode_utf7(name) + def initialize(gmail, name = "INBOX") + @name = Net::IMAP.decode_utf7(name) + @encoded_name = Net::IMAP.encode_utf7(name) @gmail = gmail end - # Returns list of emails which meets given criteria. - # - # ==== Examples - # - # gmail.inbox.emails(:all) - # gmail.inbox.emails(:unread, :from => "friend@gmail.com") - # gmail.inbox.emails(:all, :after => Time.now-(20*24*3600)) - # gmail.mailbox("Test").emails(:read) - # - # gmail.mailbox("Test") do |box| - # box.emails(:read) - # box.emails(:unread) do |email| - # ... do something with each email... - # end - # end - def emails(*args, &block) + def fetch_uids(*args) args << :all if args.size == 0 - if args.first.is_a?(Symbol) + if args.first.is_a?(Symbol) search = MAILBOX_ALIASES[args.shift].dup opts = args.first.is_a?(Hash) ? args.first : {} - + opts[:after] and search.concat ['SINCE', opts[:after].to_imap_date] opts[:before] and search.concat ['BEFORE', opts[:before].to_imap_date] opts[:on] and search.concat ['ON', opts[:on].to_imap_date] opts[:from] and search.concat ['FROM', opts[:from]] opts[:to] and search.concat ['TO', opts[:to]] opts[:subject] and search.concat ['SUBJECT', opts[:subject]] opts[:label] and search.concat ['LABEL', opts[:label]] opts[:attachment] and search.concat ['HAS', 'attachment'] opts[:search] and search.concat ['BODY', opts[:search]] opts[:body] and search.concat ['BODY', opts[:body]] + opts[:uid] and search.concat ['UID', opts[:uid]] + opts[:gm] and search.concat ['X-GM-RAW', opts[:gm]] opts[:query] and search.concat opts[:query] - @gmail.mailbox(name) do - @gmail.conn.uid_search(search).collect do |uid| - message = (messages[uid] ||= Message.new(self, uid)) - block.call(message) if block_given? - message - end - end + @gmail.mailbox(name) { + @gmail.conn.uid_search(search) + } elsif args.first.is_a?(Hash) - emails(:all, args.first) + fetch_uids(:all, args.first) else raise ArgumentError, "Invalid search criteria" end end - alias :mails :emails + + # Returns list of emails which meets given criteria. + # + # ==== Examples + # + # gmail.inbox.emails(:all) + # gmail.inbox.emails(:unread, :from => "friend@gmail.com") + # gmail.inbox.emails(:all, :after => Time.now-(20*24*3600)) + # gmail.mailbox("Test").emails(:read) + # + # gmail.mailbox("Test") do |box| + # box.emails(:read) + # box.emails(:unread) do |email| + # ... do something with each email... + # end + # end + def emails(*args, &block) + fetch_uids(*args).collect do |uid| + message = Message.new(self, uid) + yield(message) if block_given? + message + end + end alias :search :emails alias :find :emails - alias :filter :emails - # This is a convenience method that really probably shouldn't need to exist, - # but it does make code more readable, if seriously all you want is the count + def emails_in_batches(*args, &block) + messages = Array.new + + uids = fetch_uids(*args) + if uids && uids.any? + uids.each_slice(100) do |slice| + @gmail.conn.uid_fetch(slice, Message::PREFETCH_ATTRS).each do |data| + message = Message.new(self, nil, data) + yield(message) if block_given? + messages << message + end + end + end + + messages + end + alias :search_in_batches :emails_in_batches + alias :find_in_batches :emails_in_batches + + # This is a convenience method that really probably shouldn't need to exist, + # but it does make code more readable, if seriously all you want is the count # of messages. # # ==== Examples # # gmail.inbox.count(:all) @@ -93,16 +116,11 @@ # This permanently removes messages which are marked as deleted def expunge @gmail.mailbox(name) { @gmail.conn.expunge } end - # Cached messages. - def messages - @messages ||= {} - end - def inspect - "#<Gmail::Mailbox#{'0x%04x' % (object_id << 1)} name=#{external_name}>" + "#<Gmail::Mailbox#{'0x%04x' % (object_id << 1)} name=#{name}>" end def to_s name end