lib/gmail/client/base.rb in gmail-0.4.2 vs lib/gmail/client/base.rb in gmail-0.5.0

- old
+ new

@@ -1,120 +1,125 @@ require 'thread' module Gmail module Client class Base - # GMail IMAP defaults + # Gmail IMAP defaults GMAIL_IMAP_HOST = 'imap.gmail.com' GMAIL_IMAP_PORT = 993 - - # GMail SMTP defaults + + # Gmail SMTP defaults GMAIL_SMTP_HOST = "smtp.gmail.com" GMAIL_SMTP_PORT = 587 - + attr_reader :username attr_reader :options - - def initialize(username, options={}) + + def initialize(username, options = {}) defaults = {} @username = fill_username(username) @options = defaults.merge(options) @mailbox_mutex = Mutex.new end - - # Connect to gmail service. - def connect(raise_errors=false) + + # Connect to gmail service. + def connect(raise_errors = false) @imap = Net::IMAP.new(GMAIL_IMAP_HOST, GMAIL_IMAP_PORT, true, nil, false) - GmailImapExtensions.patch_net_imap_response_parser + Gmail::ImapExtensions.patch_net_imap_response_parser @imap rescue SocketError - raise_errors and raise ConnectionError, "Couldn't establish connection with GMail IMAP service" + raise_errors and raise ConnectionError, "Couldn't establish connection with Gmail IMAP service" end - + # This version of connect will raise error on failure... def connect! connect(true) end - - # Return current connection. Log in automaticaly to specified account if + + # Return current connection. Log in automaticaly to specified account if # it is necessary. def connection login and at_exit { logout } unless logged_in? @imap end alias :conn :connection - + # Login to specified account. def login(*args) raise NotImplementedError, "The `#{self.class.name}#login` method is not implemented." end alias :sign_in :login - + # This version of login will raise error on failure... def login! login(true) end alias :sign_in! :login! - + # Returns +true+ when you are logged in to specified account. def logged_in? !!@logged_in end alias :signed_in? :logged_in? - - # Logout from GMail service. + + # Logout from Gmail service. def logout @imap && logged_in? and @imap.logout ensure @logged_in = false end alias :sign_out :logout - - # Return labels object, which helps you with managing your GMail labels. + + # Disconnect from Gmail service. + def disconnect + @imap && @imap.disconnect + end + + # Return labels object, which helps you with managing your Gmail labels. # See <tt>Gmail::Labels</tt> for details. def labels @labels ||= Labels.new(conn) end - + # Compose new e-mail. # # ==== Examples - # + # # mail = gmail.compose # mail.from "test@gmail.org" # mail.to "friend@gmail.com" # # ... or block style: - # - # mail = gmail.compose do + # + # mail = gmail.compose do # from "test@gmail.org" # to "friend@gmail.com" # subject "Hello!" # body "Hello my friend! long time..." # end # # Now you can deliver your mail: # # gmail.deliver(mail) - def compose(mail=nil, &block) + def compose(mail = nil, &block) if block_given? mail = Mail.new(&block) - elsif !mail + elsif !mail mail = Mail.new - end + end mail.delivery_method(*smtp_settings) mail.from = username unless mail.from mail end alias :message :compose - - # Compose (optionaly) and send given email. + + # Compose (optionaly) and send given email. # # ==== Examples # - # gmail.deliver do + # gmail.deliver do # to "friend@gmail.com" # subject "Hello friend!" # body "Hi! How are you?" # end # @@ -123,23 +128,23 @@ # mail = Mail.new { ... } # gmail.deliver(mail) # # mail = gmail.compose { ... } # gmail.deliver(mail) - def deliver(mail=nil, raise_errors=false, &block) + def deliver(mail = nil, raise_errors = false, &block) mail = compose(mail, &block) if block_given? mail.deliver! rescue Object => ex raise_errors and raise DeliveryError, "Couldn't deliver email: #{ex.to_s}" end - + # This version of deliver will raise error on failure... - def deliver!(mail=nil, &block) + def deliver!(mail = nil, &block) deliver(mail, true, &block) end - - # Do something with given mailbox or within it context. + + # Do something with given mailbox or within it context. # # ==== Examples # # mailbox = gmail.mailbox("INBOX") # mailbox.emails(:all) @@ -152,13 +157,13 @@ # mailbox.count(:all) # ... # end def mailbox(name, &block) @mailbox_mutex.synchronize do - name = name.to_s + name = labels.localize(name) mailbox = (mailboxes[name] ||= Mailbox.new(self, name)) - switch_to_mailbox(name) if @current_mailbox != name + switch_to_mailbox(mailbox) if @current_mailbox != mailbox if block_given? mailbox_stack << @current_mailbox result = block.arity == 1 ? block.call(mailbox) : block.call mailbox_stack.pop @@ -170,46 +175,45 @@ end end alias :in_mailbox :mailbox alias :in_label :mailbox alias :label :mailbox - + # Alias for <tt>mailbox("INBOX")</tt>. See <tt>Gmail::Client#mailbox</tt> # for details. def inbox mailbox("INBOX") end - + def mailboxes @mailboxes ||= {} end - + def inspect "#<Gmail::Client#{'0x%04x' % (object_id << 1)} (#{username}) #{'dis' if !logged_in?}connected>" end - + def fill_username(username) username =~ /@/ ? username : "#{username}@gmail.com" end def mail_domain username.split('@').last end - + private - + def switch_to_mailbox(mailbox) if mailbox - mailbox = Net::IMAP.encode_utf7(mailbox) - conn.select(mailbox) + conn.select(mailbox.encoded_name) end @current_mailbox = mailbox end - + def mailbox_stack @mailbox_stack ||= [] end - + def smtp_settings [:smtp, { :address => GMAIL_SMTP_HOST, :port => GMAIL_SMTP_PORT, :domain => mail_domain,