View difference between Paste ID: bGC78ysK and HsEsaKMp
SHOW: | | - or go back to the newest paste.
1
import re
2
3
# Taken from http://tfletcher.com/lib/rfc822.py
4
qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
5
dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
6
atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
7
quoted_pair = '\\x5c[\\x00-\\x7f]'
8
domain_literal = "\\x5b(?:%s|%s)*\\x5d" % (dtext, quoted_pair)
9
quoted_string = "\\x22(?:%s|%s)*\\x22" % (qtext, quoted_pair)
10
domain_ref = atom
11
sub_domain = "(?:%s|%s)" % (domain_ref, domain_literal)
12
word = "(?:%s|%s)" % (atom, quoted_string)
13
domain = "%s(?:\\x2e%s)*" % (sub_domain, sub_domain)
14
local_part = "%s(?:\\x2e%s)*" % (word, word)
15
16
# Adding maximum length restrictions
17
addr_spec = "(?=^.{1,256}$)(?=.{1,64}@)%s\\x40%s" % (local_part, domain)
18
19
email_address = re.compile('\A%s\Z' % addr_spec)
20
21
if __name__ == '__main__':
22-
    list_of_good = ['support@onlinesurveys.ac.uk',
22+
    list_of_good = ['somewhere@over.the.rainbow',
23-
                        'SUPPORT@onlinesurveys.ac.uk',
23+
                    'SOMEWHERE@over.the.rainbow',
24-
                        'SUPPORT@ONLINESURVEYS.AC.UK',
24+
                    'SOMEWHERE@OVER.THE.RAINBOW',
25-
                        'foo@example.com',
25+
                    'foo@example.com',
26-
                        'paul@io',
26+
                    'paul@io',
27-
                        'foo@bar.example.com',
27+
                    'foo@bar.example.com',
28-
                        'foo+bar@example.com',
28+
                    'foo+bar@example.com',
29-
                        'foo.bar@example.com',
29+
                    'foo.bar@example.com',
30-
                        'foo.bar@127.0.0.1',
30+
                    'foo.bar@127.0.0.1',
31-
                        'foo_bar@example.com',
31+
                    'foo_bar@example.com',
32-
                        'foo-bar@example.com',
32+
                    'foo-bar@example.com',
33-
                        'cal+henderson@iamcalx.com',
33+
                    'cal+henderson@iamcalx.com',
34-
                        '"cal henderson"@iamcalx.com',
34+
                    '"cal henderson"@iamcalx.com',
35-
                        'cal@[hello world].com',
35+
                    'cal@[hello world].com',
36-
                        '"foo.bar.@.foo.com"@example.com',
36+
                    '"foo.bar.@.foo.com"@example.com',
37-
                        'foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar@example.com']
37+
                    ('foo.bar'*9) + '@example.com']
38
39
    list_of_bad = ['supportonlinesurveys.ac.uk',
40
                   'foo..bar@example.com',
41
                   '.foo@example.com',
42
                   'bar.@example.com',
43
                   'foo bar@example.com',
44
                   'bar@example com',
45
                   'bar@another example.com',
46
                   'foo@bar@test@example.com',
47
                   # Local part can't exceed 64 chars
48-
                   'foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.foo.bar@example.com',
48+
                   ('foo.bar'*10) + '@example.com',
49
                   # Total can't exceed 256
50-
                   'foo.bar.foo.bar.foo.bar.bar@exampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexampleexample.com']
50+
                   'foo.bar.foo.bar.foo.bar.bar@' + ('example'*40)]
51
    
52
    for t in list_of_good:
53
        assert email_address.match(t)
54
    
55
    for t in list_of_bad:
56
        assert email_address.match(t) is None