class Gmail::Client::Base
Constants
Attributes
Public Class Methods
# File lib/gmail/client/base.rb, line 15 def initialize(username, options = {}) defaults = {} @username = fill_username(username) @options = defaults.merge(options) @mailbox_mutex = Mutex.new end
Public Instance Methods
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 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)
# File lib/gmail/client/base.rb, line 101 def compose(mail = nil, &block) if block_given? mail = Mail.new(&block) elsif !mail mail = Mail.new end mail.delivery_method(*smtp_settings) mail.from = username unless mail.from mail end
Connect to gmail service.
# File lib/gmail/client/base.rb, line 23 def connect(raise_errors = false) @imap = Net::IMAP.new(GMAIL_IMAP_HOST, GMAIL_IMAP_PORT, true, nil, false) Gmail::ImapExtensions.patch_net_imap_response_parser @imap rescue SocketError raise_errors and raise ConnectionError, "Couldn't establish connection with Gmail IMAP service" end
This version of connect will raise error on failure…
# File lib/gmail/client/base.rb, line 32 def connect! connect(true) end
Return current connection. Log in automaticaly to specified account if it is necessary.
# File lib/gmail/client/base.rb, line 38 def connection login and at_exit { logout } unless logged_in? @imap end
Compose (optionaly) and send given email.
Examples¶ ↑
gmail.deliver do to "friend@gmail.com" subject "Hello friend!" body "Hi! How are you?" end
… or with already created message:
mail = Mail.new { ... } gmail.deliver(mail) mail = gmail.compose { ... } gmail.deliver(mail)
# File lib/gmail/client/base.rb, line 131 def deliver(mail = nil, raise_errors = false, &block) mail = compose(mail, &block) 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…
# File lib/gmail/client/base.rb, line 139 def deliver!(mail = nil, &block) deliver(mail, true, &block) end
Disconnect from Gmail
service.
# File lib/gmail/client/base.rb, line 71 def disconnect @imap && @imap.disconnect end
# File lib/gmail/client/base.rb, line 210 def fill_username(username) username =~ /@/ ? username : "#{username}@gmail.com" end
Functionality like rails find
method support.google.com/mail/answer/7190?hl=en Messages with a certain message-id header Rfc822msgid: Example: rfc822msgid:200503292@example.com
# File lib/gmail/client/base.rb, line 190 def find(rfc822msgid) message = :message_before_built mailbox(:all) do |mailbox| uid = conn.uid_search(['X-GM-RAW', "rfc822msgid:#{rfc822msgid.to_s.strip}"]).first raise EmailNotFound, "Can't find message with ID #{rfc822msgid}" unless uid message = Message.new(mailbox, uid) end message end
Alias for mailbox("INBOX")
. See Gmail::Mailbox
for details.
# File lib/gmail/client/base.rb, line 181 def inbox mailbox("INBOX") end
# File lib/gmail/client/base.rb, line 206 def inspect "#<Gmail::Client#{'0x%04x' % (object_id << 1)} (#{username}) #{'dis' if !logged_in?}connected>" end
Return labels object, which helps you with managing your Gmail
labels. See Gmail::Labels
for details.
# File lib/gmail/client/base.rb, line 77 def labels @labels ||= Labels.new(conn) end
Returns true
when you are logged in to specified account.
# File lib/gmail/client/base.rb, line 57 def logged_in? !!@logged_in end
Login to specified account.
# File lib/gmail/client/base.rb, line 45 def login(*args) raise NotImplementedError, "The `#{self.class.name}#login` method is not implemented." end
This version of login will raise error on failure…
# File lib/gmail/client/base.rb, line 51 def login! login(true) end
Logout from Gmail
service.
# File lib/gmail/client/base.rb, line 63 def logout @imap && logged_in? and @imap.logout ensure @logged_in = false end
# File lib/gmail/client/base.rb, line 214 def mail_domain username.split('@').last end
Do something with given mailbox or within it context.
Examples¶ ↑
mailbox = gmail.mailbox("INBOX") mailbox.emails(:all) mailbox.count(:unread, :before => Time.now-(20*24*3600))
… or block style:
gmail.label("Work") do |mailbox| mailbox.emails(:unread) mailbox.count(:all) ... end
# File lib/gmail/client/base.rb, line 158 def mailbox(name, &block) @mailbox_mutex.synchronize do name = labels.localize(name) mailbox = (mailboxes[name] ||= Mailbox.new(self, name)) switch_to_mailbox(mailbox) if @current_mailbox != mailbox if block_given? mailbox_stack << @current_mailbox result = block.arity == 1 ? yield(mailbox) : yield mailbox_stack.pop switch_to_mailbox(mailbox_stack.last) return result end return mailbox end end
# File lib/gmail/client/base.rb, line 202 def mailboxes @mailboxes ||= {} end
Private Instance Methods
# File lib/gmail/client/base.rb, line 227 def mailbox_stack @mailbox_stack ||= [] end
# File lib/gmail/client/base.rb, line 231 def smtp_settings [:smtp, { :address => GMAIL_SMTP_HOST, :port => GMAIL_SMTP_PORT, :domain => mail_domain, :user_name => username, :password => password, :authentication => 'plain', :enable_starttls_auto => true }] end
# File lib/gmail/client/base.rb, line 220 def switch_to_mailbox(mailbox) if mailbox conn.select(mailbox.encoded_name) end @current_mailbox = mailbox end