mailshield 1.1 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2f790a0d5433530568a6f83139e95b388deda280f0999a96360d175fd1d1bb8
4
- data.tar.gz: cbdd60b76200d3d02f83f8fae0514845cf9d4f863a5f82ab01901888f76bff26
3
+ metadata.gz: 362dd7a7c8a948582fdffea7fdc081da39461f3711e247a2cd79afa88d6635c8
4
+ data.tar.gz: 151d0b56d0f2bcbfacab22f427b2bc9712b543b4c6f49c72c9f634b0100f693b
5
5
  SHA512:
6
- metadata.gz: e085fa9e242a940c4b186ebbd1e07b7c053c0867b595077ed39eaa9ff77d2af4a4c4bbb84fed519fc03e37e6a3a49cf0e5d03246c634283a736da071230777c8
7
- data.tar.gz: f6519dce2b29a0eee85b753e2169ec0de6a99a13985b6b9d6b3ac0978e587122ad404a77200fb8e53ab912a340511653dcb2cc4a146e67281d4433187a1d9450
6
+ metadata.gz: 9b29470d6e8d15577c201fa8b2a02220f71c6d96c69e6de7700f72c3fc3f8831a592d2422ee3b7c6bb696b882d465f4cafcf679bbac0f001a6d881fb97b03b06
7
+ data.tar.gz: 5a341e947ab69d9b202f426a8ed2ee1646350ee945f597a87d72be72e76cd2e5ec42c1db0a7d2248fe88b3ed890796aa046aecfdc2d43bc77ed0ba5ccb928501
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+ require 'set'
3
+
4
+ module MailShield
5
+ KNOWN_DISPOSABLE_DOMAINS = Set.new(
6
+ [
7
+ '10mail.org', '10minut.com.pl', '10minut.xyz', '10minutemail.nl', '11163.com',
8
+ '1secmail.com', '1secmail.net', '1secmail.org', '20minutemail.com', '2chmail.net',
9
+ '30wave.com', '4warding.net', '55hosting.net', '5july.org', '5ymail.com',
10
+ '672643.net', '6ip.us', '99.com', 'acentri.com', 'afrobacon.com',
11
+ 'ahk.jp', 'aiafhg.com', 'airsi.de', 'akgq701.com', 'aleeas.com',
12
+ 'alienware13.com', 'ama-trans.de', 'amiri.net', 'ano-mail.net', 'anonaddy.com',
13
+ 'anonmails.de', 'apkmd.com', 'armyspy.com', 'asorent.com', 'augmentationtechnology.com',
14
+ 'aver.com', 'averdov.com', 'axsup.net', 'b2cmail.de', 'banit.club',
15
+ 'bearsarefuzzy.com', 'belamail.org', 'bitwhites.top', 'bladesmail.net', 'bobmail.info',
16
+ 'boxformail.in', 'ccmail.uk', 'ceed.se', 'chammy.info', 'cheaphub.net',
17
+ 'choco.la', 'choicemail1.com', 'chong-mail.net', 'cocoro.uk', 'cocovpn.com',
18
+ 'crazymailing.com', 'cream.pink', 'cutradition.com', 'cuvox.de', 'd1yun.com',
19
+ 'd3p.dk', 'dab.ro', 'dandikmail.com', 'datum2.com', 'dayrep.com',
20
+ 'desoz.com', 'devnullmail.com', 'digdig.org', 'digitalsanctuary.com', 'dispo.in',
21
+ 'dispostable.com', 'dndent.com', 'domozmail.com', 'drdrb.com', 'drevo.si',
22
+ 'dropmail.me', 'dukedish.com', 'durandinterstellar.com', 'e4ward.com', 'eay.jp',
23
+ 'ee1.pl', 'efxs.ca', 'einmalmail.de', 'einrot.com', 'eintagsmail.de',
24
+ 'email.com', 'email.it', 'email60.com', 'emailinfive.com', 'emailresort.com',
25
+ 'emailxfer.com', 'emeraldwebmail.com', 'emlhub.com', 'emlpro.com', 'emltmp.com',
26
+ 'envy17.com', 'esemay.com', 'ether123.net', 'ethereum1.top', 'ethersports.org',
27
+ 'evyush.com', 'exdonuts.com', 'express.net.ua', 'eyepaste.com', 'fanclub.pm',
28
+ 'fangoh.com', 'fantasymail.de', 'fastmail.com', 'fatflap.com', 'fightallspam.com',
29
+ 'fiifke.de', 'findu.pl', 'fleckens.hu', 'foobarbot.net', 'fr33mail.info',
30
+ 'freeinbox.email', 'freeml.net', 'fukurou.ch', 'fuwamofu.com', 'fuwari.be',
31
+ 'gafy.net', 'gambling.com', 'gehensiemirnichtaufdensack.de', 'gelitik.in', 'geronra.com',
32
+ 'getmails.eu', 'getover.de', 'givememail.club', 'gmatch.org', 'go2vpn.net',
33
+ 'golemico.com', 'greenhousemail.com', 'guerillamail.biz', 'guerrillamail.com', 'gustr.com',
34
+ 'haltospam.com', 'hamham.uk', 'harakirimail.com', 'haydoo.com', 'headstrong.de',
35
+ 'heisei.be', 'herp.in', 'herpderp.nl', 'hidemyass.com', 'hidzz.com',
36
+ 'hola.org', 'honeys.be', 'honor-8.com', 'hornyalwary.top', 'hostcalls.com',
37
+ 'hotmai.com', 'hotsoup.be', 'ichigo.me', 'icx.ro', 'ieatspam.eu',
38
+ 'ige.es', 'imails.info', 'imstations.com', 'in-ulm.de', 'inboxalias.com',
39
+ 'inkomail.com', 'instaddr.ch', 'interstats.org', 'ip6.li', 'janproz.com',
40
+ 'jobposts.net', 'jourrapide.com', 'kagi.be', 'katztube.com', 'kbox.li',
41
+ 'kkmail.be', 'kksm.be', 'klipschx12.com', 'kmail.li', 'koszmail.pl',
42
+ 'kpay.be', 'kpost.be', 'kulturbetrieb.info', 'labworld.org', 'lee.mx',
43
+ 'lenovog4.com', 'lgxscreen.com', 'lifetotech.com', 'ligsb.com', 'lillemap.net',
44
+ 'locanto1.club', 'locantofuck.top', 'lukop.dk', 'macr2.com', 'macromaid.com',
45
+ 'magim.be', 'mail.darmajaya.ac.id', 'mail.ru', 'mail.tm', 'mail21.cc',
46
+ 'mailcker.com', 'maildrop.cc', 'maildx.com', 'mailfs.com', 'mailguard.me',
47
+ 'mailinater.com', 'mailinator.com', 'mailinator.net', 'mailinator.us', 'mailsac.com',
48
+ 'mailscrap.com', 'mailshell.com', 'mailtechx.com', 'mailtothis.com', 'mama3.org',
49
+ 'manybrain.com', 'mbox.re', 'meantinc.com', 'mepost.pw', 'merry.pink',
50
+ 'metalunits.com', 'midiharmonica.com', 'mirai.re', 'mobilevpn.top', 'mofu.be',
51
+ 'moimoi.re', 'monumentmail.com', 'morsin.com', 'mt2009.com', 'mt2014.com',
52
+ 'mt2015.com', 'mybitti.de', 'mymail-in.net', 'mymailoasis.com', 'mypacks.net',
53
+ 'myspamless.com', 'mystvpn.com', 'mytrashmail.com', 'na-cat.com', 'nada.email',
54
+ 'nagi.be', 'nanonym.ch', 'neko2.net', 'nekochan.fr', 'nervmich.net',
55
+ 'nextstopvalhalla.com', 'nezdiro.org', 'nezumi.be', 'niseko.be', 'nospamfor.us',
56
+ 'notmailinator.com', 'ntlhelp.net', 'nurfuerspam.de', 'nutpa.net', 'nypato.com',
57
+ 'okinawa.li', 'onemail.host', 'onetm.jp', 'online.ms', 'oopi.org',
58
+ 'ovomail.co', 'owleyes.ch', 'oxopoha.com', 'p33.org', 'pancakemail.com',
59
+ 'pavilionx2.com', 'payperex2.com', 'pecinan.net', 'pingir.com', 'placebomail10.com',
60
+ 'plw.me', 'porsh.net', 'pratikmail.com', 'pratikmail.org', 'prin.be',
61
+ 'privy-mail.de', 'pro-tag.org', 'projectcl.com', 'psh.me', 'put2.net',
62
+ 'putthisinyourspamdatabase.com', 'qtum-ico.com', 'quickemail.info', 'quicksend.ch', 'rabin.ca',
63
+ 'rapt.be', 'reallymymail.com', 'recode.me', 'redfeathercrow.com', 'reftoken.net',
64
+ 'rhyta.com', 'rootfest.net', 'royal.net', 'ruru.be', 'safetymail.info',
65
+ 'schrott-email.de', 'sendnow.win', 'sendspamhere.com', 'senseless-entertainment.com', 'sexyalwasmi.top',
66
+ 'shalar.net', 'sharklasers.com', 'shieldedmail.com', 'shieldemail.com', 'shipfromto.com',
67
+ 'shrib.com', 'sika3.com', 'simaenaga.com', 'simplelogin.co', 'sinaite.net',
68
+ 'slaskpost.se', 'sofia.re', 'sogetthis.com', 'spamdecoy.net', 'spamhereplease.com',
69
+ 'spamhole.com', 'stayhome.li', 'storiqax.top', 'storj99.com', 'storj99.top',
70
+ 'stromox.com', 'superrito.com', 'supersave.net', 'suremail.info', 'svk.jp',
71
+ 'tapi.re', 'teleworm.us', 'temp-mail.org', 'tempail.com', 'tempemail.net',
72
+ 'tempmail.dev', 'tempmail2.com', 'tempmailer.com', 'tempmailo.com', 'tensi.org',
73
+ 'testudine.com', 'thankyou2010.com', 'thisisnotmyrealemail.com', 'throwam.com', 'tilien.com',
74
+ 'tmail.ws', 'tokem.co', 'topless-new-world.com', 'topmail.com', 'torba.cc',
75
+ 'trickmail.net', 'trickmail.org', 'trixtrux1.com', 'truckeremail.net', 'tryalert.com',
76
+ 'turual.com', 'twddos.com', 'unmail.ru', 'uploadnolimit.com', 'uw5t6ds54.com',
77
+ 'ventolin.org', 'vintomaper.com', 'vmailcloud.com', 'vubby.com', 'vuiy.pw',
78
+ 'warpmail.net', 'watch-harry-potter.com', 'watchfulli.com', 'wep68.com', 'wh4f.org',
79
+ 'willhackforfood.biz', 'winbroadband.co.uk', 'workshop-liberal.com', 'wronghead.com', 'wwwmail.win',
80
+ 'x24.com', 'xn--9kq967o.com', 'xn--cg7bx4b4x1b.com', 'xsynergy.top', 'xxhamsterxx.com',
81
+ 'yepmail.net', 'yesspam.com', 'yo-site.com', 'yogotemail.com', 'yopmail.fr',
82
+ 'yopmail.gq', 'yopmail.net', 'yopmail.org', 'yourinbox.email', 'yuurok.com',
83
+ 'zainmax.net', 'ze.gy', 'zipmail.com', 'zoemail.net', 'zombie-hive.com',
84
+ 'zsero.com', 'zumrot.com'
85
+ ]
86
+ )
87
+
88
+
89
+ class << self
90
+ def validate_known_disposal_domain?(domain)
91
+ raise TemporaryDomainError, 'Temporary / Disposal Email.' if KNOWN_DISPOSABLE_DOMAINS.include?(domain)
92
+ end
93
+ end
94
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_model'
2
4
 
3
5
  module MailShield
@@ -8,9 +10,9 @@ module MailShield
8
10
 
9
11
  result = MailShield.validate_email(email)
10
12
 
11
- unless result[:valid]
12
- record.errors.add(:email, result[:issue])
13
- end
13
+ return if result[:valid]
14
+
15
+ record.errors.add(:email, result[:issue])
14
16
  end
15
17
  end
16
18
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mailshield
4
- VERSION = "1.1"
5
- end
4
+ VERSION = '1.3'
5
+ end
data/lib/mailshield.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'mailshield/version'
4
+ require_relative 'mailshield/disposable_domains'
4
5
  require 'resolv'
5
6
  require 'csv'
6
7
  require 'net/smtp'
@@ -14,7 +15,7 @@ module MailShield
14
15
  class SPFError < ValidationError; end
15
16
  class DMARCError < ValidationError; end
16
17
  class SMTPError < ValidationError; end
17
-
18
+ class TemporaryDomainError < ValidationError; end
18
19
  class << self
19
20
  attr_accessor :dns_cache, :smtp_cache
20
21
 
@@ -24,22 +25,24 @@ module MailShield
24
25
  domain = extract_domain(email)
25
26
 
26
27
  begin
28
+ validate_known_disposal_domain?(domain)
27
29
  validate_format!(email)
28
30
  validate_domain!(domain)
29
31
  validate_spf!(domain)
30
32
  validate_dmarc!(domain)
31
33
  validate_smtp!(email) if verify_by_send
34
+
32
35
  rescue ValidationError => e
33
- return { valid: false, issues: [e.message] }
36
+ return { valid: false, reason: e.message }
34
37
  end
35
38
 
36
- { valid: true, issues: [] }
39
+ { valid: true }
37
40
  end
38
41
 
39
-
40
42
  def verify_address(email)
41
43
  smtp_verify_email(email)
42
44
  end
45
+
43
46
  private
44
47
 
45
48
  def reset_caches
@@ -56,15 +59,15 @@ module MailShield
56
59
  end
57
60
 
58
61
  def validate_spf!(domain)
59
- raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
62
+ raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
60
63
  end
61
64
 
62
65
  def validate_dmarc!(domain)
63
- raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
66
+ raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
64
67
  end
65
68
 
66
69
  def validate_smtp!(email)
67
- raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
70
+ raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
68
71
  end
69
72
 
70
73
  def extract_domain(email)
@@ -76,13 +79,11 @@ module MailShield
76
79
  end
77
80
 
78
81
  def fetch_mx_records(domain)
79
- dns_cache[domain] ||= begin
80
- Resolv::DNS.open do |dns|
81
- dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
82
- end
83
- rescue Resolv::ResolvError
84
- []
82
+ Resolv::DNS.open do |dns|
83
+ dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
85
84
  end
85
+ rescue Resolv::ResolvError
86
+ []
86
87
  end
87
88
 
88
89
  def spf_record?(domain)
@@ -96,18 +97,17 @@ module MailShield
96
97
  end
97
98
 
98
99
  def fetch_txt_records(domain)
99
- dns_cache[domain] ||= begin
100
- Resolv::DNS.open do |dns|
101
- dns.getresources(domain, Resolv::DNS::Resource::IN::TXT).map(&:data)
102
- end
103
- rescue Resolv::ResolvError
104
- []
100
+ Resolv::DNS.open do |dns|
101
+ records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
102
+ records.map(&:data)
105
103
  end
104
+ rescue Resolv::ResolvError
105
+ []
106
106
  end
107
107
 
108
108
  def smtp_verify_email(email)
109
109
  domain = extract_domain(email)
110
- smtp_server = smtp_cache[domain] ||= get_smtp_server(domain)
110
+ smtp_server = get_smtp_server(domain)
111
111
 
112
112
  return false unless smtp_server
113
113
 
@@ -116,9 +116,9 @@ module MailShield
116
116
  smtp.helo('localhost')
117
117
  smtp.mailfrom('test@example.com')
118
118
  response = smtp.rcptto(email)
119
- response == '250 OK'
119
+ response.status == '250' || response.status == '250 OK'
120
120
  end
121
- rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED => e
121
+ rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
122
122
  false
123
123
  end
124
124
  end
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailshield
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.1'
4
+ version: '1.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - jana
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-29 00:00:00.000000000 Z
12
- dependencies: []
13
- description: MailShield helps secure your application by identifying temporary or
14
- disposable email domains.
11
+ date: 2024-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-smtp
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.1
27
+ description: MailShield enhances your app’s security by blocking temporary, spam and
28
+ disposable email addresses, keeping your user data clean and reducing spam.
15
29
  email:
16
30
  - shanmugamjanarthan24@gmail.com
17
31
  executables: []
@@ -19,9 +33,9 @@ extensions: []
19
33
  extra_rdoc_files: []
20
34
  files:
21
35
  - lib/mailshield.rb
36
+ - lib/mailshield/disposable_domains.rb
22
37
  - lib/mailshield/docs/mailshield.png
23
38
  - lib/mailshield/secure_email_validator.rb
24
- - lib/mailshield/temp_domains.yml
25
39
  - lib/mailshield/version.rb
26
40
  homepage: https://github.com/janarthanan-shanmugam/mailshield
27
41
  licenses: