appending 1.4 → 1.4.3

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 (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/appending.rb +86 -51
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eaa340dc648f9c8e5eb15c6a871e7e2f4688aafa2c1674686351f71e32f0326b
4
- data.tar.gz: ca698fb7a9abcd78968a8fc0ea9d25352796052d5a2903a0b0c3cb732531aab7
3
+ metadata.gz: add82355a1cc40388a4638c12458a7c85419d888c2faf290468293aa3d1c5318
4
+ data.tar.gz: 50b9b920c608bcb72a3ca9402be2bfc0bc60854c2ab0091e0662384c95995323
5
5
  SHA512:
6
- metadata.gz: 5f09789eb67bc56e93df692a7d63d0c41fea701297ab6691ee67a641b709927721bd2783a6c6915a33d18f8cebacbe635f534f49d5f0b9cc4bdbf45d7a9d4e1c
7
- data.tar.gz: e7a04a46cbecaeec589be05f29330ad40478fb16fc5516eea663b6edfbdf39dfd1cced15853b614d568704ecc1692086b1e145d60accf95e2c79595160e95920
6
+ metadata.gz: 29cf888c3f57d24ff03a0314450c1cc9f8882b4ffb7f0bf6e3a7c6ffae13f2b0c082541aede412141dea935713511292b8af93467335a6d636ab5abc2065120a
7
+ data.tar.gz: fdccb2a50a08b53dcfbc9736982cf57c1f224ace49931510e5562f2627279cdd7b41090df42925023b611c66394058f74e1c7b3853012f302169163f27817f52
data/lib/appending.rb CHANGED
@@ -14,6 +14,8 @@ module BlackStack
14
14
  @@phone_fields = []
15
15
  @@company_domain_fields = []
16
16
 
17
+ @@zerobounce_api_key = nil
18
+
17
19
  ## @@logger
18
20
  def self.set_logger(logger)
19
21
  @@logger = logger
@@ -162,6 +164,23 @@ module BlackStack
162
164
  @@email_fields = h[:email_fields] if h[:email_fields]
163
165
  @@phone_fields = h[:phone_fields] if h[:phone_fields]
164
166
  @@company_domain_fields = h[:company_domain_fields] if h[:company_domain_fields]
167
+
168
+ # zerobounce api key
169
+ @@zerobounce_api_key = h[:zerobounce_api_key] if h[:zerobounce_api_key]
170
+ end
171
+
172
+ # call zerobounce api
173
+ def self.zerobounce_verify(email)
174
+ # validation: email must be a string
175
+ raise "Invalid email: #{email.class}. Expected: String." if !email.is_a?(String)
176
+ url = "https://api.zerobounce.net/v2/validate"
177
+ params = {
178
+ :api_key => @@zerobounce_api_key,
179
+ :email => email,
180
+ :ip_address => nil,
181
+ }
182
+ res = BlackStack::Netting::call_get(url, params)
183
+ JSON.parse(res.body)
165
184
  end
166
185
 
167
186
  # return true if the domain get any random address as valid
@@ -183,32 +202,11 @@ module BlackStack
183
202
  params = {
184
203
  :email => email,
185
204
  }
186
- res = BlackStack::Netting::call_get(url, params)
205
+ # send HTTP-GET request to @@verifier_url, using the standard HTTP module
206
+ res = Net::HTTP.get_response(URI.parse("#{url}?email=#{params[:email]}"))
187
207
  parsed = JSON.parse(res.body)
188
- parsed['status'] == 'success'
189
- end
190
-
191
- # verify an email address
192
- def self.append(fname, lname, domain)
193
- ret = []
194
- if !catch_all?(domain)
195
- [
196
- "#{fname}@#{domain}",
197
- "#{lname}@#{domain}",
198
-
199
- "#{fname}.#{lname}@#{domain}",
200
- "#{lname}.#{fname}@#{domain}",
201
-
202
- "#{fname}#{lname}@#{domain}",
203
- "#{lname}#{fname}@#{domain}",
204
-
205
- "#{fname[0]}#{lname}@#{domain}",
206
- "#{fname[0]}.#{lname}@#{domain}",
207
- ].each { |email|
208
- ret << email.downcase if BlackStack::Appending.verify(email)
209
- }
210
- end
211
- ret
208
+ #parsed = JSON.parse(`curl --location --request GET '#{url}?email=#{email}' --header 'Content-Type: application/json'`)
209
+ parsed['status'] == 'success'
212
210
  end
213
211
 
214
212
  # This is a support method for the `append` methods.
@@ -259,8 +257,8 @@ module BlackStack
259
257
 
260
258
  # Find a person in the indexes by its full name and company name.
261
259
  # Append all the information in the index row.
262
- def self.find_persons_with_full_name(name, cname)
263
- l = BlackStack::Appending.logger || BlackStack::DummyLogger.new
260
+ def self.find_persons_with_full_name(name, cname, l=nil)
261
+ l = BlackStack::DummyLogger.new if l.nil?
264
262
 
265
263
  l.logs "Guessing fname from #{name}... "
266
264
  fname = BlackStack::Appending::cleanup_fname(name)
@@ -270,13 +268,13 @@ module BlackStack
270
268
  lname = BlackStack::Appending::cleanup_lname(name)
271
269
  l.logf lname
272
270
 
273
- BlackStack::Appending.find_persons(fname, lname, cname)
271
+ BlackStack::Appending.find_persons(fname, lname, cname, l)
274
272
  end
275
273
 
276
274
  # Find a person in the indexes by its first name, last name and company name.
277
275
  # Append all the information in the index row.
278
- def self.find_persons(fname, lname, cname)
279
- l = BlackStack::Appending.logger || BlackStack::DummyLogger.new
276
+ def self.find_persons(fname, lname, cname, l=nil)
277
+ l = BlackStack::DummyLogger.new if l.nil?
280
278
  h = {
281
279
  :matches => [],
282
280
  :enlapsed_seconds => 0,
@@ -310,8 +308,8 @@ module BlackStack
310
308
 
311
309
  # Find a company in the indexes by its first name, last name and company name.
312
310
  # Append all the information in the index row.
313
- def self.find_persons_by_company(cname)
314
- l = BlackStack::Appending.logger || BlackStack::DummyLogger.new
311
+ def self.find_persons_by_company(cname, l=nil)
312
+ l = BlackStack::DummyLogger.new if l.nil?
315
313
  h = {
316
314
  :matches => [],
317
315
  :enlapsed_seconds => 0,
@@ -339,8 +337,8 @@ module BlackStack
339
337
  h[:matches].map { |m| BlackStack::Appending::Result.new(m) }
340
338
  end
341
339
 
342
- def self.find_verified_emails_with_full_name(name, cname)
343
- l = BlackStack::Appending.logger || BlackStack::DummyLogger.new
340
+ def self.find_verified_emails_with_full_name(name, cname, l=nil)
341
+ l = BlackStack::DummyLogger.new if l.nil?
344
342
 
345
343
  l.logs "Guessing fname from #{name}... "
346
344
  fname = BlackStack::Appending::cleanup_fname(name)
@@ -350,25 +348,30 @@ module BlackStack
350
348
  lname = BlackStack::Appending::cleanup_lname(name)
351
349
  l.logf lname
352
350
 
353
- BlackStack::Appending.find_verified_emails(fname, lname, cname)
351
+ BlackStack::Appending.find_verified_emails(fname, lname, cname, l)
354
352
  end
355
353
 
356
- def self.find_verified_emails(fname, lname, cname)
357
- l = BlackStack::Appending.logger || BlackStack::DummyLogger.new
354
+ def self.find_verified_emails(fname, lname, cname, l=nil)
355
+ l = BlackStack::DummyLogger.new if l.nil?
358
356
  emails = []
359
357
  domains = []
360
358
  verified_emails = []
359
+ #
360
+ return verified_emails if cname =~ /Self.*employed/i
361
361
  # get lead emails from in the indexes
362
362
  l.logs ("Searching index emails... ")
363
- emails = BlackStack::Appending.find_persons(fname, lname, cname).map { |res|
363
+ emails = BlackStack::Appending.find_persons(fname, lname, cname, l).map { |res|
364
364
  res.emails
365
365
  }.flatten.uniq.reject { |email|
366
366
  email.to_s.empty?
367
- }
368
- l.done
367
+ }.uniq
368
+ # remove duplications
369
+ # IMPORTANT: be sure you have no spances, and no duplications, in order to don't repeat this issue https://github.com/leandrosardi/emails/issues/124
370
+ emails = emails.map { |email| email.to_s.downcase.strip }.uniq
371
+ l.logf "done (#{emails.to_s})"
369
372
  # get company domains from the indexes
370
373
  l.logs ("Searching index domains... ")
371
- domains = BlackStack::Appending.find_persons_by_company(cname).map { |res|
374
+ domains = BlackStack::Appending.find_persons_by_company(cname, l).map { |res|
372
375
  res.company_domains
373
376
  }.flatten.reject { |email|
374
377
  email.to_s.empty?
@@ -376,22 +379,54 @@ module BlackStack
376
379
  # normalize domain
377
380
  domain.to_s.gsub('www.', '').downcase
378
381
  }.uniq
379
- l.done
382
+ # remove duplications
383
+ # IMPORTANT: be sure you have no spances, and no duplications, in order to don't repeat this issue https://github.com/leandrosardi/emails/issues/124
384
+ domains = domains.map { |domain| domain.to_s.downcase.strip }.uniq
385
+ l.logf "done (#{domains.to_s})"
386
+ # add emails using fname and lname and company domains
387
+ # if the domain has not a catch-all address, then add all possible email variations to the array `emails`.
388
+ # if the domain has a catch-all address, then remove all emails with such a domain from the array `emails`.
389
+ l.logs ("Building list of candidates... ")
390
+ domains.each { |domain|
391
+ if !BlackStack::Appending.catch_all?(domain)
392
+ emails += [
393
+ "#{fname}@#{domain}",
394
+ "#{lname}@#{domain}",
395
+ "#{fname}.#{lname}@#{domain}",
396
+ "#{lname}.#{fname}@#{domain}",
397
+ "#{fname}#{lname}@#{domain}",
398
+ "#{lname}#{fname}@#{domain}",
399
+ "#{fname[0]}#{lname}@#{domain}",
400
+ "#{fname[0]}.#{lname}@#{domain}",
401
+ ]
402
+ else
403
+ emails = emails.reject { |email| email =~ /@#{domain}$/ }
404
+ end
405
+ }
406
+ # delete duplicates
407
+ emails.uniq!
408
+ l.logf "done (#{emails.to_s})"
380
409
  # verify all the emails found in the indexes
381
- l.logs ("Verifying index emails... ")
410
+ l.logs ("Verifying emails... ")
382
411
  emails.each { |email|
383
412
  l.logs "Verifying #{email}... "
384
- domain = email.split('@').last
385
- verified_emails << email if BlackStack::Appending.verify(email) && !BlackStack::Appending.catch_all?(domain)
413
+ verified_emails << email if BlackStack::Appending.verify(email)
386
414
  l.done
415
+ # IMPORTANT: I added this line in order to resolve this issue https://github.com/leandrosardi/emails/issues/124
416
+ break if verified_emails.size > 0
387
417
  }
388
418
  l.done
389
- # appending with domains found in the indexes
390
- l.logs ("Appending with domains... ")
391
- domains.each { |domain|
392
- l.logs "Appending with #{domain}... "
393
- verified_emails += BlackStack::Appending.append(fname, lname, domain)
394
- l.done
419
+ # verify all the emails found in the indexes
420
+ # IMPORTANT: I added this double-check in order to don't repeat this issue https://github.com/leandrosardi/emails/issues/124
421
+ l.logs ("Double check emails... ")
422
+ verified_emails.each { |email|
423
+ l.logs "Double-checking #{email}... "
424
+ if BlackStack::Appending.verify(email)
425
+ l.logf 'keep'
426
+ else
427
+ verified_emails.delete(email)
428
+ l.logf "removed"
429
+ end
395
430
  }
396
431
  l.done
397
432
  # return
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appending
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.4'
4
+ version: 1.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Leandro Daniel Sardi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-20 00:00:00.000000000 Z
11
+ date: 2023-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: csv