gmail 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +13 -0
  4. data/.rubocop_todo.yml +239 -0
  5. data/.travis.yml +19 -0
  6. data/CHANGELOG.md +75 -18
  7. data/Gemfile +1 -1
  8. data/README.md +214 -131
  9. data/Rakefile +11 -0
  10. data/gmail.gemspec +8 -8
  11. data/lib/gmail.rb +31 -18
  12. data/lib/gmail/client.rb +11 -7
  13. data/lib/gmail/client/base.rb +52 -48
  14. data/lib/gmail/client/plain.rb +9 -5
  15. data/lib/gmail/client/xoauth.rb +23 -6
  16. data/lib/gmail/client/xoauth2.rb +39 -0
  17. data/lib/gmail/imap_extensions.rb +150 -0
  18. data/lib/gmail/labels.rb +33 -16
  19. data/lib/gmail/mailbox.rb +60 -42
  20. data/lib/gmail/message.rb +142 -101
  21. data/lib/gmail/version.rb +2 -2
  22. data/spec/account.yml.obfus +2 -0
  23. data/spec/gmail/client/base_spec.rb +5 -0
  24. data/spec/gmail/client/plain_spec.rb +168 -0
  25. data/spec/gmail/client/xoauth2_spec.rb +186 -0
  26. data/spec/gmail/client/xoauth_spec.rb +5 -0
  27. data/spec/gmail/client_spec.rb +5 -0
  28. data/spec/gmail/imap_extensions_spec.rb +12 -0
  29. data/spec/gmail/labels_spec.rb +18 -0
  30. data/spec/{mailbox_spec.rb → gmail/mailbox_spec.rb} +14 -14
  31. data/spec/gmail/message_spec.rb +181 -0
  32. data/spec/gmail_spec.rb +21 -21
  33. data/spec/recordings/gmail/_new_connects_with_client_and_give_it_context_when_block_given.yml +28 -0
  34. data/spec/recordings/gmail/_new_connects_with_gmail_service_and_return_valid_connection_object.yml +28 -0
  35. data/spec/recordings/gmail/_new_does_not_raise_error_when_couldn_t_connect_with_given_account.yml +13 -0
  36. data/spec/recordings/gmail/_new_raises_error_when_couldn_t_connect_with_given_account.yml +13 -0
  37. data/spec/recordings/gmail_client_plain/instance/_connection_automatically_logs_in_to_gmail_account_when_it_s_called.yml +42 -0
  38. data/spec/recordings/gmail_client_plain/instance/delivers_inline_composed_email.yml +42 -0
  39. data/spec/recordings/gmail_client_plain/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +13 -0
  40. data/spec/recordings/gmail_client_plain/instance/does_not_raise_error_even_though_gmail_account_is_invalid.yml +13 -0
  41. data/spec/recordings/gmail_client_plain/instance/labels/checks_if_there_is_given_label_defined.yml +196 -0
  42. data/spec/recordings/gmail_client_plain/instance/labels/creates_given_label.yml +151 -0
  43. data/spec/recordings/gmail_client_plain/instance/labels/removes_existing_label.yml +146 -0
  44. data/spec/recordings/gmail_client_plain/instance/labels/returns_list_of_all_available_labels.yml +113 -0
  45. data/spec/recordings/gmail_client_plain/instance/properly_logs_in_to_valid_gmail_account.yml +42 -0
  46. data/spec/recordings/gmail_client_plain/instance/properly_logs_out_from_gmail.yml +42 -0
  47. data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox.yml +109 -0
  48. data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox_using_block_style.yml +109 -0
  49. data/spec/recordings/gmail_client_plain/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +13 -0
  50. data/spec/recordings/gmail_client_xo_auth2/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +13 -0
  51. data/spec/recordings/gmail_client_xo_auth2/instance/labels/checks_if_there_is_given_label_defined.yml +27 -0
  52. data/spec/recordings/gmail_client_xo_auth2/instance/labels/creates_given_label.yml +39 -0
  53. data/spec/recordings/gmail_client_xo_auth2/instance/labels/removes_existing_label.yml +39 -0
  54. data/spec/recordings/gmail_client_xo_auth2/instance/labels/returns_list_of_all_available_labels.yml +27 -0
  55. data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_in_to_valid_gmail_account.yml +15 -0
  56. data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_out_from_gmail.yml +15 -0
  57. data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox.yml +40 -0
  58. data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox_using_block_style.yml +40 -0
  59. data/spec/recordings/gmail_client_xo_auth2/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +13 -0
  60. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/all/localizes_into_the_appropriate_label.yml +116 -0
  61. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/drafts/localizes_into_the_appropriate_label.yml +116 -0
  62. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/flagged/localizes_into_the_appropriate_label.yml +116 -0
  63. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/important/localizes_into_the_appropriate_label.yml +116 -0
  64. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/inbox/localizes_into_the_appropriate_label.yml +42 -0
  65. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/junk/localizes_into_the_appropriate_label.yml +116 -0
  66. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/sent/localizes_into_the_appropriate_label.yml +116 -0
  67. data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/trash/localizes_into_the_appropriate_label.yml +116 -0
  68. data/spec/recordings/gmail_mailbox/instance/counts_all_emails.yml +277 -0
  69. data/spec/recordings/gmail_mailbox/instance/finds_messages.yml +586 -0
  70. data/spec/recordings/gmail_mailbox/on_initialize/sets_client_and_name.yml +42 -0
  71. data/spec/recordings/gmail_mailbox/on_initialize/works_in_inbox_by_default.yml +42 -0
  72. data/spec/recordings/gmail_message/initialize/sets_prefetch_attrs.yml +578 -0
  73. data/spec/recordings/gmail_message/initialize/sets_uid_and_mailbox.yml +580 -0
  74. data/spec/recordings/gmail_message/instance_methods/deletes_itself.yml +637 -0
  75. data/spec/recordings/gmail_message/instance_methods/marks_itself_read.yml +682 -0
  76. data/spec/recordings/gmail_message/instance_methods/marks_itself_unread.yml +686 -0
  77. data/spec/recordings/gmail_message/instance_methods/moves_from_one_tag_to_other.yml +862 -0
  78. data/spec/recordings/gmail_message/instance_methods/removes_a_given_label.yml +776 -0
  79. data/spec/recordings/gmail_message/instance_methods/removes_a_given_label_with_old_method.yml +776 -0
  80. data/spec/recordings/gmail_message/instance_methods/sets_given_label.yml +690 -0
  81. data/spec/recordings/gmail_message/instance_methods/sets_given_label_with_old_method.yml +691 -0
  82. data/spec/spec_helper.rb +34 -10
  83. data/spec/support/imap_mock.rb +129 -0
  84. data/spec/support/obfuscation.rb +52 -0
  85. metadata +79 -30
  86. data/TODO.md +0 -12
  87. data/lib/gmail/client/imap_extensions.rb +0 -54
  88. data/spec/client_spec.rb +0 -178
  89. data/spec/message_spec.rb +0 -51
data/Rakefile CHANGED
@@ -33,3 +33,14 @@ rescue LoadError
33
33
  end
34
34
 
35
35
  task :default => :spec
36
+
37
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
38
+ require 'spec/support/obfuscation'
39
+ desc 'Obfuscates account.yml file.'
40
+ task :obfuscate do
41
+ Spec::Obfuscation.encrypt_file(File.join(File.dirname(__FILE__), 'spec', 'account.yml'))
42
+ end
43
+
44
+ task :deobfuscate do
45
+ puts Spec::Obfuscation.decrypt_file(File.join(File.dirname(__FILE__), 'spec', 'account.yml.obfus'))
46
+ end
@@ -14,21 +14,21 @@ Gem::Specification.new do |s|
14
14
  s.platform = Gem::Platform::RUBY
15
15
  s.authors = ["Chris Kowalik"]
16
16
  s.email = ["chris@nu7hat.ch"]
17
- s.homepage = "http://github.com/nu7hatch/gmail"
18
-
17
+ s.homepage = "http://github.com/gmailgem/gmail"
18
+ s.licenses = ["MIT"]
19
+
19
20
  # runtime dependencies
20
- s.add_dependency "mime", ">= 0.1"
21
21
  s.add_dependency "mail", ">= 2.2.1"
22
22
  s.add_dependency "gmail_xoauth", ">= 0.3.0"
23
-
23
+
24
24
  # development dependencies
25
25
  s.add_development_dependency "rake"
26
- s.add_development_dependency "rspec", "~> 2.0"
27
- s.add_development_dependency "mocha", ">= 0.9"
26
+ s.add_development_dependency "rspec", ">= 3.1"
27
+ s.add_development_dependency "rubocop"
28
28
  s.add_development_dependency "gem-release"
29
-
29
+
30
30
  s.files = `git ls-files`.split("\n")
31
31
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
32
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
32
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
33
33
  s.require_paths = ["lib"]
34
34
  end
@@ -10,7 +10,8 @@ end
10
10
 
11
11
  class Object
12
12
  def to_imap_date
13
- Date.parse(to_s).strftime("%d-%B-%Y")
13
+ date = respond_to?(:utc) ? utc.to_s : to_s
14
+ Date.parse(date).strftime("%d-%B-%Y")
14
15
  end
15
16
  end
16
17
 
@@ -27,7 +28,7 @@ module Gmail
27
28
  # ==== Examples
28
29
  #
29
30
  # Gmail.new(:plain, "foo@gmail.com", "password")
30
- # Gmail.new(:xoauth, "foo@gmail.com",
31
+ # Gmail.new(:xoauth, "foo@gmail.com",
31
32
  # :consumer_key => "",
32
33
  # :consumer_secret => "",
33
34
  # :token => "",
@@ -44,22 +45,34 @@ module Gmail
44
45
  # end
45
46
  #
46
47
 
47
- ['', '!'].each { |kind|
48
- define_method("new#{kind}") do |*args, &block| # def new(*args, &block)
49
- args.unshift(:plain) unless args.first.is_a?(Symbol) # args.unshift(:plain) unless args.first.is_a?(Symbol)
50
- client = Gmail::Client.new(*args) # client = Gmail::Client.new(*args)
51
- client.send("connect#{kind}") and client.send("login#{kind}") # client.connect and client.login
52
- #
53
- if block_given? # if block_given?
54
- yield client # yield client
55
- client.logout # client.logout
56
- end # end
57
- #
58
- client # client
59
- end # end
60
- }
48
+ def new(*args, &block)
49
+ args.unshift(:plain) unless args.first.is_a?(Symbol)
50
+ client = Gmail::Client.new(*args)
51
+ client.connect
52
+ client.login
61
53
 
62
- alias :connect :new
63
- alias :connect! :new!
54
+ if block_given?
55
+ yield client
56
+ client.logout
57
+ end
58
+
59
+ client
60
+ end
61
+ alias_method :connect, :new
62
+
63
+ def new!(*args, &block)
64
+ args.unshift(:plain) unless args.first.is_a?(Symbol)
65
+ client = Gmail::Client.new(*args)
66
+ client.connect!
67
+ client.login!
68
+
69
+ if block_given?
70
+ yield client
71
+ client.logout
72
+ end
73
+
74
+ client
75
+ end
76
+ alias_method :connect!, :new!
64
77
  end # << self
65
78
  end # Gmail
@@ -1,30 +1,34 @@
1
1
  module Gmail
2
2
  module Client
3
- # Raised when connection with GMail IMAP service couldn't be established.
3
+ # Raised when connection with Gmail IMAP service couldn't be established.
4
4
  class ConnectionError < SocketError; end
5
5
  # Raised when given username or password are invalid.
6
6
  class AuthorizationError < Net::IMAP::NoResponseError; end
7
- # Raised when delivered email is invalid.
7
+ # Raised when delivered email is invalid.
8
8
  class DeliveryError < ArgumentError; end
9
9
  # Raised when given client is not registered
10
10
  class UnknownClient < ArgumentError; end
11
11
 
12
- def self.register(name, klass)
12
+ def self.clients
13
13
  @clients ||= {}
14
- @clients[name] = klass
14
+ end
15
+
16
+ def self.register(name, klass)
17
+ clients[name] = klass
15
18
  end
16
19
 
17
20
  def self.new(name, *args)
18
- if client = @clients[name]
21
+ if client = clients[name]
19
22
  client.new(*args)
20
23
  else
21
- raise UnknownClient, "No such client: #{name}"
24
+ raise UnknownClient, "No such client: #{name}"
22
25
  end
23
26
  end
24
27
 
25
- require 'gmail/client/imap_extensions'
28
+ require 'gmail/imap_extensions'
26
29
  require 'gmail/client/base'
27
30
  require 'gmail/client/plain'
28
31
  require 'gmail/client/xoauth'
32
+ require 'gmail/client/xoauth2'
29
33
  end # Client
30
34
  end # Gmail
@@ -3,89 +3,94 @@ require 'thread'
3
3
  module Gmail
4
4
  module Client
5
5
  class Base
6
- # GMail IMAP defaults
6
+ # Gmail IMAP defaults
7
7
  GMAIL_IMAP_HOST = 'imap.gmail.com'
8
8
  GMAIL_IMAP_PORT = 993
9
-
10
- # GMail SMTP defaults
9
+
10
+ # Gmail SMTP defaults
11
11
  GMAIL_SMTP_HOST = "smtp.gmail.com"
12
12
  GMAIL_SMTP_PORT = 587
13
-
13
+
14
14
  attr_reader :username
15
15
  attr_reader :options
16
-
17
- def initialize(username, options={})
16
+
17
+ def initialize(username, options = {})
18
18
  defaults = {}
19
19
  @username = fill_username(username)
20
20
  @options = defaults.merge(options)
21
21
  @mailbox_mutex = Mutex.new
22
22
  end
23
-
24
- # Connect to gmail service.
25
- def connect(raise_errors=false)
23
+
24
+ # Connect to gmail service.
25
+ def connect(raise_errors = false)
26
26
  @imap = Net::IMAP.new(GMAIL_IMAP_HOST, GMAIL_IMAP_PORT, true, nil, false)
27
- GmailImapExtensions.patch_net_imap_response_parser
27
+ Gmail::ImapExtensions.patch_net_imap_response_parser
28
28
  @imap
29
29
  rescue SocketError
30
- raise_errors and raise ConnectionError, "Couldn't establish connection with GMail IMAP service"
30
+ raise_errors and raise ConnectionError, "Couldn't establish connection with Gmail IMAP service"
31
31
  end
32
-
32
+
33
33
  # This version of connect will raise error on failure...
34
34
  def connect!
35
35
  connect(true)
36
36
  end
37
-
38
- # Return current connection. Log in automaticaly to specified account if
37
+
38
+ # Return current connection. Log in automaticaly to specified account if
39
39
  # it is necessary.
40
40
  def connection
41
41
  login and at_exit { logout } unless logged_in?
42
42
  @imap
43
43
  end
44
44
  alias :conn :connection
45
-
45
+
46
46
  # Login to specified account.
47
47
  def login(*args)
48
48
  raise NotImplementedError, "The `#{self.class.name}#login` method is not implemented."
49
49
  end
50
50
  alias :sign_in :login
51
-
51
+
52
52
  # This version of login will raise error on failure...
53
53
  def login!
54
54
  login(true)
55
55
  end
56
56
  alias :sign_in! :login!
57
-
57
+
58
58
  # Returns +true+ when you are logged in to specified account.
59
59
  def logged_in?
60
60
  !!@logged_in
61
61
  end
62
62
  alias :signed_in? :logged_in?
63
-
64
- # Logout from GMail service.
63
+
64
+ # Logout from Gmail service.
65
65
  def logout
66
66
  @imap && logged_in? and @imap.logout
67
67
  ensure
68
68
  @logged_in = false
69
69
  end
70
70
  alias :sign_out :logout
71
-
72
- # Return labels object, which helps you with managing your GMail labels.
71
+
72
+ # Disconnect from Gmail service.
73
+ def disconnect
74
+ @imap && @imap.disconnect
75
+ end
76
+
77
+ # Return labels object, which helps you with managing your Gmail labels.
73
78
  # See <tt>Gmail::Labels</tt> for details.
74
79
  def labels
75
80
  @labels ||= Labels.new(conn)
76
81
  end
77
-
82
+
78
83
  # Compose new e-mail.
79
84
  #
80
85
  # ==== Examples
81
- #
86
+ #
82
87
  # mail = gmail.compose
83
88
  # mail.from "test@gmail.org"
84
89
  # mail.to "friend@gmail.com"
85
90
  #
86
91
  # ... or block style:
87
- #
88
- # mail = gmail.compose do
92
+ #
93
+ # mail = gmail.compose do
89
94
  # from "test@gmail.org"
90
95
  # to "friend@gmail.com"
91
96
  # subject "Hello!"
@@ -95,24 +100,24 @@ module Gmail
95
100
  # Now you can deliver your mail:
96
101
  #
97
102
  # gmail.deliver(mail)
98
- def compose(mail=nil, &block)
103
+ def compose(mail = nil, &block)
99
104
  if block_given?
100
105
  mail = Mail.new(&block)
101
- elsif !mail
106
+ elsif !mail
102
107
  mail = Mail.new
103
- end
108
+ end
104
109
 
105
110
  mail.delivery_method(*smtp_settings)
106
111
  mail.from = username unless mail.from
107
112
  mail
108
113
  end
109
114
  alias :message :compose
110
-
111
- # Compose (optionaly) and send given email.
115
+
116
+ # Compose (optionaly) and send given email.
112
117
  #
113
118
  # ==== Examples
114
119
  #
115
- # gmail.deliver do
120
+ # gmail.deliver do
116
121
  # to "friend@gmail.com"
117
122
  # subject "Hello friend!"
118
123
  # body "Hi! How are you?"
@@ -125,19 +130,19 @@ module Gmail
125
130
  #
126
131
  # mail = gmail.compose { ... }
127
132
  # gmail.deliver(mail)
128
- def deliver(mail=nil, raise_errors=false, &block)
133
+ def deliver(mail = nil, raise_errors = false, &block)
129
134
  mail = compose(mail, &block) if block_given?
130
135
  mail.deliver!
131
136
  rescue Object => ex
132
137
  raise_errors and raise DeliveryError, "Couldn't deliver email: #{ex.to_s}"
133
138
  end
134
-
139
+
135
140
  # This version of deliver will raise error on failure...
136
- def deliver!(mail=nil, &block)
141
+ def deliver!(mail = nil, &block)
137
142
  deliver(mail, true, &block)
138
143
  end
139
-
140
- # Do something with given mailbox or within it context.
144
+
145
+ # Do something with given mailbox or within it context.
141
146
  #
142
147
  # ==== Examples
143
148
  #
@@ -154,9 +159,9 @@ module Gmail
154
159
  # end
155
160
  def mailbox(name, &block)
156
161
  @mailbox_mutex.synchronize do
157
- name = name.to_s
162
+ name = labels.localize(name)
158
163
  mailbox = (mailboxes[name] ||= Mailbox.new(self, name))
159
- switch_to_mailbox(name) if @current_mailbox != name
164
+ switch_to_mailbox(mailbox) if @current_mailbox != mailbox
160
165
 
161
166
  if block_given?
162
167
  mailbox_stack << @current_mailbox
@@ -172,21 +177,21 @@ module Gmail
172
177
  alias :in_mailbox :mailbox
173
178
  alias :in_label :mailbox
174
179
  alias :label :mailbox
175
-
180
+
176
181
  # Alias for <tt>mailbox("INBOX")</tt>. See <tt>Gmail::Client#mailbox</tt>
177
182
  # for details.
178
183
  def inbox
179
184
  mailbox("INBOX")
180
185
  end
181
-
186
+
182
187
  def mailboxes
183
188
  @mailboxes ||= {}
184
189
  end
185
-
190
+
186
191
  def inspect
187
192
  "#<Gmail::Client#{'0x%04x' % (object_id << 1)} (#{username}) #{'dis' if !logged_in?}connected>"
188
193
  end
189
-
194
+
190
195
  def fill_username(username)
191
196
  username =~ /@/ ? username : "#{username}@gmail.com"
192
197
  end
@@ -194,21 +199,20 @@ module Gmail
194
199
  def mail_domain
195
200
  username.split('@').last
196
201
  end
197
-
202
+
198
203
  private
199
-
204
+
200
205
  def switch_to_mailbox(mailbox)
201
206
  if mailbox
202
- mailbox = Net::IMAP.encode_utf7(mailbox)
203
- conn.select(mailbox)
207
+ conn.select(mailbox.encoded_name)
204
208
  end
205
209
  @current_mailbox = mailbox
206
210
  end
207
-
211
+
208
212
  def mailbox_stack
209
213
  @mailbox_stack ||= []
210
214
  end
211
-
215
+
212
216
  def smtp_settings
213
217
  [:smtp, {
214
218
  :address => GMAIL_SMTP_HOST,
@@ -2,16 +2,20 @@ module Gmail
2
2
  module Client
3
3
  class Plain < Base
4
4
  attr_reader :password
5
-
6
- def initialize(username, password, options={})
5
+
6
+ def initialize(username, password, options = {})
7
7
  @password = password
8
8
  super(username, options)
9
9
  end
10
10
 
11
- def login(raise_errors=false)
11
+ def login(raise_errors = false)
12
12
  @imap and @logged_in = (login = @imap.login(username, password)) && login.name == 'OK'
13
- rescue Net::IMAP::NoResponseError
14
- raise_errors and raise AuthorizationError, "Couldn't login to given GMail account: #{username}"
13
+ rescue Net::IMAP::NoResponseError => e
14
+ if raise_errors
15
+ message = "Couldn't login to given Gmail account: #{username}"
16
+ message += " (#{e.response.data.text.strip})"
17
+ raise(AuthorizationError.new(e.response), message, e.backtrace)
18
+ end
15
19
  end
16
20
  end # Plain
17
21
 
@@ -8,24 +8,40 @@ module Gmail
8
8
  attr_reader :consumer_key
9
9
  attr_reader :consumer_secret
10
10
 
11
- def initialize(username, options={})
11
+ def initialize(username, options = {})
12
12
  @token = options.delete(:token)
13
13
  @secret = options.delete(:secret)
14
14
  @consumer_key = options.delete(:consumer_key)
15
15
  @consumer_secret = options.delete(:consumer_secret)
16
-
16
+
17
17
  super(username, options)
18
18
  end
19
19
 
20
- def login(raise_errors=false)
20
+ def login(raise_errors = false)
21
21
  @imap and @logged_in = (login = @imap.authenticate('XOAUTH', username,
22
22
  :consumer_key => consumer_key,
23
23
  :consumer_secret => consumer_secret,
24
24
  :token => token,
25
25
  :token_secret => secret
26
26
  )) && login.name == 'OK'
27
- rescue
28
- raise_errors and raise AuthorizationError, "Couldn't login to given GMail account: #{username}"
27
+ rescue Net::IMAP::NoResponseError => e
28
+ if raise_errors
29
+ message = "Couldn't login to given Gmail account: #{username}"
30
+ message += " (#{e.response.data.text.strip})"
31
+ raise(AuthorizationError.new(e.response), message, e.backtrace)
32
+ end
33
+ end
34
+
35
+ def access_token
36
+ consumer_options = {
37
+ :site => "https://www.google.com",
38
+ :request_token_path => "/accounts/OAuthGetRequestToken",
39
+ :authorize_path => "/accounts/OAuthAuthorizeToken",
40
+ :access_token_path => "/accounts/OAuthGetAccessToken"
41
+ }
42
+ consumer = OAuth::Consumer.new(consumer_key, consumer_secret, consumer_options)
43
+ @access_token ||= OAuth::AccessToken.new(consumer, token, secret)
44
+ @access_token
29
45
  end
30
46
 
31
47
  def smtp_settings
@@ -38,7 +54,8 @@ module Gmail
38
54
  :consumer_key => consumer_key,
39
55
  :consumer_secret => consumer_secret,
40
56
  :token => token,
41
- :token_secret => secret
57
+ :token_secret => secret,
58
+ :access_token => access_token
42
59
  },
43
60
  :authentication => :xoauth,
44
61
  :enable_starttls_auto => true