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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +13 -0
- data/.rubocop_todo.yml +239 -0
- data/.travis.yml +19 -0
- data/CHANGELOG.md +75 -18
- data/Gemfile +1 -1
- data/README.md +214 -131
- data/Rakefile +11 -0
- data/gmail.gemspec +8 -8
- data/lib/gmail.rb +31 -18
- data/lib/gmail/client.rb +11 -7
- data/lib/gmail/client/base.rb +52 -48
- data/lib/gmail/client/plain.rb +9 -5
- data/lib/gmail/client/xoauth.rb +23 -6
- data/lib/gmail/client/xoauth2.rb +39 -0
- data/lib/gmail/imap_extensions.rb +150 -0
- data/lib/gmail/labels.rb +33 -16
- data/lib/gmail/mailbox.rb +60 -42
- data/lib/gmail/message.rb +142 -101
- data/lib/gmail/version.rb +2 -2
- data/spec/account.yml.obfus +2 -0
- data/spec/gmail/client/base_spec.rb +5 -0
- data/spec/gmail/client/plain_spec.rb +168 -0
- data/spec/gmail/client/xoauth2_spec.rb +186 -0
- data/spec/gmail/client/xoauth_spec.rb +5 -0
- data/spec/gmail/client_spec.rb +5 -0
- data/spec/gmail/imap_extensions_spec.rb +12 -0
- data/spec/gmail/labels_spec.rb +18 -0
- data/spec/{mailbox_spec.rb → gmail/mailbox_spec.rb} +14 -14
- data/spec/gmail/message_spec.rb +181 -0
- data/spec/gmail_spec.rb +21 -21
- data/spec/recordings/gmail/_new_connects_with_client_and_give_it_context_when_block_given.yml +28 -0
- data/spec/recordings/gmail/_new_connects_with_gmail_service_and_return_valid_connection_object.yml +28 -0
- data/spec/recordings/gmail/_new_does_not_raise_error_when_couldn_t_connect_with_given_account.yml +13 -0
- data/spec/recordings/gmail/_new_raises_error_when_couldn_t_connect_with_given_account.yml +13 -0
- data/spec/recordings/gmail_client_plain/instance/_connection_automatically_logs_in_to_gmail_account_when_it_s_called.yml +42 -0
- data/spec/recordings/gmail_client_plain/instance/delivers_inline_composed_email.yml +42 -0
- data/spec/recordings/gmail_client_plain/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +13 -0
- data/spec/recordings/gmail_client_plain/instance/does_not_raise_error_even_though_gmail_account_is_invalid.yml +13 -0
- data/spec/recordings/gmail_client_plain/instance/labels/checks_if_there_is_given_label_defined.yml +196 -0
- data/spec/recordings/gmail_client_plain/instance/labels/creates_given_label.yml +151 -0
- data/spec/recordings/gmail_client_plain/instance/labels/removes_existing_label.yml +146 -0
- data/spec/recordings/gmail_client_plain/instance/labels/returns_list_of_all_available_labels.yml +113 -0
- data/spec/recordings/gmail_client_plain/instance/properly_logs_in_to_valid_gmail_account.yml +42 -0
- data/spec/recordings/gmail_client_plain/instance/properly_logs_out_from_gmail.yml +42 -0
- data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox.yml +109 -0
- data/spec/recordings/gmail_client_plain/instance/properly_switches_to_given_mailbox_using_block_style.yml +109 -0
- data/spec/recordings/gmail_client_plain/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +13 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/does_not_log_in_when_given_gmail_account_is_invalid.yml +13 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/labels/checks_if_there_is_given_label_defined.yml +27 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/labels/creates_given_label.yml +39 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/labels/removes_existing_label.yml +39 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/labels/returns_list_of_all_available_labels.yml +27 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_in_to_valid_gmail_account.yml +15 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/properly_logs_out_from_gmail.yml +15 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox.yml +40 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/properly_switches_to_given_mailbox_using_block_style.yml +40 -0
- data/spec/recordings/gmail_client_xo_auth2/instance/raises_error_when_given_gmail_account_is_invalid_and_errors_enabled.yml +13 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/all/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/drafts/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/flagged/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/important/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/inbox/localizes_into_the_appropriate_label.yml +42 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/junk/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/sent/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_labels/localize/when_given_the_xl_is_tflag/trash/localizes_into_the_appropriate_label.yml +116 -0
- data/spec/recordings/gmail_mailbox/instance/counts_all_emails.yml +277 -0
- data/spec/recordings/gmail_mailbox/instance/finds_messages.yml +586 -0
- data/spec/recordings/gmail_mailbox/on_initialize/sets_client_and_name.yml +42 -0
- data/spec/recordings/gmail_mailbox/on_initialize/works_in_inbox_by_default.yml +42 -0
- data/spec/recordings/gmail_message/initialize/sets_prefetch_attrs.yml +578 -0
- data/spec/recordings/gmail_message/initialize/sets_uid_and_mailbox.yml +580 -0
- data/spec/recordings/gmail_message/instance_methods/deletes_itself.yml +637 -0
- data/spec/recordings/gmail_message/instance_methods/marks_itself_read.yml +682 -0
- data/spec/recordings/gmail_message/instance_methods/marks_itself_unread.yml +686 -0
- data/spec/recordings/gmail_message/instance_methods/moves_from_one_tag_to_other.yml +862 -0
- data/spec/recordings/gmail_message/instance_methods/removes_a_given_label.yml +776 -0
- data/spec/recordings/gmail_message/instance_methods/removes_a_given_label_with_old_method.yml +776 -0
- data/spec/recordings/gmail_message/instance_methods/sets_given_label.yml +690 -0
- data/spec/recordings/gmail_message/instance_methods/sets_given_label_with_old_method.yml +691 -0
- data/spec/spec_helper.rb +34 -10
- data/spec/support/imap_mock.rb +129 -0
- data/spec/support/obfuscation.rb +52 -0
- metadata +79 -30
- data/TODO.md +0 -12
- data/lib/gmail/client/imap_extensions.rb +0 -54
- data/spec/client_spec.rb +0 -178
- data/spec/message_spec.rb +0 -51
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,31 +1,15 @@
|
|
1
|
-
|
1
|
+
<img alt="Gmail for Ruby" src="https://cloud.githubusercontent.com/assets/27655/5792399/fd5d076e-9f59-11e4-826c-22c311e38356.png">
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/gmailgem/gmail)
|
4
|
+
[](https://codeclimate.com/github/gmailgem/gmail)
|
5
|
+
[](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
|
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/
|
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
|
45
|
-
* mime
|
28
|
+
* mail
|
46
29
|
* gmail_xoauth
|
47
|
-
|
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
|
-
|
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
|
-
|
71
|
-
|
72
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
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
|
-
|
86
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
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
|
-
|
114
|
-
|
115
|
-
|
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
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
140
|
-
|
141
|
-
|
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
|
-
|
146
|
-
|
147
|
-
|
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
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
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
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
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
|
-
|
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
|
-
|
180
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
194
|
-
|
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
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
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
|
-
|
247
|
+
```ruby
|
248
|
+
gmail.labels.all
|
249
|
+
```
|
210
250
|
|
211
251
|
Create new label:
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
gmail.labels.new("Urgent")
|
255
|
+
gmail.labels.add("AnotherOne")
|
256
|
+
```
|
257
|
+
|
216
258
|
Remove labels:
|
217
259
|
|
218
|
-
|
219
|
-
|
260
|
+
```ruby
|
261
|
+
gmail.labels.delete("Urgent")
|
262
|
+
```
|
263
|
+
|
220
264
|
Or check if given label exists:
|
221
265
|
|
222
|
-
|
223
|
-
|
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
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
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
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
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
|
-
*
|
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.
|