email-authentication 0.1.2 → 0.1.5
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 +4 -4
- data/Gemfile +1 -0
- data/Gemfile.lock +2 -2
- data/bin/emailcheck.rb +4 -2
- data/lib/email-authentication/base.rb +55 -9
- data/test/coverage/index.html +1 -1
- data/test/test_address.rb +14 -7
- data/test/test_mx_records.rb +4 -7
- data/test/test_smtp.rb +29 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 111f33f51ed2cb1a269af68df394227ab7312dd9
|
4
|
+
data.tar.gz: 393f18a8d3b720f27baf9274451174d20d6ed355
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4543774e6ba679c5567013f9494c539087168e5322b999c6c40b7214b901e83b0f5bb0e934a09bf74f0a60ef43295328ea4e797de592b9c7541e3d5d25287fb9
|
7
|
+
data.tar.gz: a1f1376d98ec4a376c032a7fc3879463f5208eee2d73d1902994ba1abb3d41107c1532c9cacbf55feec016444eccd6d6b76fb41635d86f16e2c541e209ae9efe
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
email-authentication (0.1.
|
4
|
+
email-authentication (0.1.5)
|
5
5
|
dnsruby
|
6
6
|
|
7
7
|
GEM
|
@@ -11,7 +11,7 @@ GEM
|
|
11
11
|
simplecov (>= 0.7.1, < 1.0.0)
|
12
12
|
dnsruby (1.54)
|
13
13
|
minitest (5.0.8)
|
14
|
-
multi_json (1.8.
|
14
|
+
multi_json (1.8.2)
|
15
15
|
simplecov (0.7.1)
|
16
16
|
multi_json (~> 1.0)
|
17
17
|
simplecov-html (~> 0.7.1)
|
data/bin/emailcheck.rb
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
require 'email-authentication'
|
4
4
|
# needs upgrade to thor
|
5
|
-
address
|
5
|
+
address = ARGV[0]
|
6
|
+
from=ARGV[1]
|
6
7
|
puts "Address is #{[address]}"
|
8
|
+
puts "From address #{from}"
|
7
9
|
@f=EmailAuthentication::Base.new
|
8
10
|
success,msg=@f.check(address)
|
9
|
-
puts "Success: #{address}" if success
|
11
|
+
puts "Success: #{address} messages #{msg}" if success
|
10
12
|
puts "Failure: #{address} messages: #{msg}" if !success
|
@@ -1,30 +1,34 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'dnsruby'
|
3
3
|
include Dnsruby
|
4
|
+
require 'net/telnet'
|
4
5
|
|
5
6
|
# Use the system configured nameservers to run a query
|
6
7
|
|
7
8
|
module EmailAuthentication
|
8
9
|
class Base
|
9
|
-
attr_accessor :address, :mx, :message, :domain
|
10
|
+
attr_accessor :address, :mx, :message, :domain, :from
|
10
11
|
def debug
|
11
12
|
true
|
12
13
|
end
|
13
|
-
def self.check(address)
|
14
|
+
def self.check(address,from)
|
14
15
|
tmp=self.new
|
15
|
-
return tmp.check(address)
|
16
|
+
return tmp.check(address,from)
|
16
17
|
end
|
17
|
-
def set_address(address)
|
18
|
+
def set_address(address,from="")
|
18
19
|
raise "address nil" if address==nil
|
19
20
|
raise "address blank" if address==""
|
21
|
+
raise "from address blank" if from==""
|
20
22
|
self.address=address.to_s
|
23
|
+
self.from=from
|
21
24
|
@flag=true
|
22
25
|
end
|
23
26
|
# this needs work. Anyone who can improve the regex i would be happy to put in their changes
|
27
|
+
# see alsothe validate_email_format gem for rails
|
24
28
|
def check_format
|
25
29
|
@@email_regex = /^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$/i
|
26
30
|
res=(@address =~ @@email_regex)
|
27
|
-
puts " res is #{res}"
|
31
|
+
#puts " res is #{res}"
|
28
32
|
if res
|
29
33
|
[true,"format ok"]
|
30
34
|
else
|
@@ -40,13 +44,14 @@ module EmailAuthentication
|
|
40
44
|
def check_mx
|
41
45
|
domain=self.address.split('@')
|
42
46
|
@domain = domain[1]
|
43
|
-
puts "domain is #{domain}"
|
47
|
+
#puts "domain is #{domain}"
|
44
48
|
flag=false
|
45
49
|
if @domain!=nil
|
46
50
|
begin
|
47
51
|
ret = self.resolver.query(@domain, Types.MX)
|
48
52
|
if ret.answer!=nil and ret.rcode=='NOERROR'
|
49
53
|
@mx=ret.answer.first.exchange.to_s if ret.answer!=nil
|
54
|
+
@mx=@mx.downcase
|
50
55
|
msg= "mx record #{self.mx}"
|
51
56
|
puts msg
|
52
57
|
flag=true
|
@@ -63,12 +68,52 @@ module EmailAuthentication
|
|
63
68
|
[flag,msg]
|
64
69
|
end
|
65
70
|
# need to think about this and check the domain via telnet
|
71
|
+
#S: 220 smtp.example.com ESMTP Postfix
|
72
|
+
#C: HELO relay.example.org
|
73
|
+
#S: 250 Hello relay.example.org, I am glad to meet you
|
74
|
+
#C: MAIL FROM:<bob@example.org>
|
75
|
+
#S: 250 Ok
|
76
|
+
#C: RCPT TO:<alice@example.com>
|
77
|
+
#S: 250 Ok
|
78
|
+
|
66
79
|
def check_smtp
|
67
|
-
|
80
|
+
flag=false
|
81
|
+
msg='smtp ok'
|
82
|
+
domain=self.from.split('@')
|
83
|
+
@fromdomain = domain[1]
|
84
|
+
if @mx.include?('google') or @mx.include?('live.com')
|
85
|
+
flag=true
|
86
|
+
msg="smtp not checked since google or live: #{@mx}"
|
87
|
+
else
|
88
|
+
begin
|
89
|
+
smtp = Net::Telnet::new("Host" => @mx, 'Port' => 25, "Telnetmode" => false, "Prompt" => /^\+OK/)
|
90
|
+
c=""
|
91
|
+
msg=c
|
92
|
+
cmd="HELO " + @fromdomain
|
93
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/) { |c| print "CMD: #{cmd} RESP: #{c}"
|
94
|
+
msg << c}
|
95
|
+
cmd="MAIL FROM:<" +@from+ ">"
|
96
|
+
sleep 0.5
|
97
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/ ) { |c| print "CMD: #{cmd} RESP: #{c}"
|
98
|
+
msg << c}
|
99
|
+
cmd="RCPT TO:<" +@address+ ">"
|
100
|
+
sleep 0.5
|
101
|
+
smtp.cmd('String' => cmd, 'Match'=> /^250/ ) { |c| print "CMD: #{cmd} RESP: #{c}"
|
102
|
+
msg=c
|
103
|
+
flag=true if c.include?('250') }
|
104
|
+
cmd='quit'
|
105
|
+
smtp.cmd('String' => cmd, 'Match'=> /^221/ ) { |c| print "CMD: #{cmd} RESP: #{c}" }
|
106
|
+
rescue Exception => e
|
107
|
+
@flag=false
|
108
|
+
msg= "smtp exception #{e.message}"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
[flag,msg]
|
68
113
|
end
|
69
114
|
# run all the checks
|
70
|
-
def check(address)
|
71
|
-
self.set_address(address)
|
115
|
+
def check(address,from)
|
116
|
+
self.set_address(address,from)
|
72
117
|
@message=[]
|
73
118
|
puts "checking #{@address}"
|
74
119
|
['format','mx','smtp'].each { |cmd|
|
@@ -76,6 +121,7 @@ module EmailAuthentication
|
|
76
121
|
res,msg= self.send(cmdstring)
|
77
122
|
@flag=@flag && res
|
78
123
|
@message << msg }
|
124
|
+
[@flag,@message.join(',').to_s]
|
79
125
|
end
|
80
126
|
|
81
127
|
|
data/test/coverage/index.html
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
<img src="./assets/0.7.1/loading.gif" alt="loading"/>
|
15
15
|
</div>
|
16
16
|
<div id="wrapper" style="display:none;">
|
17
|
-
<div class="timestamp">Generated <abbr class="timeago" title="2013-10-
|
17
|
+
<div class="timestamp">Generated <abbr class="timeago" title="2013-10-26T17:38:07+08:00">2013-10-26T17:38:07+08:00</abbr></div>
|
18
18
|
<ul class="group_tabs"></ul>
|
19
19
|
|
20
20
|
<div id="content">
|
data/test/test_address.rb
CHANGED
@@ -8,7 +8,7 @@ class EmailAuthenticationTest < Minitest::Test
|
|
8
8
|
@f=EmailAuthentication::Base.new
|
9
9
|
@success='scott.sproule@ficonab.com'
|
10
10
|
@failruntimeerror=[nil,""]
|
11
|
-
|
11
|
+
@from='scott.sproule@estormtech.com'
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_basic
|
@@ -18,21 +18,28 @@ class EmailAuthenticationTest < Minitest::Test
|
|
18
18
|
def test_checknil
|
19
19
|
|
20
20
|
assert_raises(RuntimeError) do
|
21
|
-
@f.check(nil)
|
21
|
+
@f.check(nil," ")
|
22
22
|
end
|
23
23
|
|
24
24
|
end
|
25
|
+
def test_checknil2
|
26
|
+
|
27
|
+
assert_raises(RuntimeError) do
|
28
|
+
@f.check("nil","")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
25
32
|
def test_checkfailruntime
|
26
33
|
@failruntimeerror.each { |add|
|
27
34
|
assert_raises(RuntimeError) do
|
28
|
-
@f.check(add)
|
35
|
+
@f.check(add,@from)
|
29
36
|
end
|
30
37
|
}
|
31
38
|
|
32
39
|
end
|
33
40
|
|
34
41
|
def test_goodemail
|
35
|
-
success,msg= @f.check(@success)
|
42
|
+
success,msg= @f.check(@success,@from)
|
36
43
|
assert success,"check did not succeed #{msg}"
|
37
44
|
end
|
38
45
|
def test_resolver_onlyonce
|
@@ -43,19 +50,19 @@ class EmailAuthenticationTest < Minitest::Test
|
|
43
50
|
end
|
44
51
|
#check a particular format
|
45
52
|
def test_checkformat_good
|
46
|
-
@f.set_address(@success)
|
53
|
+
@f.set_address(@success,@from)
|
47
54
|
success,msg= @f.check_format
|
48
55
|
assert success,"check did not succeed"
|
49
56
|
|
50
57
|
end
|
51
58
|
def test_class_variable
|
52
|
-
success,msg= EmailAuthentication::Base.check(@success)
|
59
|
+
success,msg= EmailAuthentication::Base.check(@success,@from)
|
53
60
|
assert success,"check did not succeed"
|
54
61
|
|
55
62
|
end
|
56
63
|
def test_bademails
|
57
64
|
['test','test#sed', 'test@jack'].each { |e|
|
58
|
-
@f.set_address(e)
|
65
|
+
@f.set_address(e,@from)
|
59
66
|
success,msg= @f.check_format
|
60
67
|
assert !success,"check did succeed but it should not for #{e}"
|
61
68
|
}
|
data/test/test_mx_records.rb
CHANGED
@@ -8,11 +8,12 @@ class EmailMXAuthenticationTest < Minitest::Test
|
|
8
8
|
@f=EmailAuthentication::Base.new
|
9
9
|
@success='scott.sproule@ficonab.com'
|
10
10
|
@failruntimeerror=[nil,""]
|
11
|
+
@from='scott.sproule@estormtech.com'
|
11
12
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def test_good_domain
|
15
|
-
@f.set_address(@success)
|
16
|
+
@f.set_address(@success,@from)
|
16
17
|
success,msg= @f.check_mx
|
17
18
|
assert success,"check did not succeed"
|
18
19
|
assert @f.mx!=nil, "mx should be set"
|
@@ -20,21 +21,17 @@ class EmailMXAuthenticationTest < Minitest::Test
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def test_bad_domain
|
23
|
-
@f.set_address('test@baddomainxx23345.com')
|
24
|
+
@f.set_address('test@baddomainxx23345.com',@from)
|
24
25
|
success,msg= @f.check_mx
|
25
26
|
assert !success,"check did not succeed"
|
26
27
|
|
27
28
|
end
|
28
29
|
def test_bad_domain2
|
29
|
-
@f.set_address('test@baddom ainxx23345.com')
|
30
|
+
@f.set_address('test@baddom ainxx23345.com',@from)
|
30
31
|
success,msg= @f.check_mx
|
31
32
|
assert !success,"check did not succeed"
|
32
33
|
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
36
|
|
40
37
|
end
|
data/test/test_smtp.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#uts File.dirname(__FILE__)
|
2
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class EmailSMTPAuthenticationTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@f=EmailAuthentication::Base.new
|
9
|
+
@success='scott.sproule@ficonab.com'
|
10
|
+
@failruntimeerror=[nil,""]
|
11
|
+
@from='scott.sproule@estormtech.com'
|
12
|
+
@success2='info2@paulaner.com.sg'
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_google_mx
|
16
|
+
@f.set_address(@success,@from)
|
17
|
+
success,msg= @f.check(@success,@from)
|
18
|
+
assert success,"check did not succeed"
|
19
|
+
puts msg
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_smtp_mx
|
23
|
+
success,msg= @f.check(@success2,@from)
|
24
|
+
assert success,"check did not succeed"
|
25
|
+
puts msg
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: email-authentication
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Sproule
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
12
|
-
dependencies:
|
11
|
+
date: 2013-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dnsruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
description: Try and authenticate email address, check format, lookup mx record and
|
14
28
|
check smtp connectivity
|
15
29
|
email: scott.sproule@ficonab.com
|
@@ -64,6 +78,7 @@ files:
|
|
64
78
|
- test/test_address.rb
|
65
79
|
- test/test_helper.rb
|
66
80
|
- test/test_mx_records.rb
|
81
|
+
- test/test_smtp.rb
|
67
82
|
- bin/emailcheck.rb
|
68
83
|
- Gemfile
|
69
84
|
- Gemfile.lock
|