mailshield 1.2 → 1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mailshield/disposable_domains.rb +2 -2
- data/lib/mailshield/secure_email_validator.rb +1 -1
- data/lib/mailshield/version.rb +2 -2
- data/lib/mailshield.rb +29 -19
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a63f4492f21b558750b2e876a02ccdad172bc8e471cacf533e6886d348e0b5a
|
4
|
+
data.tar.gz: d83751d2286c3b034a92cf4e65b55cdebd68fb7d31fb0ac7cc12489258e1544f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3317ff62aa8479a9f678c01024c99da25e230d9ecfc59013ca0579e05d43eec6e1bc55978b73dfee4b2bb91211c6f88aa248c58b0b0e3a24a5aa90f0be4faec
|
7
|
+
data.tar.gz: 71fca0b12c55c64a24d55ea532427b9eb4e68d4cafae91872a423d6f4e38eb6d8c7e2e895911daf2bcc2811eeaa4e7adbf49bbf2c6559c4e7e6f0be506744d97
|
@@ -87,8 +87,8 @@ module MailShield
|
|
87
87
|
|
88
88
|
|
89
89
|
class << self
|
90
|
-
def
|
91
|
-
|
90
|
+
def validate_known_disposal_domain?(domain)
|
91
|
+
raise TemporaryDomainError, 'Temporary / Disposal Email.' if KNOWN_DISPOSABLE_DOMAINS.include?(domain)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/lib/mailshield/version.rb
CHANGED
data/lib/mailshield.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'mailshield/version'
|
4
4
|
require_relative 'mailshield/disposable_domains'
|
5
|
+
require 'mailshield/secure_email_validator'
|
5
6
|
require 'resolv'
|
6
7
|
require 'csv'
|
7
8
|
require 'net/smtp'
|
@@ -15,7 +16,7 @@ module MailShield
|
|
15
16
|
class SPFError < ValidationError; end
|
16
17
|
class DMARCError < ValidationError; end
|
17
18
|
class SMTPError < ValidationError; end
|
18
|
-
|
19
|
+
class TemporaryDomainError < ValidationError; end
|
19
20
|
class << self
|
20
21
|
attr_accessor :dns_cache, :smtp_cache
|
21
22
|
|
@@ -25,13 +26,15 @@ module MailShield
|
|
25
26
|
domain = extract_domain(email)
|
26
27
|
|
27
28
|
begin
|
29
|
+
validate_known_disposal_domain?(domain)
|
28
30
|
validate_format!(email)
|
29
31
|
validate_domain!(domain)
|
30
32
|
validate_spf!(domain)
|
31
33
|
validate_dmarc!(domain)
|
32
34
|
validate_smtp!(email) if verify_by_send
|
35
|
+
|
33
36
|
rescue ValidationError => e
|
34
|
-
return { valid: false,
|
37
|
+
return { valid: false, reason: e.message }
|
35
38
|
end
|
36
39
|
|
37
40
|
{ valid: true }
|
@@ -57,15 +60,15 @@ module MailShield
|
|
57
60
|
end
|
58
61
|
|
59
62
|
def validate_spf!(domain)
|
60
|
-
raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
|
63
|
+
raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
|
61
64
|
end
|
62
65
|
|
63
66
|
def validate_dmarc!(domain)
|
64
|
-
raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
|
67
|
+
raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
|
65
68
|
end
|
66
69
|
|
67
70
|
def validate_smtp!(email)
|
68
|
-
raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
|
71
|
+
raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
|
69
72
|
end
|
70
73
|
|
71
74
|
def extract_domain(email)
|
@@ -77,13 +80,11 @@ module MailShield
|
|
77
80
|
end
|
78
81
|
|
79
82
|
def fetch_mx_records(domain)
|
80
|
-
|
81
|
-
Resolv::DNS.
|
82
|
-
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
83
|
-
end
|
84
|
-
rescue Resolv::ResolvError
|
85
|
-
[]
|
83
|
+
Resolv::DNS.open do |dns|
|
84
|
+
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
86
85
|
end
|
86
|
+
rescue Resolv::ResolvError
|
87
|
+
[]
|
87
88
|
end
|
88
89
|
|
89
90
|
def spf_record?(domain)
|
@@ -97,18 +98,17 @@ module MailShield
|
|
97
98
|
end
|
98
99
|
|
99
100
|
def fetch_txt_records(domain)
|
100
|
-
|
101
|
-
Resolv::DNS
|
102
|
-
|
103
|
-
end
|
104
|
-
rescue Resolv::ResolvError
|
105
|
-
[]
|
101
|
+
Resolv::DNS.open do |dns|
|
102
|
+
records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
|
103
|
+
records.map(&:data)
|
106
104
|
end
|
105
|
+
rescue Resolv::ResolvError
|
106
|
+
[]
|
107
107
|
end
|
108
108
|
|
109
109
|
def smtp_verify_email(email)
|
110
110
|
domain = extract_domain(email)
|
111
|
-
smtp_server =
|
111
|
+
smtp_server = get_smtp_server(domain)
|
112
112
|
|
113
113
|
return false unless smtp_server
|
114
114
|
|
@@ -117,7 +117,7 @@ module MailShield
|
|
117
117
|
smtp.helo('localhost')
|
118
118
|
smtp.mailfrom('test@example.com')
|
119
119
|
response = smtp.rcptto(email)
|
120
|
-
response == '250 OK'
|
120
|
+
response.status == '250' || response.status == '250 OK'
|
121
121
|
end
|
122
122
|
rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
|
123
123
|
false
|
@@ -130,3 +130,13 @@ module MailShield
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
+
|
134
|
+
module ActiveModel
|
135
|
+
module Validations
|
136
|
+
class SecureEmailValidator < ::MailShield::SecureEmailValidator
|
137
|
+
def initialize(options = {})
|
138
|
+
super
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
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.
|
4
|
+
version: '1.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2024-09-04 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: []
|