tuktuk 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -16,9 +16,9 @@ Delivering mail
16
16
  require 'tuktuk'
17
17
 
18
18
  message = {
19
- :from => 'you@username.com',
20
- :to => 'user@yoursite.com',
21
- :body => 'Hello there',
19
+ :from => 'you@username.com',
20
+ :to => 'user@yoursite.com',
21
+ :body => 'Hello there',
22
22
  :subject => 'Hiya'
23
23
  }
24
24
 
@@ -74,8 +74,8 @@ require 'tuktuk'
74
74
 
75
75
  Tuktuk.options = {
76
76
  :dkim => {
77
- :domain => 'yoursite.com',
78
- :selector => 'mailer',
77
+ :domain => 'yoursite.com',
78
+ :selector => 'mailer',
79
79
  :private_key => IO.read('ssl/yoursite.com.key')
80
80
  }
81
81
  }
@@ -85,13 +85,13 @@ message = { ... }
85
85
  response, email = Tuktuk.deliver(message)
86
86
  ```
87
87
 
88
- For DKIM to work, you need to set up a TXT record in your domain's DNS.
88
+ For DKIM to work, you need to set up some TXT records in your domain's DNS. You can use [this tool](http://www.socketlabs.com/domainkey-dkim-generation-wizard/) to generate the key. You should also create [SPF records](http://www.spfwizard.net/) if you haven't.
89
89
 
90
90
  All available options, with their defaults:
91
91
 
92
92
  ``` ruby
93
93
  Tuktuk.options = {
94
- :log_to => nil, # e.g. log/mailer.log
94
+ :log_to => nil, # e.g. log/mailer.log or STDOUT
95
95
  :helo_domain => nil, # your server's domain goes here
96
96
  :max_workers => 0, # controls number of threads for delivering_many emails (read below)
97
97
  :open_timeout => 20, # max seconds to wait for opening a connection
@@ -130,13 +130,17 @@ config.action_mailer.delivery_method = :tuktuk
130
130
  config.action_mailer.tuktuk_settings = {
131
131
  :log_to => 'log/mailer.log', # when not set, Tuktuk will use Rails.logger
132
132
  :dkim => {
133
- :domain => 'yoursite.com',
134
- :selector => 'mailer',
133
+ :domain => 'yoursite.com',
134
+ :selector => 'mailer',
135
135
  :private_key => IO.read('ssl/yoursite.com.key')
136
136
  }
137
137
  }
138
138
  ```
139
139
 
140
- --
140
+ # Contributions
141
141
 
142
- (c) 2013 Fork Limited. MIT license.
142
+ You're more than welcome. Send a pull request, including tests, and make sure you don't break anything. That's it.
143
+
144
+ # Copyright
145
+
146
+ (c) Fork Limited. MIT license.
data/lib/tuktuk/bounce.rb CHANGED
@@ -3,8 +3,8 @@ module Tuktuk
3
3
  class Bounce < RuntimeError
4
4
 
5
5
  HARD_BOUNCE_CODES = [
6
- 501, # Bad address syntax (eg. "i.user.@hotmail.com")
7
- 504, # mailbox is disabled
6
+ 501, # Bad address syntax (eg. "i.user.@hotmail.com")
7
+ 504, # mailbox is disabled
8
8
  511, # sorry, no mailbox here by that name (#5.1.1 - chkuser)
9
9
  540, # recipient's email account has been suspended.
10
10
  550, # Requested action not taken: mailbox unavailable
@@ -18,19 +18,19 @@ class Bounce < RuntimeError
18
18
  if e.is_a?(Net::SMTPFatalError) and code = e.to_s[0..2] and HARD_BOUNCE_CODES.include? code.to_i
19
19
  HardBounce.new(e)
20
20
  else
21
- SoftBounce.new(e) # either soft mailbox bounce or server bounce
21
+ SoftBounce.new(e) # either soft mailbox bounce, timeout or server bounce
22
22
  end
23
23
  end
24
24
 
25
25
  def code
26
- if str = to_s[0..2] and str.gsub(/[^0-9]/, '') != ''
27
- str.to_i
28
- end
29
- end
26
+ if str = to_s[0..2] and str.gsub(/[^0-9]/, '') != ''
27
+ str.to_i
28
+ end
29
+ end
30
30
 
31
31
  end
32
32
 
33
33
  class HardBounce < Bounce; end
34
34
  class SoftBounce < Bounce; end
35
35
 
36
- end
36
+ end
@@ -20,10 +20,11 @@ module Package
20
20
  mail = message[:html_body] ? mixed(message) : plain(message)
21
21
  mail.charset = 'UTF-8'
22
22
 
23
- mail['In-Reply-To'] = message[:in_reply_to] if message[:in_reply_to]
24
- mail['List-Archive'] = message[:list_archive] if message[:list_archive]
25
- mail['List-Id'] = message[:list_id] if message[:list_id]
26
- mail['X-Mailer'] = "Tuktuk SMTP v#{Tuktuk::VERSION}"
23
+ mail['In-Reply-To'] = message[:in_reply_to] if message[:in_reply_to]
24
+ mail['List-Unsubscribe'] = message[:list_unsubscribe] if message[:list_unsubscribe]
25
+ mail['List-Archive'] = message[:list_archive] if message[:list_archive]
26
+ mail['List-Id'] = message[:list_id] if message[:list_id]
27
+ mail['X-Mailer'] = "Tuktuk SMTP v#{Tuktuk::VERSION}"
27
28
 
28
29
  if message[:return_path]
29
30
  mail['Return-Path'] = message[:return_path]
data/lib/tuktuk/tuktuk.rb CHANGED
@@ -14,7 +14,7 @@ DEFAULTS = {
14
14
  :read_timeout => 20,
15
15
  :open_timeout => 20,
16
16
  :verify_ssl => true,
17
- :debug => false,
17
+ :debug => false,
18
18
  :log_to => nil # $stdout,
19
19
  }
20
20
 
@@ -42,7 +42,7 @@ module Tuktuk
42
42
  end
43
43
 
44
44
  def deliver_many(messages, opts = {})
45
- raise 'Please pass an array of messages.' unless messages.any?
45
+ raise ArgumentError, "Not an array of messages: #{messages.inspect}" unless messages.any?
46
46
  self.options = opts if opts.any?
47
47
  messages_by_domain = reorder_by_domain(messages)
48
48
  lookup_and_deliver_many(messages_by_domain)
@@ -121,7 +121,7 @@ module Tuktuk
121
121
  begin
122
122
  response = send_now(mail, server, to)
123
123
  break
124
- rescue => e
124
+ rescue Exception => e # explicitly rescue Exception so we catch Timeout:Error's too
125
125
  last_error = e
126
126
  end
127
127
  end
@@ -262,6 +262,7 @@ module Tuktuk
262
262
  logger.warn "Debug option enabled. Connecting to localhost!"
263
263
  server = 'localhost'
264
264
  end
265
+
265
266
  smtp = Net::SMTP.new(server, nil)
266
267
  smtp.enable_starttls_auto(context)
267
268
  smtp.read_timeout = config[:read_timeout] if config[:read_timeout]
@@ -1,7 +1,7 @@
1
1
  module Tuktuk
2
2
  MAJOR = 0
3
3
  MINOR = 5
4
- PATCH = 3
4
+ PATCH = 4
5
5
 
6
6
  VERSION = [MAJOR, MINOR, PATCH].join('.')
7
7
  end
data/spec/deliver_spec.rb CHANGED
@@ -2,212 +2,214 @@ require './lib/tuktuk/tuktuk'
2
2
  require 'rspec/mocks'
3
3
 
4
4
  describe 'deliver' do
5
-
5
+
6
6
  end
7
7
 
8
8
  describe 'deliver many' do
9
-
10
- before(:each) do
11
- @mock_smtp = mock('Net::SMTP')
12
- Net::SMTP.stub!(:new).and_return(@mock_smtp)
13
- end
14
-
15
- describe 'when no emails are passed' do
16
-
17
- it 'raises' do
18
- lambda do
19
- Tuktuk.deliver_many []
20
- end.should raise_error
21
- end
22
-
23
- end
24
-
25
- describe 'when one email contains multiple addresses' do
26
-
27
- it 'raises' do
28
- lambda do
29
- Tuktuk.deliver_many [ email, email(:to => 'one@user.com, two@user.com')]
30
- end.should raise_error
31
- end
32
-
33
- end
34
-
35
- describe 'when emails are valid' do
36
-
37
- it 'groups them by domain' do
38
-
39
- end
40
-
41
- describe 'and max_workers is 0' do
42
-
43
- it 'does not start any threads' do
44
-
45
- end
46
-
47
- end
48
-
49
- describe 'and max_workers is >0' do
50
-
51
- it 'does not spawn any more threads than the max allowed' do
52
-
53
- end
54
-
55
- end
56
-
57
- describe 'and max workers is auto' do
58
-
59
- it 'spawns a new thread for each domain' do
60
-
61
- end
62
-
63
- end
64
-
65
- describe 'when delivering to domain' do
66
-
67
- before do
68
- @mock_smtp.stub(:start).and_yield('foo')
69
- @emails = [email, email, email]
70
-
71
- @success = mock('Net::SMTP::Response')
72
- @soft_email_bounce = Tuktuk::SoftBounce.new('503 Sender already specified')
73
- @hard_email_bounce = Tuktuk::HardBounce.new('505 Mailbox not found')
74
- @soft_server_bounce = Tuktuk::SoftBounce.new('Be back in a sec')
75
- @hard_server_bounce = Tuktuk::HardBounce.new('No MX records found.')
76
- end
77
-
78
- describe 'when domain exists' do
79
-
80
- before do
81
- @domain = 'domain.com'
82
- end
83
-
84
- describe 'and has valid MX servers' do
85
-
86
- before do
87
- @servers = ['mx1.domain.com', 'mx2.domain.com', 'mx3.domain.com']
88
- Tuktuk.stub(:smtp_servers_for_domain).and_return(@servers)
89
- end
90
-
91
- it 'starts by delivering to first one' do
92
- Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', [1]).and_return([[1,'ok']])
93
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', [1])
94
- end
95
-
96
- describe 'and first server processes all our mail' do
97
-
98
- describe 'and all mail goes through' do
99
-
100
- before do
101
- @responses = []
102
- @emails.each { |e| @responses.push [e, @success] }
103
- end
104
-
105
- it 'does not try to connect to second server' do
106
- Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return(@responses)
107
- Tuktuk.should_not_receive(:send_many_now).with('mx2.domain.com')
108
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
109
- end
110
-
111
- end
112
-
113
- describe 'and all emails were hard failures (bounces)' do
114
-
115
- before do
116
- @responses = []
117
- @emails.each { |e| @responses.push [e, @hard_email_bounce] }
118
- end
119
-
120
- it 'does not try to connect to second server' do
121
- Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return(@responses)
122
- Tuktuk.should_not_receive(:send_many_now).with('mx2.domain.com')
123
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
124
- end
125
-
126
- end
127
-
128
- end
129
-
130
- describe 'and first server is down' do
131
-
132
- before do
133
- @responses = []
134
- @emails.each { |e| @responses.push [e, @success] }
135
- end
136
-
137
- it 'does not raise error' do
138
- Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_raise('Unable to connect.')
139
- lambda do
140
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
141
- end.should_not raise_error(RuntimeError)
142
- end
143
-
144
- it 'returns empty responses' do
145
- Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_raise('Unable to connect.')
146
- responses = Tuktuk.send(:send_many_now, 'mx1.domain.com', @emails)
147
- responses.should be_empty
148
- end
149
-
150
- it 'tries to connect to second server' do
151
- Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return([])
152
- Tuktuk.should_receive(:send_many_now).once.with('mx2.domain.com', @emails).and_return(@responses)
153
- Tuktuk.should_not_receive(:send_many_now).with('mx3.domain.com')
154
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
155
- end
156
-
157
- end
158
-
159
- describe 'and first server receives only one email' do
160
-
161
- before do
162
- @first = [@emails[0], @success]
163
- @last_two = [[@emails[1], @success], [@emails[2], @soft_email_bounce]]
164
- end
165
-
166
- it 'does not try to send that same email to second server' do
167
- Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return([@first])
168
- last_two_emails = @emails.last(2)
169
- last_two_emails.include?(@emails.first).should be_false
170
- Tuktuk.should_receive(:send_many_now).once.with('mx2.domain.com', last_two_emails).and_return(@last_two)
171
- Tuktuk.should_not_receive(:send_many_now).with('mx3.domain.com')
172
- Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
173
- end
174
-
175
- describe 'and other servers are down' do
176
-
177
- before do
178
- # TODO: for some reason the :init_connection on line 138 is affecting this
179
- # this test should pass when running on its own
180
- # Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_return(@mock_smtp)
181
- # Tuktuk.should_receive(:init_connection).once.with('mx2.domain.com').and_raise('Unable to connect.')
182
- # Tuktuk.should_receive(:init_connection).once.with('mx3.domain.com').and_raise('Unable to connect.')
183
- end
184
-
185
- it 'should not mark first email as bounced' do
186
- Tuktuk.should_receive(:send_many_now).and_return([@first], [], [])
187
- responses = Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
188
- responses[1][0].should be_a(Tuktuk::Bounce) if responses[1]
189
- responses[0][0].should_not be_a(Tuktuk::Bounce)
190
- end
191
-
192
- end
193
-
194
- end
195
-
196
- end
197
-
198
- end
199
-
200
- end
201
-
202
- end
203
-
204
- def email(attrs = {})
205
- {
206
- :to => "user#{rand(1000)}@domain.com",
207
- :from => 'me@company.com',
208
- :subject => 'Test email',
209
- :body => 'Hello world.'
210
- }.merge(attrs)
211
- end
212
-
213
- end
9
+
10
+ before(:each) do
11
+ @mock_smtp = double('Net::SMTP')
12
+ Net::SMTP.stub(:new).and_return(@mock_smtp)
13
+ end
14
+
15
+ describe 'when no emails are passed' do
16
+
17
+ it 'raises' do
18
+ lambda do
19
+ Tuktuk.deliver_many []
20
+ end.should raise_error
21
+ end
22
+
23
+ end
24
+
25
+ describe 'when one email contains multiple addresses' do
26
+
27
+ it 'raises' do
28
+ lambda do
29
+ Tuktuk.deliver_many [ email, email(:to => 'one@user.com, two@user.com')]
30
+ end.should raise_error
31
+ end
32
+
33
+ end
34
+
35
+ describe 'when emails are valid' do
36
+
37
+ it 'groups them by domain' do
38
+
39
+ end
40
+
41
+ describe 'and max_workers is 0' do
42
+
43
+ it 'does not start any threads' do
44
+
45
+ end
46
+
47
+ end
48
+
49
+ describe 'and max_workers is >0' do
50
+
51
+ it 'does not spawn any more threads than the max allowed' do
52
+
53
+ end
54
+
55
+ end
56
+
57
+ describe 'and max workers is auto' do
58
+
59
+ it 'spawns a new thread for each domain' do
60
+
61
+ end
62
+
63
+ end
64
+
65
+ describe 'when delivering to domain' do
66
+
67
+ before do
68
+ @mock_smtp.stub(:start).and_yield('foo')
69
+ @emails = [email, email, email]
70
+
71
+ @success = double('Net::SMTP::Response')
72
+ @soft_email_bounce = Tuktuk::SoftBounce.new('503 Sender already specified')
73
+ @hard_email_bounce = Tuktuk::HardBounce.new('505 Mailbox not found')
74
+ @soft_server_bounce = Tuktuk::SoftBounce.new('Be back in a sec')
75
+ @hard_server_bounce = Tuktuk::HardBounce.new('No MX records found.')
76
+ end
77
+
78
+ describe 'when domain exists' do
79
+
80
+ before do
81
+ @domain = 'domain.com'
82
+ end
83
+
84
+ describe 'and has valid MX servers' do
85
+
86
+ before do
87
+ @servers = ['mx1.domain.com', 'mx2.domain.com', 'mx3.domain.com']
88
+ Tuktuk.stub(:smtp_servers_for_domain).and_return(@servers)
89
+ end
90
+
91
+ it 'starts by delivering to first one' do
92
+ Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', [1]).and_return([[1,'ok']])
93
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', [1])
94
+ end
95
+
96
+ describe 'and first server processes all our mail' do
97
+
98
+ describe 'and all mail goes through' do
99
+
100
+ before do
101
+ @responses = []
102
+ @emails.each { |e| @responses.push [e, @success] }
103
+ end
104
+
105
+ it 'does not try to connect to second server' do
106
+ Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return(@responses)
107
+ Tuktuk.should_not_receive(:send_many_now).with('mx2.domain.com')
108
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
109
+ end
110
+
111
+ end
112
+
113
+ describe 'and all emails were hard failures (bounces)' do
114
+
115
+ before do
116
+ @responses = []
117
+ @emails.each { |e| @responses.push [e, @hard_email_bounce] }
118
+ end
119
+
120
+ it 'does not try to connect to second server' do
121
+ Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return(@responses)
122
+ Tuktuk.should_not_receive(:send_many_now).with('mx2.domain.com')
123
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
124
+ end
125
+
126
+ end
127
+
128
+ end
129
+
130
+ describe 'and first server is down' do
131
+
132
+ before do
133
+ @responses = []
134
+ @emails.each { |e| @responses.push [e, @success] }
135
+ end
136
+
137
+ it 'does not raise error' do
138
+ Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_raise('Unable to connect.')
139
+ Tuktuk.should_receive(:init_connection).once.with('mx2.domain.com').and_raise('Unable to connect.')
140
+ Tuktuk.should_receive(:init_connection).once.with('mx3.domain.com').and_raise('Unable to connect.')
141
+ # Tuktuk.should_receive(:init_connection).once.and_raise('Unable to connect.')
142
+ expect do
143
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
144
+ end.not_to raise_error # (RuntimeError)
145
+ end
146
+
147
+ it 'returns empty responses' do
148
+ Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_raise('Unable to connect.')
149
+ responses = Tuktuk.send(:send_many_now, 'mx1.domain.com', @emails)
150
+ responses.should be_empty
151
+ end
152
+
153
+ it 'tries to connect to second server' do
154
+ Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return([])
155
+ Tuktuk.should_receive(:send_many_now).once.with('mx2.domain.com', @emails).and_return(@responses)
156
+ Tuktuk.should_not_receive(:send_many_now).with('mx3.domain.com')
157
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
158
+ end
159
+
160
+ end
161
+
162
+ describe 'and first server receives only one email' do
163
+
164
+ before do
165
+ @first = [@emails[0], @success]
166
+ @last_two = [[@emails[1], @success], [@emails[2], @soft_email_bounce]]
167
+ end
168
+
169
+ it 'does not try to send that same email to second server' do
170
+ Tuktuk.should_receive(:send_many_now).once.with('mx1.domain.com', @emails).and_return([@first])
171
+ last_two_emails = @emails.last(2)
172
+ last_two_emails.include?(@emails.first).should be_false
173
+ Tuktuk.should_receive(:send_many_now).once.with('mx2.domain.com', last_two_emails).and_return(@last_two)
174
+ Tuktuk.should_not_receive(:send_many_now).with('mx3.domain.com')
175
+ Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
176
+ end
177
+
178
+ describe 'and other servers are down' do
179
+
180
+ before do
181
+ # TODO: for some reason the :init_connection on line 138 is affecting this
182
+ # this test should pass when running on its own
183
+ # Tuktuk.should_receive(:init_connection).once.with('mx1.domain.com').and_return(@mock_smtp)
184
+ # Tuktuk.should_receive(:init_connection).once.with('mx2.domain.com').and_raise('Unable to connect.')
185
+ # Tuktuk.should_receive(:init_connection).once.with('mx3.domain.com').and_raise('Unable to connect.')
186
+ end
187
+
188
+ it 'should not mark first email as bounced' do
189
+ Tuktuk.should_receive(:send_many_now).and_return([@first], [], [])
190
+ responses = Tuktuk.send(:lookup_and_deliver_by_domain, 'domain.com', @emails)
191
+ responses[1][0].should be_a(Tuktuk::Bounce) if responses[1]
192
+ responses[0][0].should_not be_a(Tuktuk::Bounce)
193
+ end
194
+
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
201
+ end
202
+
203
+ end
204
+
205
+ end
206
+
207
+ def email(attrs = {})
208
+ { :to => "user#{rand(1000)}@domain.com",
209
+ :from => 'me@company.com',
210
+ :subject => 'Test email',
211
+ :body => 'Hello world.'
212
+ }.merge(attrs)
213
+ end
214
+
215
+ end
metadata CHANGED
@@ -1,92 +1,101 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tuktuk
3
- version: !ruby/object:Gem::Version
4
- version: 0.5.3
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 5
8
+ - 4
9
+ version: 0.5.4
5
10
  platform: ruby
6
- authors:
7
- - Tomás Pollak
11
+ authors:
12
+ - "Tom\xC3\xA1s Pollak"
8
13
  autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
- date: 2013-08-06 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2015-04-08 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
14
21
  name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - '>='
18
- - !ruby/object:Gem::Version
19
- version: 1.0.0
20
- type: :development
21
22
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - '>='
25
- - !ruby/object:Gem::Version
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 0
30
+ - 0
26
31
  version: 1.0.0
27
- - !ruby/object:Gem::Dependency
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
28
35
  name: net-dns
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '='
32
- - !ruby/object:Gem::Version
33
- version: 0.6.1
34
- type: :runtime
35
36
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '='
39
- - !ruby/object:Gem::Version
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ - 6
44
+ - 1
40
45
  version: 0.6.1
41
- - !ruby/object:Gem::Dependency
42
- name: mail
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ~>
46
- - !ruby/object:Gem::Version
47
- version: '2.3'
48
46
  type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: mail
49
50
  prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
52
53
  - - ~>
53
- - !ruby/object:Gem::Version
54
- version: '2.3'
55
- - !ruby/object:Gem::Dependency
56
- name: dkim
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 0.0.2
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 2
57
+ - 3
58
+ version: "2.3"
62
59
  type: :runtime
60
+ version_requirements: *id003
61
+ - !ruby/object:Gem::Dependency
62
+ name: dkim
63
63
  prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
64
+ requirement: &id004 !ruby/object:Gem::Requirement
65
+ requirements:
66
66
  - - ~>
67
- - !ruby/object:Gem::Version
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ - 0
71
+ - 2
68
72
  version: 0.0.2
69
- - !ruby/object:Gem::Dependency
70
- name: work_queue
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- version: 2.5.0
76
73
  type: :runtime
74
+ version_requirements: *id004
75
+ - !ruby/object:Gem::Dependency
76
+ name: work_queue
77
77
  prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
78
+ requirement: &id005 !ruby/object:Gem::Requirement
79
+ requirements:
80
80
  - - ~>
81
- - !ruby/object:Gem::Version
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 2
84
+ - 5
85
+ - 0
82
86
  version: 2.5.0
87
+ type: :runtime
88
+ version_requirements: *id005
83
89
  description: Easy way of sending DKIM-signed emails from Ruby, no dependencies needed.
84
- email:
90
+ email:
85
91
  - tomas@forkhq.com
86
92
  executables: []
93
+
87
94
  extensions: []
95
+
88
96
  extra_rdoc_files: []
89
- files:
97
+
98
+ files:
90
99
  - .gitignore
91
100
  - Gemfile
92
101
  - README.md
@@ -101,27 +110,37 @@ files:
101
110
  - lib/tuktuk/version.rb
102
111
  - spec/deliver_spec.rb
103
112
  - tuktuk.gemspec
113
+ has_rdoc: true
104
114
  homepage: https://github.com/tomas/tuktuk
105
115
  licenses: []
106
- metadata: {}
116
+
107
117
  post_install_message:
108
118
  rdoc_options: []
109
- require_paths:
119
+
120
+ require_paths:
110
121
  - lib
111
- required_ruby_version: !ruby/object:Gem::Requirement
112
- requirements:
113
- - - '>='
114
- - !ruby/object:Gem::Version
115
- version: '0'
116
- required_rubygems_version: !ruby/object:Gem::Requirement
117
- requirements:
118
- - - '>='
119
- - !ruby/object:Gem::Version
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ segments:
127
+ - 0
128
+ version: "0"
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ segments:
134
+ - 1
135
+ - 3
136
+ - 6
120
137
  version: 1.3.6
121
138
  requirements: []
139
+
122
140
  rubyforge_project: tuktuk
123
- rubygems_version: 2.0.2
141
+ rubygems_version: 1.3.6
124
142
  signing_key:
125
- specification_version: 4
143
+ specification_version: 3
126
144
  summary: SMTP client for Ruby with DKIM support.
127
145
  test_files: []
146
+
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 2d959f61646d7f24739699b467abdd6d3b11a1aa
4
- data.tar.gz: 1fd5e0c66ee7aabd178810a0877964913898d5eb
5
- SHA512:
6
- metadata.gz: c5a744fbeab5b4a3316b822d898052c151f495193918ecc029505ff1fd71c53ba3fc55619a9f74f05ed179f8fec89d62303c80c627fb59b80a554d7f5c02c93b
7
- data.tar.gz: f705920b165a4b872003373dc838000a05f5704879515211e2160aaa339c194c76a35b5c187006d78e499f2586679b4e3c2da7b3bfa42d85020df2550aec6b53