deliverable 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 789cda6bdfbcd5cbd6f552775c78227c1901fba7c7f792e97e9d87f1f0f0411e
4
- data.tar.gz: 5d63aee7ce38ad7b098022909a025d688624eef3bfec1f7418085086eac2eb9b
3
+ metadata.gz: e68d3c1f29cb9fac64f7185d0b4026f6d8f9bcf5a6e55d9e7d89b3b3ab126ae4
4
+ data.tar.gz: e6ca8b392fef7e5289586a2c774684e31b4330b23b2c20dea30571ed256331b5
5
5
  SHA512:
6
- metadata.gz: b1ec53c65f23b78024ef0b4ef4741f8cd55f57f3ab85405ae1376fcb6988220985a1655bcf36ca18996bcfa8e30f63048d6b2a010a9149cc19e8047a0a2a900d
7
- data.tar.gz: e663054eba78bfe71a4638e1e07bd098e17850d32d2de5cdebe96bad7721f897c5bcbc05976126a54ed46d52e0d7f0e74baa6e6f7be821f15d19483492faeb98
6
+ metadata.gz: 72cc381a74af672304ae18c4d5523dd85ed5174e33638a4958f709da2cbe9f5fd3dc34defa2ce02842a59c11e3c3862e8ddaeb15dba4f587d5bd0911a2337b3c
7
+ data.tar.gz: d710009b9129b3dfc8014bebc374edf586ea3c3ce0aa0ae1390fa14f8fb274022bbeac79f6e14cd4d660dd139649918ee1eab93c7749add82c204361182a1eab
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.1
4
+
5
+ - Fix: the catch-all probe was overwriting `smtp_response` and
6
+ `retryable` on the Result. A verification that returned a clean 250
7
+ for the real address could surface a 550 from the fake address used
8
+ to detect accept-all servers, making it look like the verifier had
9
+ ignored a hard bounce. The catch-all probe now runs silently and
10
+ only the real address's SMTP response is reported.
11
+
3
12
  ## 0.2.0
4
13
 
5
14
  - Add `smtp_response` to the result: the SMTP code and message returned by
@@ -222,7 +222,7 @@ module Deliverable
222
222
  problematic_server?(mail_server) ? :assumed : (last || :assumed)
223
223
  end
224
224
 
225
- def attempt_rcpt(mail_server, port, recipient)
225
+ def attempt_rcpt(mail_server, port, recipient, record: true)
226
226
  Timeout.timeout(@timeout) do
227
227
  smtp = Net::SMTP.new(mail_server, port)
228
228
  smtp.enable_starttls_auto if port == 587 || port == 465
@@ -231,47 +231,47 @@ module Deliverable
231
231
  conn.mailfrom(@sender_email)
232
232
  begin
233
233
  response = conn.rcptto(recipient)
234
- record_response(response.status, response.message) if response.respond_to?(:status)
234
+ record_response(response.status, response.message) if record && response.respond_to?(:status)
235
235
  return :verified
236
236
  rescue Net::SMTPFatalError => e
237
- record_error(e)
238
- classify_fatal(e.message)
237
+ record_error(e) if record
238
+ classify_fatal(e.message, record: record)
239
239
  rescue Net::SMTPServerBusy => e
240
- record_error(e, retryable: true)
240
+ record_error(e, retryable: true) if record
241
241
  return :assumed
242
242
  rescue Net::SMTPSyntaxError, Net::SMTPAuthenticationError => e
243
- record_error(e)
243
+ record_error(e) if record
244
244
  return :assumed
245
245
  end
246
246
  end
247
247
  end
248
248
  rescue Timeout::Error => e
249
- record_transient(e.message)
249
+ record_transient(e.message) if record
250
250
  :connection_failed
251
251
  rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
252
- record_transient(e.message)
252
+ record_transient(e.message) if record
253
253
  :connection_failed
254
254
  rescue Net::SMTPAuthenticationError => e
255
- record_error(e)
255
+ record_error(e) if record
256
256
  :assumed
257
257
  rescue Net::SMTPServerBusy => e
258
- record_error(e, retryable: true)
258
+ record_error(e, retryable: true) if record
259
259
  :assumed
260
260
  rescue StandardError => e
261
261
  log "SMTP probe failed for #{recipient} on #{mail_server}:#{port}: #{e.message}"
262
262
  :connection_failed
263
263
  end
264
264
 
265
- def classify_fatal(message)
265
+ def classify_fatal(message, record: true)
266
266
  code = extract_code(message)
267
267
  case code&.[](0)
268
268
  when "5"
269
269
  :invalid
270
270
  when "4"
271
- @smtp_retryable = true
271
+ @smtp_retryable = true if record
272
272
  :assumed
273
273
  else
274
- if message.to_s.downcase.include?("temporary")
274
+ if record && message.to_s.downcase.include?("temporary")
275
275
  @smtp_retryable = true
276
276
  end
277
277
  :assumed
@@ -303,7 +303,7 @@ module Deliverable
303
303
 
304
304
  fake = "definitely-does-not-exist-#{rand(10**10)}@#{domain}"
305
305
  result = SMTP_PORTS.each do |port|
306
- outcome = attempt_rcpt(mail_server, port, fake)
306
+ outcome = attempt_rcpt(mail_server, port, fake, record: false)
307
307
  break :accepted if outcome == :verified
308
308
  break :rejected if outcome == :invalid
309
309
  end
@@ -1,3 +1,3 @@
1
1
  module Deliverable
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deliverable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Strömberg
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2026-05-11 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: valid_email2
@@ -84,7 +83,6 @@ metadata:
84
83
  homepage_uri: https://github.com/peopledb/deliverable
85
84
  source_code_uri: https://github.com/peopledb/deliverable
86
85
  changelog_uri: https://github.com/peopledb/deliverable/blob/main/CHANGELOG.md
87
- post_install_message:
88
86
  rdoc_options: []
89
87
  require_paths:
90
88
  - lib
@@ -99,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
97
  - !ruby/object:Gem::Version
100
98
  version: '0'
101
99
  requirements: []
102
- rubygems_version: 3.5.11
103
- signing_key:
100
+ rubygems_version: 3.7.2
104
101
  specification_version: 4
105
102
  summary: 'Honest email verification: syntax, MX, SMTP RCPT, and catch-all detection.'
106
103
  test_files: []