zerobounce-sdk 2.1.7 → 2.2.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +146 -19
  3. data/README.md +472 -410
  4. data/lib/zerobounce/api_urls.rb +9 -0
  5. data/lib/zerobounce/base_request.rb +208 -8
  6. data/lib/zerobounce/client.rb +22 -0
  7. data/lib/zerobounce/configuration.rb +24 -3
  8. data/lib/zerobounce/error.rb +18 -0
  9. data/lib/zerobounce/get_file_helper.rb +3 -7
  10. data/lib/zerobounce/mock_request.rb +31 -12
  11. data/lib/zerobounce/priority3.rb +331 -0
  12. data/lib/zerobounce/request.rb +77 -38
  13. data/lib/zerobounce/response_error.rb +117 -0
  14. data/lib/zerobounce/validate_sub_status.rb +1 -0
  15. data/lib/zerobounce/version.rb +1 -1
  16. data/lib/zerobounce/warmup.rb +467 -0
  17. data/lib/zerobounce.rb +101 -14
  18. metadata +8 -33
  19. data/.dockerignore +0 -17
  20. data/.env.example +0 -3
  21. data/.github/auto_assign.yml +0 -5
  22. data/.github/dependabot.yml +0 -35
  23. data/.github/workflows/auto_assign_ci.yaml +0 -21
  24. data/.github/workflows/codeql.yml +0 -105
  25. data/.github/workflows/publish.yml +0 -131
  26. data/.github/workflows/sdk_ci.yml +0 -29
  27. data/.gitignore +0 -70
  28. data/.rspec +0 -2
  29. data/.ruby-version +0 -1
  30. data/CODE_OF_CONDUCT.md +0 -69
  31. data/CONTRIBUTING.md +0 -112
  32. data/Dockerfile +0 -17
  33. data/Gemfile +0 -13
  34. data/Gemfile.lock +0 -135
  35. data/Rakefile +0 -26
  36. data/SECURITY.md +0 -21
  37. data/bin/bundle +0 -105
  38. data/bin/console +0 -7
  39. data/bin/setup +0 -6
  40. data/data/zerobounce-ai-scoring.csv +0 -31
  41. data/data/zerobounce-batch-validation.csv +0 -31
  42. data/documentation.md +0 -530
  43. data/files/scoring.csv +0 -1
  44. data/files/validation.csv +0 -1
  45. data/files/zerobounce-ai-scoring.csv +0 -31
  46. data/files/zerobounce-batch-validation.csv +0 -31
  47. data/zerobounce.gemspec +0 -49
data/documentation.md DELETED
@@ -1,530 +0,0 @@
1
- #### Usage
2
- Add this line to your application's Gemfile:
3
- ```ruby
4
- gem 'zerobounce-sdk'
5
- ```
6
-
7
- And then execute:
8
- ```bash
9
- $bundle
10
- ```
11
-
12
- Or install it yourself as:
13
- ```bash
14
- $gem install zerobounce-sdk
15
- ```
16
-
17
- Import
18
- ```ruby
19
- require 'zerobounce'
20
- ```
21
-
22
- Set a valid ZeroBounce API key.
23
- ```ruby
24
- Zerobounce.configure do |config|
25
- config.apikey = '<zerobounce-api-key>'
26
- ...
27
- end
28
- ```
29
- or
30
- ```
31
- Zerobounce.config.apikey = '<zerobounce-api-key>'
32
- ...
33
- ```
34
-
35
- Credits
36
- ```ruby
37
- Zerobounce.credits
38
- => 79 ### returns -1 for invalid key
39
- ```
40
-
41
- Activity
42
- ```ruby
43
- Zerobounce.activity('ss@gmail.com')
44
- => {"found"=>true, "active_in_days"=>"180"}
45
- ```
46
-
47
- Usage statistics
48
- ```ruby
49
- Zerobounce.api_usage(Date.today, Date.today)
50
- =>
51
- {"total"=>0,
52
- "status_valid"=>0,
53
- "status_invalid"=>0,
54
- "status_catch_all"=>0,
55
- "status_do_not_mail"=>0,
56
- "status_spamtrap"=>0,
57
- "status_unknown"=>0,
58
- "sub_status_toxic"=>0,
59
- "sub_status_disposable"=>0,
60
- "sub_status_role_based"=>0,
61
- "sub_status_possible_trap"=>0,
62
- "sub_status_global_suppression"=>0,
63
- "sub_status_timeout_exceeded"=>0,
64
- "sub_status_mail_server_temporary_error"=>0,
65
- "sub_status_mail_server_did_not_respond"=>0,
66
- "sub_status_greylisted"=>0,
67
- "sub_status_antispam_system"=>0,
68
- "sub_status_does_not_accept_mail"=>0,
69
- "sub_status_exception_occurred"=>0,
70
- "sub_status_failed_syntax_check"=>0,
71
- "sub_status_mailbox_not_found"=>0,
72
- "sub_status_unroutable_ip_address"=>0,
73
- "sub_status_possible_typo"=>0,
74
- "sub_status_no_dns_entries"=>0,
75
- "sub_status_role_based_catch_all"=>0,
76
- "sub_status_mailbox_quota_exceeded"=>0,
77
- "sub_status_forcible_disconnect"=>0,
78
- "sub_status_failed_smtp_connection"=>0,
79
- "sub_status_accept_all"=>0,
80
- "sub_status_mx_forward"=>0,
81
- "sub_status_alternate"=>0,
82
- "sub_status_allowed"=>0,
83
- "sub_status_blocked"=>0,
84
- "sub_status_gold"=>0,
85
- "sub_status_role_based_accept_all"=>0,
86
- "start_date"=>"4/28/2023",
87
- "end_date"=>"4/28/2023"}
88
- ```
89
-
90
- ##### Email Validation
91
-
92
- Validate single eMail
93
- ```ruby
94
- Zerobounce.validate('valid@example.com')
95
- ### Zerobounce.validate('valid@example.com', '192.168.0.1') # optional IP address
96
- =>
97
- {"address"=>"valid@example.com",
98
- "status"=>"valid",
99
- "sub_status"=>"",
100
- "free_email"=>false,
101
- "did_you_mean"=>nil,
102
- "account"=>nil,
103
- "domain"=>nil,
104
- "domain_age_days"=>"9692",
105
- "smtp_provider"=>"example",
106
- "mx_found"=>"true",
107
- "mx_record"=>"mx.example.com",
108
- "firstname"=>"zero",
109
- "lastname"=>"bounce",
110
- "gender"=>"male",
111
- "country"=>nil,
112
- "region"=>nil,
113
- "city"=>nil,
114
- "zipcode"=>nil,
115
- "processed_at"=>"2023-04-28 15:18:45.631"}
116
- ```
117
-
118
- Validate batch
119
- ```ruby
120
- emails
121
- =>
122
- ["disposable@example.com",
123
- "invalid@example.com",
124
- "valid@example.com",
125
- "toxic@example.com",
126
- "donotmail@example.com",
127
- "spamtrap@example.com"]
128
-
129
- ### ip_addresses
130
- => ["192.168.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1", "192.168.0.1"]
131
- ### Zerobounce.validate_batch(emails, ip_addresses) # optional ip_addresses parameter
132
-
133
- Zerobounce.validate_batch(emails)
134
- =>
135
- [{"address"=>"disposable@example.com",
136
- "status"=>"do_not_mail",
137
- "sub_status"=>"disposable",
138
- "free_email"=>false,
139
- "did_you_mean"=>nil,
140
- "account"=>nil,
141
- "domain"=>nil,
142
- "domain_age_days"=>"9692",
143
- "smtp_provider"=>"example",
144
- "mx_found"=>"true",
145
- "mx_record"=>"mx.example.com",
146
- "firstname"=>"zero",
147
- "lastname"=>"bounce",
148
- "gender"=>"male",
149
- "country"=>nil,
150
- "region"=>nil,
151
- "city"=>nil,
152
- "zipcode"=>nil,
153
- "processed_at"=>"2023-04-28 15:21:44.340"},
154
- {"address"=>"invalid@example.com",
155
- "status"=>"invalid",
156
- "sub_status"=>"mailbox_not_found",
157
- "free_email"=>false,
158
- "did_you_mean"=>nil,
159
- "account"=>nil,
160
- "domain"=>nil,
161
- "domain_age_days"=>"9692",
162
- "smtp_provider"=>"example",
163
- "mx_found"=>"true",
164
- "mx_record"=>"mx.example.com",
165
- "firstname"=>"zero",
166
- "lastname"=>"bounce",
167
- "gender"=>"male",
168
- "country"=>nil,
169
- "region"=>nil,
170
- "city"=>nil,
171
- "zipcode"=>nil,
172
- "processed_at"=>"2023-04-28 15:21:44.340"},
173
- {"address"=>"valid@example.com",
174
- "status"=>"valid",
175
- "sub_status"=>"",
176
- "free_email"=>false,
177
- "did_you_mean"=>nil,
178
- "account"=>nil,
179
- "domain"=>nil,
180
- "domain_age_days"=>"9692",
181
- "smtp_provider"=>"example",
182
- "mx_found"=>"true",
183
- "mx_record"=>"mx.example.com",
184
- "firstname"=>"zero",
185
- "lastname"=>"bounce",
186
- "gender"=>"male",
187
- "country"=>nil,
188
- "region"=>nil,
189
- "city"=>nil,
190
- "zipcode"=>nil,
191
- "processed_at"=>"2023-04-28 15:21:44.340"},
192
- {"address"=>"toxic@example.com",
193
- "status"=>"do_not_mail",
194
- "sub_status"=>"toxic",
195
- "free_email"=>false,
196
- "did_you_mean"=>nil,
197
- "account"=>nil,
198
- "domain"=>nil,
199
- "domain_age_days"=>"9692",
200
- "smtp_provider"=>"example",
201
- "mx_found"=>"true",
202
- "mx_record"=>"mx.example.com",
203
- "firstname"=>"zero",
204
- "lastname"=>"bounce",
205
- "gender"=>"male",
206
- "country"=>nil,
207
- "region"=>nil,
208
- "city"=>nil,
209
- "zipcode"=>nil,
210
- "processed_at"=>"2023-04-28 15:21:44.340"},
211
- {"address"=>"donotmail@example.com",
212
- "status"=>"do_not_mail",
213
- "sub_status"=>"role_based",
214
- "free_email"=>false,
215
- "did_you_mean"=>nil,
216
- "account"=>nil,
217
- "domain"=>nil,
218
- "domain_age_days"=>"9692",
219
- "smtp_provider"=>"example",
220
- "mx_found"=>"true",
221
- "mx_record"=>"mx.example.com",
222
- "firstname"=>"zero",
223
- "lastname"=>"bounce",
224
- "gender"=>"male",
225
- "country"=>nil,
226
- "region"=>nil,
227
- "city"=>nil,
228
- "zipcode"=>nil,
229
- "processed_at"=>"2023-04-28 15:21:44.340"},
230
- {"address"=>"spamtrap@example.com",
231
- "status"=>"spamtrap",
232
- "sub_status"=>"",
233
- "free_email"=>false,
234
- "did_you_mean"=>nil,
235
- "account"=>nil,
236
- "domain"=>nil,
237
- "domain_age_days"=>"9692",
238
- "smtp_provider"=>"example",
239
- "mx_found"=>"true",
240
- "mx_record"=>"mx.example.com",
241
- "firstname"=>"zero",
242
- "lastname"=>"bounce",
243
- "gender"=>"male",
244
- "country"=>nil,
245
- "region"=>nil,
246
- "city"=>nil,
247
- "zipcode"=>nil,
248
- "processed_at"=>"2023-04-28 15:21:44.340"}]
249
- ```
250
-
251
- ###### Batch File Validation
252
-
253
- Send file
254
- ```ruby
255
- ### sample file can be found in the files folder of this repository
256
- validate_file_path = File.join(Dir.pwd, 'files', 'validation.csv')
257
- => "/home/zb/wrappers/ruby-test/files/validation.csv"
258
- Zerobounce.validate_file_send(validate_file_path)
259
- =>
260
- {"success"=>true,
261
- "message"=>"File Accepted",
262
- "file_name"=>"validation.csv",
263
- "file_id"=>"75d854a6-565c-49f9-b4c8-b3344480ec4c"}
264
- ### file_id will be required for next steps
265
- ### optional named parameters:
266
- email_address_column: 1,
267
- first_name_column: 2,
268
- last_name_column: 3,
269
- gender_column: 4,
270
- has_header_row: true,
271
- return_url: nil, ### results callback url
272
- allow_phase_2: true ### optional; validation bulk sendfile only (omit or nil to skip)
273
- ### Zerobounce.validate_file_send(validate_file_path, email_address_column: 1, gender_column: 4)
274
- ```
275
-
276
- Bulk validation uses `https://bulkapi.zerobounce.net/v2`. See [v2 send file](https://www.zerobounce.net/docs/email-validation-api-quickstart/v2-send-file), [v2 file status](https://www.zerobounce.net/docs/email-validation-api-quickstart/v2-file-status), and [v2 get file](https://www.zerobounce.net/docs/email-validation-api-quickstart/v2-get-file).
277
-
278
- Check file
279
- ```ruby
280
- file_id = "75d854a6-565c-49f9-b4c8-b3344480ec4c"
281
- => "75d854a6-565c-49f9-b4c8-b3344480ec4c"
282
- Zerobounce.validate_file_check(file_id)
283
- =>
284
- {"success"=>true,
285
- "file_id"=>"75d854a6-565c-49f9-b4c8-b3344480ec4c",
286
- "file_name"=>"validation.csv",
287
- "upload_date"=>"2023-04-28T15:25:41Z",
288
- "file_status"=>"Greylisted",
289
- "complete_percentage"=>"0%",
290
- "file_phase_2_status"=>"N/A", ### when present (validation bulk v2)
291
- "error_reason"=>nil,
292
- "return_url"=>nil}
293
- ```
294
-
295
- Get file
296
- ```ruby
297
- file_id = "75d854a6-565c-49f9-b4c8-b3344480ec4c"
298
- => "75d854a6-565c-49f9-b4c8-b3344480ec4c"
299
- Zerobounce.validate_file_get(file_id)
300
- => "\"email\",\"first\",\"last\",\"gender\",\"ip\",\"ZB Status\",\"ZB Sub Status\",\"ZB Account\",\"ZB Domain\",\"ZB First Name\",\"ZB Last Name\",\"ZB Gender\",\"ZB Free Email\",\"ZB MX Found\",\"ZB MX Record\",\"ZB SMTP Provider\",\"ZB Did You Mean\"\n\"disposable@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"disposable\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"invalid@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"mailbox_not_found\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"valid@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"valid\",\"\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"toxic@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"toxic\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"donotmail@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"role_based\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"spamtrap@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"spamtrap\",\"\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"abuse@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"abuse\",\"\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"unknown@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"mail_server_temporary_error\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"catch_all@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"catch-all\",\"\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"antispam_system@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"antispam_system\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"does_not_accept_mail@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"does_not_accept_mail\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"exception_occurred@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"exception_occurred\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"failed_smtp_connection@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"failed_smtp_connection\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"failed_syntax_check@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"failed_syntax_check\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"forcible_disconnect@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"forcible_disconnect\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"global_suppression@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"global_suppression\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"greylisted@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"greylisted\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"leading_period_removed@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"valid\",\"leading_period_removed\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"mail_server_did_not_respond@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"mail_server_did_not_respond\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"mail_server_temporary_error@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"mail_server_temporary_error\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"mailbox_quota_exceeded@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"mailbox_quota_exceeded\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"mailbox_not_found@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"mailbox_not_found\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"no_dns_entries@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"no_dns_entries\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"possible_trap@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"possible_trap\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"possible_typo@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"possible_typo\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"role_based@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"role_based\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"timeout_exceeded@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"unknown\",\"timeout_exceeded\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"unroutable_ip_address@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"invalid\",\"unroutable_ip_address\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"free_email@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"valid\",\"\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"True\",\"true\",\"mx.example.com\",\"example\",\"\"\n\"role_based_catch_all@example.com\",\"First\",\"Last\",\"male\",\"127.0.0.1\",\"do_not_mail\",\"role_based_catch_all\",\"\",\"\",\"zero\",\"bounce\",\"male\",\"False\",\"true\",\"mx.example.com\",\"example\",\"\"\n"
301
- ```
302
-
303
- Optional [v2 get file](https://www.zerobounce.net/docs/email-validation-api-quickstart/v2-get-file) query parameters: `Zerobounce::GetFileOptions` and `Zerobounce::DownloadType` (`PHASE_1`, `PHASE_2`, `COMBINED`). Use `activity_data` on the options for validation `validate_file_get` only. JSON error bodies (including some HTTP 200 responses) raise `RuntimeError`; use `Zerobounce.get_file_json_indicates_error?(body)` on a raw string if needed.
304
-
305
- ```ruby
306
- opts = Zerobounce::GetFileOptions.new(
307
- download_type: Zerobounce::DownloadType::COMBINED,
308
- activity_data: true
309
- )
310
- csv = Zerobounce.validate_file_get(file_id, opts)
311
- ```
312
-
313
- Delete file
314
- ```ruby
315
- file_id = "75d854a6-565c-49f9-b4c8-b3344480ec4c"
316
- => "75d854a6-565c-49f9-b4c8-b3344480ec4c"
317
- Zerobounce.validate_file_delete(file_id)
318
- =>
319
- {"success"=>true,
320
- "message"=>"File Deleted",
321
- "file_name"=>"validation.csv",
322
- "file_id"=>"75d854a6-565c-49f9-b4c8-b3344480ec4c"}
323
- ```
324
-
325
- ##### AI Scoring
326
-
327
- Send file
328
- ```ruby
329
- scoring_file_path = File.join(Dir.pwd, 'files', 'scoring.csv')
330
- => "/home/odin/zb/wrappers/ruby-test/files/scoring.csv"
331
- Zerobounce.scoring_file_send(scoring_file_path)
332
- =>
333
- {"success"=>true,
334
- "message"=>"File Accepted",
335
- "file_name"=>"scoring.csv",
336
- "file_id"=>"89fb7262-b845-4fa1-aa25-e486347ec64e"}
337
- ### file_id will be required for the next steps
338
- ### optional named parameters
339
- email_address_column: 1,
340
- has_header_row: true,
341
- return_url: nil ### results callback url
342
- ### Zerobounce.scoring_file_send(scoring_file_path, email_address_column: 1)
343
- ```
344
-
345
- File check
346
- ```ruby
347
- file_id = "89fb7262-b845-4fa1-aa25-e486347ec64e"
348
- => "89fb7262-b845-4fa1-aa25-e486347ec64e"
349
- Zerobounce.scoring_file_check(file_id)
350
- =>
351
- {"success"=>true,
352
- "file_id"=>"89fb7262-b845-4fa1-aa25-e486347ec64e",
353
- "file_name"=>"scoring.csv",
354
- "upload_date"=>"2023-04-28T16:57:18Z",
355
- "file_status"=>"Complete",
356
- "complete_percentage"=>"100% Complete.",
357
- "return_url"=>nil}
358
- ```
359
-
360
- Get file
361
- ```ruby
362
- file_id = "89fb7262-b845-4fa1-aa25-e486347ec64e"
363
- => "89fb7262-b845-4fa1-aa25-e486347ec64e"
364
- Zerobounce.scoring_file_get(file_id)
365
- => "\"email\",\"ZeroBounceQualityScore\"\r\n\"disposable@example.com\",\"0\"\r\n\"invalid@example.com\",\"10\"\r\n\"valid@example.com\",\"10\"\r\n\"toxic@example.com\",\"2\"\r\n\"donotmail@example.com\",\"0\"\r\n\"spamtrap@example.com\",\"0\"\r\n\"abuse@example.com\",\"10\"\r\n\"unknown@example.com\",\"10\"\r\n\"catch_all@example.com\",\"10\"\r\n\"antispam_system@example.com\",\"0\"\r\n\"does_not_accept_mail@example.com\",\"0\"\r\n\"exception_occurred@example.com\",\"0\"\r\n\"failed_smtp_connection@example.com\",\"0\"\r\n\"failed_syntax_check@example.com\",\"0\"\r\n\"forcible_disconnect@example.com\",\"0\"\r\n\"global_suppression@example.com\",\"0\"\r\n\"greylisted@example.com\",\"0\"\r\n\"leading_period_removed@example.com\",\"0\"\r\n\"mail_server_did_not_respond@example.com\",\"0\"\r\n\"mail_server_temporary_error@example.com\",\"0\"\r\n\"mailbox_quota_exceeded@example.com\",\"0\"\r\n\"mailbox_not_found@example.com\",\"0\"\r\n\"no_dns_entries@example.com\",\"0\"\r\n\"possible_trap@example.com\",\"0\"\r\n\"possible_typo@example.com\",\"0\"\r\n\"role_based@example.com\",\"0\"\r\n\"timeout_exceeded@example.com\",\"0\"\r\n\"unroutable_ip_address@example.com\",\"0\"\r\n\"free_email@example.com\",\"0\"\r\n\"role_based_catch_all@example.com\",\"0\""
366
- ### Optional second argument: GetFileOptions with download_type only (activity_data is not sent for scoring getfile)
367
- ```
368
-
369
- Delete file
370
- ```ruby
371
- file_id = "89fb7262-b845-4fa1-aa25-e486347ec64e"
372
- => "89fb7262-b845-4fa1-aa25-e486347ec64e"
373
- Zerobounce.scoring_file_delete(file_id)
374
- => {"success"=>false, "message"=>"File cannot be found."}
375
- ```
376
-
377
- ##### Email Finder
378
-
379
- Guess Format
380
- ```ruby
381
- Zerobounce.guessformat("zerobounce.net")
382
- =>
383
- {"email"=>"",
384
- "domain"=>"zerobounce.net",
385
- "format"=>"first.last",
386
- "status"=>"",
387
- "sub_status"=>"",
388
- "confidence"=>"high",
389
- "did_you_mean"=>"",
390
- "failure_reason"=>"",
391
- "other_domain_formats"=>
392
- [{"format"=>"first", "confidence"=>"high"},
393
- {"format"=>"last.first", "confidence"=>"high"},
394
- {"format"=>"lfirst", "confidence"=>"high"},
395
- {"format"=>"lastfirst", "confidence"=>"high"},
396
- {"format"=>"firstl", "confidence"=>"high"},
397
- {"format"=>"last", "confidence"=>"medium"},
398
- {"format"=>"first.middle.last", "confidence"=>"medium"},
399
- {"format"=>"first-last", "confidence"=>"medium"},
400
- {"format"=>"l.first", "confidence"=>"medium"},
401
- {"format"=>"f.last", "confidence"=>"medium"},
402
- {"format"=>"f-last", "confidence"=>"medium"},
403
- {"format"=>"first.l", "confidence"=>"medium"},
404
- {"format"=>"first-l", "confidence"=>"medium"},
405
- {"format"=>"firstlast", "confidence"=>"medium"},
406
- {"format"=>"first_l", "confidence"=>"medium"},
407
- {"format"=>"f_last", "confidence"=>"medium"},
408
- {"format"=>"last.f", "confidence"=>"medium"},
409
- {"format"=>"last-f", "confidence"=>"medium"},
410
- {"format"=>"last-first", "confidence"=>"medium"},
411
- {"format"=>"first_last", "confidence"=>"medium"},
412
- {"format"=>"last_f", "confidence"=>"medium"},
413
- {"format"=>"last_first", "confidence"=>"medium"},
414
- {"format"=>"flast", "confidence"=>"medium"},
415
- {"format"=>"lastf", "confidence"=>"medium"},
416
- {"format"=>"l-first", "confidence"=>"low"},
417
- {"format"=>"l_first", "confidence"=>"low"}]}
418
- # Zerobounce.guessformat("zerobounce.net", first_name: "John", middle_name: 'Deere', last_name: "Doe")
419
- ```
420
-
421
- Find Email Address
422
- ```ruby
423
- Zerobounce.find_email("John", domain: "zerobounce.net")
424
- =>
425
- {
426
- "email": "john@zerobounce.net",
427
- "email_confidence": "medium",
428
- "domain": "zerobounce.net",
429
- "company_name": "ZeroBounce",
430
- "did_you_mean": "",
431
- "failure_reason": ""
432
- }
433
-
434
- # With additional name information for better accuracy
435
- Zerobounce.find_email("John", domain: "zerobounce.net", middle_name: "Deere", last_name: "Doe")
436
- ```
437
-
438
- Find Domain Information
439
- ```ruby
440
- Zerobounce.find_domain(domain: "zerobounce.net")
441
- =>
442
- {
443
- "domain": "zerobounce.net",
444
- "company_name": "Hertza, LLC",
445
- "format": "first.last",
446
- "confidence": "high",
447
- "did_you_mean": "",
448
- "failure_reason": "",
449
- "other_domain_formats": [
450
- {"format": "first", "confidence": "high"},
451
- {"format": "last.first", "confidence": "high"},
452
- {"format": "lastfirst", "confidence": "high"},
453
- {"format": "firstl", "confidence": "high"},
454
- {"format": "lfirst", "confidence": "high"},
455
- {"format": "firstlast", "confidence": "high"},
456
- {"format": "last_middle_f", "confidence": "high"},
457
- {"format": "last", "confidence": "high"},
458
- {"format": "f.last", "confidence": "medium"},
459
- {"format": "last-f", "confidence": "medium"},
460
- {"format": "l.first", "confidence": "medium"},
461
- {"format": "last_f", "confidence": "medium"},
462
- {"format": "first.middle.last", "confidence": "medium"},
463
- {"format": "first-last", "confidence": "medium"},
464
- {"format": "last.f", "confidence": "medium"},
465
- {"format": "last_first", "confidence": "medium"},
466
- {"format": "f-last", "confidence": "medium"},
467
- {"format": "first.l", "confidence": "medium"},
468
- {"format": "first-l", "confidence": "medium"},
469
- {"format": "first_l", "confidence": "medium"},
470
- {"format": "first_last", "confidence": "medium"},
471
- {"format": "f_last", "confidence": "medium"},
472
- {"format": "last-first", "confidence": "medium"},
473
- {"format": "flast", "confidence": "medium"},
474
- {"format": "lastf", "confidence": "medium"},
475
- {"format": "l_first", "confidence": "medium"},
476
- {"format": "l-first", "confidence": "medium"},
477
- {"format": "first-middle-last", "confidence": "low"},
478
- {"format": "firstmlast", "confidence": "low"},
479
- {"format": "last.middle.first", "confidence": "low"},
480
- {"format": "last_middle_first", "confidence": "low"},
481
- {"format": "first_middle_last", "confidence": "low"},
482
- {"format": "last-middle-first", "confidence": "low"},
483
- {"format": "first-m-last", "confidence": "low"},
484
- {"format": "firstmiddlelast", "confidence": "low"},
485
- {"format": "last.m.first", "confidence": "low"},
486
- {"format": "lastmfirst", "confidence": "low"},
487
- {"format": "lastmiddlefirst", "confidence": "low"},
488
- {"format": "last_m_first", "confidence": "low"},
489
- {"format": "first.m.last", "confidence": "low"},
490
- {"format": "first_m_last", "confidence": "low"},
491
- {"format": "last-m-first", "confidence": "low"}
492
- ]
493
- }
494
- ```
495
-
496
-
497
- #### Development
498
-
499
- After checking out the repo run tests
500
- ```bash
501
- rspec --init ### if needed
502
- bundle exec rspec
503
- ```
504
-
505
- You should see an output like this
506
- ```bash
507
- Run options: include {:focus=>true}
508
- running live tests
509
- .....................................................
510
-
511
- Finished in 6.81 seconds (files took 0.40587 seconds to load)
512
- 53 examples, 0 failures
513
- ```
514
-
515
- ##### Test parameters
516
- The tests use the following environment parameters:
517
- - **TEST** {unit|live} – Influences whether mocked unit tests are run or the live server is used (credits may be used if you choose to do this).
518
- - **ZEROBOUNCE_API_KEY** – Your API key; used to make requests to the live server and in mock tests as the valid key sample (any value will work for mock tests).
519
-
520
- An invalid API key for error-handling tests is hardcoded in the spec; no env var is required.
521
-
522
- To set them:
523
- ```bash
524
- export ZEROBOUNCE_API_KEY=your_api_key_here
525
- export TEST=unit
526
- ```
527
-
528
- A .env.example file is provided.
529
-
530
- Mock tests were generated using webmock and vcr. This means that actual requests were made and recorded in the spec/cassettes with an (at the time) valid API key used for testing purposes. This key has been invalidated in the meantime, however it is provided in the .env.example file for the mock tests to work. If you do not wish to use this key for mocks, you can replace it with any value in the .yml files under spec/cassettes or delete all of them and rerun the tests so that vcr records them with a new key.
data/files/scoring.csv DELETED
@@ -1 +0,0 @@
1
- zerobounce-ai-scoring.csv
data/files/validation.csv DELETED
@@ -1 +0,0 @@
1
- zerobounce-batch-validation.csv
@@ -1,31 +0,0 @@
1
- email
2
- disposable@example.com
3
- invalid@example.com
4
- valid@example.com
5
- toxic@example.com
6
- donotmail@example.com
7
- spamtrap@example.com
8
- abuse@example.com
9
- unknown@example.com
10
- catch_all@example.com
11
- antispam_system@example.com
12
- does_not_accept_mail@example.com
13
- exception_occurred@example.com
14
- failed_smtp_connection@example.com
15
- failed_syntax_check@example.com
16
- forcible_disconnect@example.com
17
- global_suppression@example.com
18
- greylisted@example.com
19
- leading_period_removed@example.com
20
- mail_server_did_not_respond@example.com
21
- mail_server_temporary_error@example.com
22
- mailbox_quota_exceeded@example.com
23
- mailbox_not_found@example.com
24
- no_dns_entries@example.com
25
- possible_trap@example.com
26
- possible_typo@example.com
27
- role_based@example.com
28
- timeout_exceeded@example.com
29
- unroutable_ip_address@example.com
30
- free_email@example.com
31
- role_based_catch_all@example.com
@@ -1,31 +0,0 @@
1
- email,first,last,gender,ip
2
- disposable@example.com,First,Last,male,127.0.0.1
3
- invalid@example.com,First,Last,male,127.0.0.1
4
- valid@example.com,First,Last,male,127.0.0.1
5
- toxic@example.com,First,Last,male,127.0.0.1
6
- donotmail@example.com,First,Last,male,127.0.0.1
7
- spamtrap@example.com,First,Last,male,127.0.0.1
8
- abuse@example.com,First,Last,male,127.0.0.1
9
- unknown@example.com,First,Last,male,127.0.0.1
10
- catch_all@example.com,First,Last,male,127.0.0.1
11
- antispam_system@example.com,First,Last,male,127.0.0.1
12
- does_not_accept_mail@example.com,First,Last,male,127.0.0.1
13
- exception_occurred@example.com,First,Last,male,127.0.0.1
14
- failed_smtp_connection@example.com,First,Last,male,127.0.0.1
15
- failed_syntax_check@example.com,First,Last,male,127.0.0.1
16
- forcible_disconnect@example.com,First,Last,male,127.0.0.1
17
- global_suppression@example.com,First,Last,male,127.0.0.1
18
- greylisted@example.com,First,Last,male,127.0.0.1
19
- leading_period_removed@example.com,First,Last,male,127.0.0.1
20
- mail_server_did_not_respond@example.com,First,Last,male,127.0.0.1
21
- mail_server_temporary_error@example.com,First,Last,male,127.0.0.1
22
- mailbox_quota_exceeded@example.com,First,Last,male,127.0.0.1
23
- mailbox_not_found@example.com,First,Last,male,127.0.0.1
24
- no_dns_entries@example.com,First,Last,male,127.0.0.1
25
- possible_trap@example.com,First,Last,male,127.0.0.1
26
- possible_typo@example.com,First,Last,male,127.0.0.1
27
- role_based@example.com,First,Last,male,127.0.0.1
28
- timeout_exceeded@example.com,First,Last,male,127.0.0.1
29
- unroutable_ip_address@example.com,First,Last,male,127.0.0.1
30
- free_email@example.com,First,Last,male,127.0.0.1
31
- role_based_catch_all@example.com,First,Last,male,127.0.0.1
data/zerobounce.gemspec DELETED
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- lib = File.expand_path('lib', __dir__)
4
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'zerobounce/version'
6
-
7
- Gem::Specification.new do |spec| # rubocop:disable Metrics/BlockLength
8
- spec.name = 'zerobounce-sdk'
9
- spec.version = Zerobounce::VERSION
10
- spec.authors = ['Zero Bounce']
11
- spec.email = ['integrations@zerobounce.net']
12
-
13
- spec.summary = 'A Ruby client for Zerobounce.net.'
14
- spec.description = 'A Ruby client for Zerobounce.net.'
15
- spec.homepage = 'https://zerobounce.net'
16
- spec.license = 'MIT'
17
-
18
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
- f.match(%r{^(test|spec|features)/})
20
- end
21
- spec.bindir = 'exe'
22
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
- spec.require_paths = ['lib']
24
-
25
- spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
26
-
27
- spec.required_ruby_version = '>= 2.5'
28
-
29
- spec.add_dependency 'rest-client', '~>2.1'
30
- spec.add_dependency 'dotenv'
31
-
32
- spec.add_development_dependency 'base64' # stdlib gem on Ruby 3.4+
33
- spec.add_development_dependency 'bigdecimal' # required by crack (webmock) on Ruby 3.4+
34
- spec.add_development_dependency 'ostruct' # stdlib gem on Ruby 3.5+ (json/simplecov load chain)
35
- spec.add_development_dependency 'logger' # stdlib gem on Ruby 3.4+ (mime-types / rest-client load chain)
36
- spec.add_development_dependency 'bundler', '~> 2.4.6'
37
- spec.add_development_dependency 'pry', '~> 0.14.1'
38
- spec.add_development_dependency 'rake', '~> 13.0'
39
- spec.add_development_dependency 'rspec', '~> 3.0'
40
- spec.add_development_dependency 'rspec_junit_formatter', '~> 0.4.1'
41
- spec.add_development_dependency 'rubocop', '~> 1.15'
42
- spec.add_development_dependency 'rubocop-performance', '~> 1.11', '>= 1.11.3'
43
- spec.add_development_dependency 'rubocop-rake', '~> 0.5.1'
44
- spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
45
- spec.add_development_dependency 'simplecov', '~> 0.21.2'
46
- spec.add_development_dependency 'yard', '~> 0.9.42'
47
- spec.add_development_dependency 'webmock', '~> 3.18'
48
- spec.add_development_dependency 'vcr', '~> 6.4'
49
- end