gmail 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gemspec
3
+ gemspec
data/README.md CHANGED
@@ -1,31 +1,15 @@
1
- # GMail for Ruby
1
+ <img alt="Gmail for Ruby" src="https://cloud.githubusercontent.com/assets/27655/5792399/fd5d076e-9f59-11e4-826c-22c311e38356.png">
2
2
 
3
- A Rubyesque interface to Google's GMail, with all the tools you'll need. Search,
3
+ [![Build Status](https://travis-ci.org/gmailgem/gmail.svg)](https://travis-ci.org/gmailgem/gmail)
4
+ [![Code Climate](https://codeclimate.com/github/gmailgem/gmail.svg)](https://codeclimate.com/github/gmailgem/gmail)
5
+ [![Gem Version](https://badge.fury.io/rb/gmail.svg)](http://badge.fury.io/rb/gmail)
6
+
7
+ A Rubyesque interface to Google's Gmail, with all the tools you'll need. Search,
4
8
  read and send multipart emails, archive, mark as read/unread, delete emails,
5
9
  and manage labels.
6
10
 
7
- It's based on Daniel Parker's ruby-gmail gem. This version has more friendy
8
- API, is well tested, better documented and have many other improvements.
9
-
10
- ## Author(s)
11
-
12
- * Kriss 'nu7hatch' Kowalik
13
- * [Daniel Parker of BehindLogic.com](http://github.com/dcparker)
14
-
15
- Extra thanks for specific feature contributions from:
16
-
17
- * [abhishiv](http://github.com/abhishiv)
18
- * [Michael Young](http://github.com/myoung8)
19
- * [Nicolas Fouché](http://github.com/nfo)
20
- * [Stefano Bernardi](http://github.com/stefanobernardi)
21
- * [Benjamin Bock](http://github.com/bb)
22
- * [Arthur Chiu](http://github.com/achiu)
23
- * [Justin Perkins](http://github.com/justinperkins)
24
- * [Mikkel Malmberg](http://github.com/mikker)
25
- * [Julien Blanchard](http://github.com/julienXX)
26
- * [Federico Galassi](http://github.com/fgalassi)
27
- * [Alex Genco](http://github.com/alexgenco)
28
- * [Justin Grevich](http://github.com/jgrevich)
11
+ It's based on Daniel Parker's ruby-gmail gem. This version has more friendly
12
+ API, is well tested, better documented and have many other improvements.
29
13
 
30
14
  ## Installation
31
15
 
@@ -35,16 +19,20 @@ You can install it easy using rubygems:
35
19
 
36
20
  Or install it manually:
37
21
 
38
- git clone git://github.com/nu7hatch/gmail.git
22
+ git clone git://github.com/gmailgem/gmail.git
39
23
  cd gmail
40
24
  rake install
41
25
 
42
26
  gmail gem has the following dependencies (with Bundler all will be installed automatically):
43
27
 
44
- * mail (Ruby 1.8.7 users should lock mail gem version at 2.5.3)
45
- * mime
28
+ * mail
46
29
  * gmail_xoauth
47
- * smpt_tls (Ruby < 1.8.7)
30
+
31
+ ## Version Support
32
+
33
+ * Ruby 2.0.0+ is supported
34
+ * Ruby 1.9.3 is supported but deprecated and is planned to be dropped from gmail v0.6.0
35
+ * Ruby 1.8.7 users should use gmail v0.4.1
48
36
 
49
37
  ## Features
50
38
 
@@ -61,47 +49,59 @@ gmail gem has the following dependencies (with Bundler all will be installed aut
61
49
 
62
50
  First of all require the `gmail` library.
63
51
 
64
- require 'gmail'
65
-
52
+ ```ruby
53
+ require 'gmail'
54
+ ```
55
+
66
56
  ### Authenticating gmail sessions
67
57
 
68
- This will you automatically log in to your account.
58
+ This will let you automatically log in to your account.
69
59
 
70
- gmail = Gmail.connect(username, password)
71
- # play with your gmail...
72
- gmail.logout
60
+ ```ruby
61
+ gmail = Gmail.connect(username, password)
62
+ # play with your gmail...
63
+ gmail.logout
64
+ ```
73
65
 
74
66
  If you pass a block, the session will be passed into the block, and the session
75
67
  will be logged out after the block is executed.
76
68
 
77
- Gmail.connect(username, password) do |gmail|
78
- # play with your gmail...
79
- end
80
-
69
+ ```ruby
70
+ Gmail.connect(username, password) do |gmail|
71
+ # play with your gmail...
72
+ end
73
+ ```
74
+
81
75
  Examples above are "quiet", it means that it will not raise any errors when
82
76
  session couldn't be started (eg. because of connection error or invalid
83
77
  authorization data). You can use connection which handles errors raising:
84
78
 
85
- Gmail.connect!(username, password)
86
- Gmail.connect!(username, password) {|gmail| ... play with gmail ... }
87
-
79
+ ```ruby
80
+ Gmail.connect!(username, password)
81
+ Gmail.connect!(username, password) {|gmail| ... play with gmail ... }
82
+ ```
83
+
88
84
  You can also check if you are logged in at any time:
89
85
 
90
- Gmail.connect(username, password) do |gmail|
91
- gmail.logged_in?
92
- end
86
+ ```ruby
87
+ Gmail.connect(username, password) do |gmail|
88
+ gmail.logged_in?
89
+ end
90
+ ```
93
91
 
94
92
  ### XOAuth authentication
95
93
 
96
94
  From v0.4.0 it's possible to authenticate with your Gmail account using XOAuth
97
95
  method. It's very simple:
98
96
 
99
- gmail = Gmail.connect(:xoauth, "email@domain.com",
100
- :token => 'TOKEN',
101
- :secret => 'TOKEN_SECRET',
102
- :consumer_key => 'CONSUMER_KEY',
103
- :consumer_secret => 'CONSUMER_SECRET'
104
- )
97
+ ```ruby
98
+ gmail = Gmail.connect(:xoauth, "email@domain.com",
99
+ :token => 'TOKEN',
100
+ :secret => 'TOKEN_SECRET',
101
+ :consumer_key => 'CONSUMER_KEY',
102
+ :consumer_secret => 'CONSUMER_SECRET'
103
+ )
104
+ ```
105
105
 
106
106
  For more information check out the [gmail_xoauth](https://github.com/nfo/gmail_xoauth)
107
107
  gem from Nicolas Fouché.
@@ -110,117 +110,171 @@ gem from Nicolas Fouché.
110
110
 
111
111
  Get counts for messages in the inbox:
112
112
 
113
- gmail.inbox.count
114
- gmail.inbox.count(:unread)
115
- gmail.inbox.count(:read)
113
+ ```ruby
114
+ gmail.inbox.count
115
+ gmail.inbox.count(:unread)
116
+ gmail.inbox.count(:read)
117
+ ```
116
118
 
117
119
  Count with some criteria:
118
120
 
119
- gmail.inbox.count(:after => Date.parse("2010-02-20"), :before => Date.parse("2010-03-20"))
120
- gmail.inbox.count(:on => Date.parse("2010-04-15"))
121
- gmail.inbox.count(:from => "myfriend@gmail.com")
122
- gmail.inbox.count(:to => "directlytome@gmail.com")
121
+ ```ruby
122
+ gmail.inbox.count(:after => Date.parse("2010-02-20"), :before => Date.parse("2010-03-20"))
123
+ gmail.inbox.count(:on => Date.parse("2010-04-15"))
124
+ gmail.inbox.count(:from => "myfriend@gmail.com")
125
+ gmail.inbox.count(:to => "directlytome@gmail.com")
126
+ ```
123
127
 
124
128
  Combine flags and options:
125
129
 
126
- gmail.inbox.count(:unread, :from => "myboss@gmail.com")
127
-
130
+ ```ruby
131
+ gmail.inbox.count(:unread, :from => "myboss@gmail.com")
132
+ ```
133
+
128
134
  Browsing labeled emails is similar to work with inbox.
129
135
 
130
- gmail.mailbox('Urgent').count
131
-
136
+ ```ruby
137
+ gmail.mailbox('Urgent').count
138
+ ```
139
+
132
140
  Getting messages works the same way as counting: Remember that every message in a
133
141
  conversation/thread will come as a separate message.
134
142
 
135
- gmail.inbox.emails(:unread, :before => Date.parse("2010-04-20"), :from => "myboss@gmail.com")
143
+ ```ruby
144
+ gmail.inbox.emails(:unread, :before => Date.parse("2010-04-20"), :from => "myboss@gmail.com")
145
+ ```
146
+
147
+ The [gm option](https://developers.google.com/gmail/imap_extensions?csw=1#extension_of_the_search_command_x-gm-raw) enables use of the Gmail search syntax.
148
+
149
+ ```ruby
150
+ gmail.inbox.emails(gm: '"testing"')
151
+ ```
136
152
 
137
153
  You can use also one of aliases:
138
154
 
139
- gmail.inbox.find(...)
140
- gmail.inbox.search(...)
141
- gmail.inbox.mails(...)
142
-
155
+ ```ruby
156
+ gmail.inbox.find(...)
157
+ gmail.inbox.search(...)
158
+ gmail.inbox.mails(...)
159
+ ```
160
+
143
161
  Also you can manipulate each message using block style:
144
162
 
145
- gmail.inbox.find(:unread).each do |email|
146
- email.read!
147
- end
148
-
163
+ ```ruby
164
+ gmail.inbox.find(:unread).each do |email|
165
+ email.read!
166
+ end
167
+ ```
168
+
149
169
  ### Working with emails!
150
170
 
151
171
  Any news older than 4-20, mark as read and archive it:
152
172
 
153
- gmail.inbox.find(:before => Date.parse("2010-04-20"), :from => "news@nbcnews.com").each do |email|
154
- email.read! # can also unread!, spam! or star!
155
- email.archive!
156
- end
173
+ ```ruby
174
+ gmail.inbox.find(:before => Date.parse("2010-04-20"), :from => "news@nbcnews.com").each do |email|
175
+ email.read! # can also unread!, spam! or star!
176
+ email.archive!
177
+ end
178
+ ```
157
179
 
158
180
  Delete emails from X:
159
181
 
160
- gmail.inbox.find(:from => "x-fiance@gmail.com").each do |email|
161
- email.delete!
162
- end
163
-
164
- Save all attachments in the "Faxes" label to a local folder:
165
-
166
- folder = "/where/ever"
167
- gmail.mailbox("Faxes").emails.each do |email|
168
- if !email.message.attachments.empty?
169
- email.message.save_attachments_to(folder)
170
- end
171
- end
182
+ ```ruby
183
+ gmail.inbox.find(:from => "x-fiance@gmail.com").each do |email|
184
+ email.delete!
185
+ end
186
+ ```
187
+
188
+ Save all attachments in the "Faxes" label to a local folder (uses functionality from `Mail` gem):
189
+
190
+ ```ruby
191
+ folder = Dir.pwd # for example
192
+ gmail.mailbox("Faxes").emails.each do |email|
193
+ email.message.attachments.each do |f|
194
+ File.write(File.join(folder, f.filename), f.body.decoded)
195
+ end
196
+ end
197
+ ```
172
198
 
173
199
  You can use also `#label` method instead of `#mailbox`:
174
200
 
175
- gmail.label("Faxes").emails {|email| ... }
201
+ ```ruby
202
+ gmail.label("Faxes").emails {|email| ... }
203
+ ```
176
204
 
177
205
  Save just the first attachment from the newest unread email (assuming pdf):
178
206
 
179
- email = gmail.inbox.find(:unread).first
180
- email.attachments[0].save_to_file("/path/to/location")
207
+ ```ruby
208
+ email = gmail.inbox.find(:unread).first
209
+ email.attachments[0].save_to_file("/path/to/location")
210
+ ```
181
211
 
182
212
  Add a label to a message:
183
213
 
184
- email.label("Faxes")
185
-
214
+ ```ruby
215
+ email.label("Faxes")
216
+ ```
217
+
186
218
  Example above will raise error when you don't have the `Faxes` label. You can
187
219
  avoid this using:
188
220
 
189
- email.label!("Faxes") # The `Faxes` label will be automatically created now
221
+ ```ruby
222
+ email.label!("Faxes") # The `Faxes` label will be automatically created now
223
+ ```
190
224
 
191
225
  You can also move message to a label/mailbox:
192
-
193
- email.move_to("Faxes")
194
- email.move_to!("NewLabel")
195
-
226
+
227
+ ```ruby
228
+ email.move_to("Faxes")
229
+ email.move_to!("NewLabel")
230
+ ```
231
+
196
232
  There is also few shortcuts to mark messages quickly:
197
233
 
198
- email.read!
199
- email.unread!
200
- email.spam!
201
- email.star!
202
- email.unstar!
234
+ ```ruby
235
+ email.read!
236
+ email.unread!
237
+ email.spam!
238
+ email.star!
239
+ email.unstar!
240
+ ```
203
241
 
204
242
  ### Managing labels
205
243
 
206
244
  With Gmail gem you can also manage your labels. You can get list of defined
207
245
  labels:
208
246
 
209
- gmail.labels.all
247
+ ```ruby
248
+ gmail.labels.all
249
+ ```
210
250
 
211
251
  Create new label:
212
-
213
- gmail.labels.new("Urgent")
214
- gmail.labels.add("AnotherOne")
215
-
252
+
253
+ ```ruby
254
+ gmail.labels.new("Urgent")
255
+ gmail.labels.add("AnotherOne")
256
+ ```
257
+
216
258
  Remove labels:
217
259
 
218
- gmail.labels.delete("Urgent")
219
-
260
+ ```ruby
261
+ gmail.labels.delete("Urgent")
262
+ ```
263
+
220
264
  Or check if given label exists:
221
265
 
222
- gmail.labels.exists?("Urgent") # => false
223
- gmail.labels.exists?("AnotherOne") # => true
266
+ ```ruby
267
+ gmail.labels.exists?("Urgent") # => false
268
+ gmail.labels.exists?("AnotherOne") # => true
269
+ ```
270
+
271
+ Localize label names using the LIST special-use extension flags,
272
+ :Inbox, :All, :Drafts, :Sent, :Trash, :Important, :Junk, and :Flagged
273
+
274
+ ```ruby
275
+ gmail.labels.localize(:all) # => "[Gmail]\All Mail"
276
+ # => "[Google Mail]\All Mail"
277
+ ```
224
278
 
225
279
  ### Composing and sending emails
226
280
 
@@ -230,27 +284,38 @@ automatically configure your Mail emails to be sent via your Gmail account's SMT
230
284
  so they will be in your Gmail's "Sent" folder. Also, no need to specify the "From"
231
285
  email either, because ruby-gmail will set it for you.
232
286
 
233
- gmail.deliver do
234
- to "email@example.com"
235
- subject "Having fun in Puerto Rico!"
236
- text_part do
237
- body "Text of plaintext message."
238
- end
239
- html_part do
240
- content_type 'text/html; charset=UTF-8'
241
- body "<p>Text of <em>html</em> message.</p>"
242
- end
243
- add_file "/path/to/some_image.jpg"
244
- end
287
+ ```ruby
288
+ gmail.deliver do
289
+ to "email@example.com"
290
+ subject "Having fun in Puerto Rico!"
291
+ text_part do
292
+ body "Text of plaintext message."
293
+ end
294
+ html_part do
295
+ content_type 'text/html; charset=UTF-8'
296
+ body "<p>Text of <em>html</em> message.</p>"
297
+ end
298
+ add_file "/path/to/some_image.jpg"
299
+ end
300
+ ```
245
301
 
246
302
  Or, compose the message first and send it later
247
303
 
248
- email = gmail.compose do
249
- to "email@example.com"
250
- subject "Having fun in Puerto Rico!"
251
- body "Spent the day on the road..."
252
- end
253
- email.deliver! # or: gmail.deliver(email)
304
+ ```ruby
305
+ email = gmail.compose do
306
+ to "email@example.com"
307
+ subject "Having fun in Puerto Rico!"
308
+ body "Spent the day on the road..."
309
+ end
310
+ email.deliver! # or: gmail.deliver(email)
311
+ ```
312
+
313
+ ## Troubleshooting
314
+
315
+ If you are having trouble connecting to Gmail:
316
+ * Please ensure your account is verified
317
+ * In [Gmail Security Settings](https://www.google.com/settings/security), enable access for less secure applications.
318
+ * Read [this support answer re: suspicious activity](https://support.google.com/mail/answer/78754) and try things like entering a captcha.
254
319
 
255
320
  ## Note on Patches/Pull Requests
256
321
 
@@ -262,10 +327,28 @@ Or, compose the message first and send it later
262
327
  (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
263
328
  * Send me a pull request. Bonus points for topic branches.
264
329
 
330
+ ## Authors
331
+
332
+ #### Core Team
333
+
334
+ This project follows on Open Governance model. The Core Team is responsible for technical guidance, reviewing/merging PRs, and releases.
335
+
336
+ * Jeff Carbonella - [@jcarbo](https://github.com/jcarbo)
337
+ * Johnny Shields - [@johnnyshields](https://github.com/johnnyshields)
338
+ * Alexandre Loureiro Solleiro - [@webcracy](https://github.com/webcracy)
339
+ * Justin Grevitch - [@jgrevich](https://github.com/jgrevich)
340
+ * [@bootstraponline](https://github.com/bootstraponline)
341
+
342
+ #### Legacy Contributors
343
+
344
+ * Kriss Kowalik - [@nu7hatch](https://github.com/nu7hatch)
345
+ * Daniel Parker - [@dcparker](https://github.com/dcparker)
346
+ * Refer to [CHANGELOG](https://github.com/gmailgem/gmail/blob/master/CHANGELOG.md) for individual contributions
347
+
265
348
  ## Copyright
266
349
 
267
- * Copyrignt (c) 2010 Kriss 'nu7hatch' Kowalik
350
+ * Copyright (c) 2015 GmailGem team
351
+ * Copyright (c) 2010-2014 Kriss 'nu7hatch' Kowalik
268
352
  * Copyright (c) 2009-2010 BehindLogic
269
353
 
270
- See LICENSE for details.
271
-
354
+ Licensed under the MIT license. See [LICENSE](https://github.com/gmailgem/gmail/blob/master/LICENSE) for details.