class MailFetcher::GmailClient

Constants

HOST
PORT

Attributes

logger[RW]

Public Class Methods

new(account, client_id, client_secret, refresh_token) click to toggle source
# File lib/mail_fetcher/gmail_client.rb, line 16
def initialize(account, client_id, client_secret, refresh_token)
  @account = account
  @client_id = client_id
  @client_secret = client_secret
  @refresh_token = refresh_token
end

Public Instance Methods

find(recipient, subject='', wait=MailFetcher::Client.max_wait_time) click to toggle source
# File lib/mail_fetcher/gmail_client.rb, line 23
def find(recipient, subject='', wait=MailFetcher::Client.max_wait_time)
  @connection ||= authenticated_connection

  message_id = eventually(:tries => wait, :delay => 1) do
    begin
      @connection.examine('INBOX')
      search_filter = ['TO', recipient, 'SUBJECT', subject]
      results = @connection.search(search_filter)
      logger.debug("Inbox contains #{results.length} messages matching search criteria") if logger
      results.first
    rescue => e
      logger.error("Error while trying trying to find a message in INBOX (#{e.message})") if logger
      nil
    end
  end

  message_id ? GmailMessage.new(@connection, message_id) : nil
end

Private Instance Methods

authenticated_connection() click to toggle source
# File lib/mail_fetcher/gmail_client.rb, line 44
def authenticated_connection
  connection = Net::IMAP.new(HOST, PORT, usessl = true, certs = nil, verify = false)
  connection.authenticate('XOAUTH2', @account, get_access_token)
  connection
end
get_access_token() click to toggle source
# File lib/mail_fetcher/gmail_client.rb, line 50
def get_access_token
  params = {}
  params['client_id'] = @client_id
  params['client_secret'] = @client_secret
  params['refresh_token'] = @refresh_token
  params['grant_type'] = 'refresh_token'
  request_url = 'https://accounts.google.com'
  conn = Faraday.new(:url => request_url) do |faraday|
    faraday.request  :url_encoded
    faraday.adapter  Faraday.default_adapter
  end

  response = conn.post('/o/oauth2/token', params)
  JSON.parse(response.body)['access_token']
end